目錄
前言
在實際訓練中遇到了各種各樣的卡住問題,在此總結一下,PyTorch 訓練時遇到的卡住停住等問題可以從以下幾個方面根據情況具體分析 (參考PyTorch訓練時,Dataloader卡死、掛起,跑一個epoch停了,問題解決方案):
- 前一進程還未處理完,又進入下一個導致互鎖:在每個Epoch後,或每個 batch 後暫停一下:
time.sleep(0.003)
; - 內存問題:使用開關,
pin_memory=True/False
- 多進程導致互鎖問題:減少進程數或者不用,
num_workers=0/1
- OpenCV與Pytorch互鎖;
- batch size 的設置;
1. PyTorch 訓練時在第一個 epoch 的最後一個 batch 卡死
- 問題描述
使用 PyTorch 框架訓練模型,訓練第一個 epoch 時,在最後一個 batch 處卡死,卡了一天都沒有動彈,而 CPU 和 GPU 都處於正常運行的狀態,程序也沒有報錯,並且之前訓練一直都是正常的。最終,只能通過 Ctrl+C
強制性暫停。如下圖所示。
- 可能的原因
- 搜索文章發現,有人出現這種問題是和
cv2.imread
有關,用 OpenCV 的接口進行數據讀取,而沒有用 PIL,導致出現 OpenCV與Pytorch互鎖的問題,關閉OpenCV的多線程即可解決問題1 2。 - 但是我們的代碼中並沒有使用 OpenCV,通過 Debug 發現,出現問題的時候,最後一個 batch =1,而我們使用的是四塊 GPU 進行訓練,原因就在此。
- 解決方法
Pytorch 的多 GPU 處理接口是 torch.nn.DataParallel(module, device_ids),具體並行機制可參考:Pytorch多GPU並行處理。
該接口還要求輸入數據的 batch 數量要不小於所指定的 GPU 數量。另根據官網的解釋和註釋 (The batch size should be larger than the number of GPUs used.),batch的數量會均分到每塊GPU上進行處理,因此要保證一個整數的關係。
故,一定要注意在使用多塊 GPU 訓練時,避免出現batch 數量小於所指定的 GPU 數量的情況。
多 GPU 並行訓練中其他比較坑的地方可參考:pytorch多GPU數據並行模式 踩坑指南,和nn.DataParallel說再見。
2. 使用命令行運行時,卡在第一個 epoch
- 問題描述
使用 PyTorch 框架訓練模型,在 Pycharm 裏面可以正常運行,但是在命令行中運行時,在第一個 epoch 處卡死。
- 原因分析
經過定位,發現卡死的地方是PyTorch自帶的 DataLoader 處有問題, 使用batch和 num_works參數的原理可參考此文3,DataLoader的函數定義如下4:
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
num_workers=0, collate_fn=default_collate, pin_memory=False,
drop_last=False)
其中 num_workers 表示使用多進程加載的進程數,0代表不使用多進程,pin_memory 表示是否將數據保存在pin memory區,pin memory中的數據轉到GPU會快一些。
- 解決方法
把 num_workers 改爲 0 即可正常運行,如何設置還是要靠具體實驗。