一般我們都會(huì)使用這種方式一測(cè)試時(shí)間:
# 方式一:
start = time.time()
result = model(input)
end = time.time()
但是正確的應(yīng)該是下邊這種方式二:
# 方式二:
torch.cuda.synchronize()
start = time.time()
result = model(input)
torch.cuda.synchronize()
end = time.time()
為什么是這樣呢?
在pytorch里面埠啃,程序的執(zhí)行都是異步的济竹。如果采用第一種方式,測(cè)試的時(shí)間會(huì)很短冤寿,因?yàn)閳?zhí)行完end=time.time()程序就退出了歹苦,后臺(tái)的cu也因?yàn)閜ython的退出退出了;
如果采用第二種方式督怜,代碼會(huì)同步cu的操作殴瘦,等待gpu上的操作都完成了再繼續(xù)計(jì)算end = time.time()
如果將方式一代碼改為方式三:
# 方式三:
start = time.time()
result = model(input)
print(result) # 或 result.cpu()
end = time.time()
這時(shí)候會(huì)發(fā)現(xiàn)方式三和方式二的時(shí)間是類似的,因?yàn)榉绞饺龝?huì)等待gpu上的結(jié)果執(zhí)行完傳給print函數(shù)号杠,所以此時(shí)間就和方式二同步操作的時(shí)間基本上是一致的了蚪腋。將print(result)換成result.cpu()也可以得到相同的結(jié)果。
torch.cuda.synchronize()
等待當(dāng)前設(shè)備上所有流中的所有核心完成姨蟋。
如果不加syn, forward會(huì)馬上返回屉凯。但加上syn后,cpu會(huì)等待模型實(shí)際運(yùn)行完再獲取數(shù)據(jù).實(shí)際使用時(shí)眼溶,如果不逐段統(tǒng)計(jì)時(shí)間悠砚,可以不加這個(gè)sync
t3= time.time()
output = model(torch_img)
torch.cuda.synchronize()
t4 = time.time()
print(t4-t3)