딥러닝이 일상 생활에서 사용되려면 기본적으로 굉장히 빠른 인퍼런스 속도를 갖춰야 합니다. 때문에 millisecond 단위로 속도를 재고 평가해주어야 합니다.
▶Asynchronous execution
딥러닝은 비동기 방식으로 작동하기 때문에 높은 효율성을 갖습니다. 그렇다면 왜 비동기 방식으로 작동할까요?
=> 먼저, 여러 개의 batch를 inference 하는 상황을 생각해보겠습니다. 첫번째 batch가 GPU에서 연산이 되고 있을 때, GPU의 작업이 다 끝날때까지 CPU는 어떻게 동작해야 할까요? 마냥 기다리기만 한다면 이는 매우 비효율적일 것입니다. 때문에 CPU는 GPU의 작업이 모두 끝나지 않더라도 다음 batch 를 위한 작업을 해둬야 합니다.
바로 이점 때문에! 딥러닝 모델의 GPU inference time을 재는 방법은 조금 생소합니다. python에서 제공하는 'time' 라이브러리를 사용해 시간을 체크한다면 정확한 측정이 어렵습니다. time메소드 자체는 CPU에서 측정되기 때문에 GPU 작업이 끝나는 시간이 무시되기 때문입니다.
- 잘못된 측정 방법
inference_time = time.time()
output = model(data)
cur_time = (time.time()-inference_time)*1000
▶ Inference Time Check
정확한 측정을 위해서는 pytorch에서 제공해 주는 torch.cuda.Event()를 이용해주어야 합니다. 정확한 과정은 아래와 같습니다.
- torch.cuda.Event를 통해 start와 end를 선언하고, record()함수를 통해 시간을 측정해줍니다.
2. torch.cuda.synchronize() 함수를 이용해 현재 작업이 끝나기 전에 비동기 작업이 생기지 않게 작업해줍니다.
코드는 아래와 같이 작성하면 됩니다!
start = torch.cuda.Event(enable_timing=True)
end = torch.cuda.Event(enable_timing=True)
start.record()
z = x + y
end.record()
# Waits for everything to finish running
torch.cuda.synchronize()
print(start.elapsed_time(end))
** CPU time을 측정하고 싶다면 가장 위의 time 모듈을 이용하면 됩니다!
'Pytorch' 카테고리의 다른 글
[Pytorch] 메모리 효율적으로 사용하기 (3) | 2024.08.30 |
---|---|
[Pytorch] loss nan 해결하기 (0) | 2023.02.24 |
[Pytorch] Tensor Manipulation (0) | 2023.02.24 |
[Pytorch] TorchVision Fine Tuning (0) | 2023.02.05 |
[Pytorch] torch.nn 과 torch.nn.functional (0) | 2023.02.05 |