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개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN