モデルの切り替え

device = torch.device("cuda:0"/"cpu")
model.to(device)
data.to(device)

GPUの特徴

非同期

GPUは並列化処理ができるため、複数のタスクを同時に進めることが可能になります。

https://miro.medium.com/v2/resize:fit:1100/format:webp/0*T6wK4QDVadTLbIl-

It may makes:

  • GPU実行はまだ終わってないのに、end=time.time()は実行された

Warm-upが必須

  • warm-up = dry-on空運転は一回必要

    the main reason for a dry-run is to put your CPU and GPU on maximum performance state

    ベストパフォーマンスに至るまでに計測するのは正確でない

    • e.g. 計算が始まってから少し時間を空けて計測を始める
  • 空運転の方法

    CPU and GPU are very quick to switch to the maximum performance test so just doing a 3000x3000 matrix multiplication

    大規模な行列の掛け算は十分

おすすめの計測方法

torch.cuda.Eventtorch.cuda.synchronize()を利用する

start = torch.cuda.Event(enable_timing=True)
end = torch.cuda.Event(enable_timing=True)

start.record()
# 測定したい部分開始
pred = model(img)
# 測定したい部分終了
end.record()

torch.cuda.synchronize() # CPUとGPUを同期させる
elapsed_time = start.elapsed_time(end)

print(elapsed_time / 1000, 'sec.') #ミリ秒で計測していた

検証結果

間違った計測と正しい計測の結果は3倍差

https://github.com/shu65/pytorch-cuda-time-measurement/blob/main/Pytorch_GPU_Time_Measurement.ipynb

参考文献

https://www.mattari-benkyo-note.com/2021/03/21/pytorch-cuda-time-measurement/

https://towardsdatascience.com/the-correct-way-to-measure-inference-time-of-deep-neural-networks-304a54e5187f