正確測試代碼在cuda運行時間,需要加上torch.cuda.synchronize()
,使用該操作來等待GPU全部執行結束,CPU纔可以讀取時間信息。
兩種測試時間的方式
第一種:
start = time.time()
result = model(input)
end = time.time()
第二種:
torch.cuda.synchronize() #增加同步操作
start = time.time()
result = model(input)
torch.cuda.synchronize() #增加同步操作
end = time.time()
一共上述兩種測試時間的方式,正確的方式是第二種,爲什麼是這樣呢?在pytorch裏面,程序的執行都是異步的。如果採用第一種方式,測試的時間會很短,因爲執行完end=time.time()程序就退出了,後臺的cuda也因爲python的退出退出了,如果採用第二種方式,代碼會同步cuda的操作,等待gpu上的操作都完成了再繼續運行end = time.time() .
但是,如果將第一段代碼改爲
start = time.time()
result = model(input)
print(result) #增加print
end = time.time()
這時候會發現第三種方法和第二種方法的時間是差不多的,這是因爲第三段代碼會等待gpu上的結果執行完傳給print函數,所以時間就和第二段同步操作的時間基本上是一致的了,將print(result)換成result.cpu()結果是一致的了。