Pytorch Inference time 측정

Junshick Yoon·2022년 5월 25일
0

딥러닝 Inference time을 정확히 측정하는 법

요즘 딥러닝의 수요가 증가하는 만큼 현업에서는 굉장히 빠른 인퍼런스 속도를 요구합니다. 때문에 밀리초 단위로 평가가 나뉘며 그 속도를 재는 방법이 중요합니다. 하지만 정확한 속도측정을 하기 위해서는 어느정도의 심도있는 이해가 필요합니다.

Asynchronous execution

딥러닝에서의 비동기 처리는 거의 필수라고 볼 수 있다. 예를들어 만약 여러개의 batch를 인퍼런스 한다고 하자. 첫번째 batch가 GPU에서 forwarding되고 있다고 할 때 이 작업이 다 끝날때까지 CPU에서 모든 과정을 기다리고 있는다면 매우 비효율 적인 과정일 것이다. 때문에 작업과정의 끝나지 않더라도 다음 배치를 preprocessing할 수 있도록 해야 한다. 매우 중요한 기능임에도 불구하고 인퍼런스 시간을 잴 때는 문제점이 생길 수 있다. 만약 파이썬에서 'time'이라는 라이브러리를 사용해 시간을 체크한다면 time메소드 자체는 CPU에서 측정 됨으로 GPU 작업이 끝나지도 않았는데 측정을 종료 할 수 있다.

잘못된 측정 방법

 s = time.time()
 _ = model(dummy_input)
curr_time = (time.time()-s )*1000

올바른 측정 방법

starter, ender = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True)
repetitions = 300
timings=np.zeros((repetitions,1))

for _ in range(10):
    _ = model(dummy_input)
    
# MEASURE PERFORMANCE
with torch.no_grad():
    for rep in range(repetitions):
        starter.record()
        _ = model(dummy_input)
        ender.record()
        # WAIT FOR GPU SYNC
        torch.cuda.synchronize()
        curr_time = starter.elapsed_time(ender)
        timings[rep] = curr_time
  1. torch.cuda.Event를 통해 starter와 ender을 선언, record()함수를 통해 시간을 측정한다.
  2. torch.cuda.synchronize()로 현재 작업이 끝나기 전에 비동기 과정이 생기지 않게 한다.

0개의 댓글