1 Tensor創建類
1.1 直接創建Tensor,而不是從Python或Numpy中轉換
- 不要使用原生Python或NumPy創建數據,然后將其轉換為
torch.Tensor
直接用torch.Tensor
創建- 或者直接:torch.empty(),? torch.zeros(),? torch.full(),? torch.ones(),? torch.eye(),? torch.randint(),?torch.rand(),?torch.randn()
1.2 直接在GPU中創建,減少.to(device)
ok的:
tensor = torch.rand([10, 5], device=torch.device('cuda:0'))
盡量避免的:
cuda_tensor.cpu()
cuda_tensor.to_device('cpu')
cpu_tensor.cuda()
cpu_tensor.to_device('cuda')
cpu_tensor.to(device)
1.3??使用?torch.from_numpy(numpy_array)
和torch.as_tensor(others)
代替?torch.tensor
torch.tensor()
?會拷貝數據
2 Dataloader類
2.1 pin_memory
Dataloader(dataset, pin_memory=True)
- 在深度學習中,使用GPU進行訓練時經常需要將數據從CPU傳輸到GPU。
- 由于GPU無法直接訪問CPU的可分頁(非固定)內存,這會導致數據傳輸效率不高。
- 可分頁內存是指操作系統可以將其頁(即數據塊)移出到虛擬內存的物理內存。
- 設置
pin_memory=True
的作用是在數據從CPU傳輸到GPU之前,先將數據從可分頁內存轉移到固定內存(也稱為頁面鎖定內存)。- 固定內存是一種特殊類型的內存,操作系統不會將其頁移出到虛擬內存,這樣GPU可以更快地訪問這部分內存。
- 使用固定內存可以避免數據在傳輸過程中的額外拷貝,因此可以加快數據從CPU到GPU的傳輸速度。
3 其他
3.1 torch.backends.cudnn.benchmark
設置為 True
- 在深度學習中,卷積操作是最計算密集的部分之一。NVIDIA 的 cuDNN 庫提供了多種卷積算法,每種算法都適用于不同的硬件和卷積配置(如內核大小、步幅、填充等)
-
當
torch.backends.cudnn.benchmark
設置為False
(默認值)時,PyTorch/cuDNN 會選擇一個合適的、通用的卷積算法來執行操作,而不會根據具體的網絡配置進行優化。-
這種選擇通常比較保守,確保了在大多數情況下的可靠性。
-
-
當設置為
True
時,PyTorch 會在程序第一次執行每種卷積配置時啟用一個自動調優器,這個調優器通過實際運行不同的卷積算法來測試它們的性能。-
然后,它選擇最快的算法,并在后續的訓練過程中使用這一算法。
-
這個“基準測試”過程只在第一次遇到新的卷積配置時進行。
-
-
如果模型的輸入大小(包括批大小、圖像尺寸等)在整個訓練過程中保持不變,開啟
torch.backends.cudnn.benchmark
通常可以帶來性能提升。這是因為一旦為每種卷積配置選擇了最優算法,就不需要再進行調整,每次執行同樣的卷積操作都會使用這一最優算法。
參考內容:mp.weixin.qq.com/s?__biz=MzA4ODUxNjUzMQ==&mid=2247500198&idx=1&sn=0eb717d910f4e8452664ac520679b1e1&chksm=902a737aa75dfa6c3ea3e6fad7c4f4799304ccd4d21277d615e7200266775c8fdf480cb66f5a&scene=126&sessionid=1690516061#rd