요즘 딥러닝의 수요가 증가하는 만큼 현업에서는 굉장히 빠른 인퍼런스 속도를 요구합니다. 때문에 밀리초 단위로 평가가 나뉘며 그 속도를 재는 방법이 중요합니다. 하지만 정확한 속도측정을 하기 위해서는 어느정도의 심도있는 이해가 필요합니다.
딥러닝에서의 비동기 처리는 거의 필수라고 볼 수 있다. 예를들어 만약 여러개의 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
torch.cuda.Event
를 통해 starter와 ender을 선언, record()
함수를 통해 시간을 측정한다.torch.cuda.synchronize()
로 현재 작업이 끝나기 전에 비동기 과정이 생기지 않게 한다.