RuntimeError: [enforce fail at inline_container.cc:145] . PytorchStreamReader failed reading zip archive: failed finding central directory
原因分析
這個報錯是出現在PyTorch在讀入模型參數時:
checkpoint = torch.load(epoch_15.pth, map_location='cpu')
筆者之前在訓練模型,突然服務器整個停掉,發現竟然是系統固態硬盤沒有空間了,無法繼續操作,故刪了一些不用的文件,繼續開始訓練,然后重新載入之前存在保存的模型就會報錯如上。
既然是在訓練過程中用盡了硬盤空間,那就應該是停在某個大規模讀寫硬盤的過程中,那就肯定是在保存模型的過程中了。即在某一輪訓練完成后,保存模型參數時,占盡了硬盤空間,導致程序停掉。即有可能某一輪在保存模型參數時沒有保存完就停止了,而在重新讀取模型參數時讀到的也是沒有保存完整的模型參數,因此報錯,想了一下只能是這個問題了。
這也與筆者在網上查到的一些資料吻合。
當然,程序突然停止的原因不止磁盤空間不足這一個,也可能是停電、世界末日之類的奇怪原因,但是這些原因很小概率發生在模型保存的過程中,而針對本問題,磁盤空間不足是最有可能、最合理的。比如你的一個模型1GB,磁盤上只有3.5GB了,那么最多在保存第四個模型時,就會發生這里的磁盤空間不足的慘案,導致上述報錯。
對策
如果確定是模型文件不完整的話,那就只好丟棄此文件了,所幸也只是一個文件而已。比如我們在訓練時每5輪保存一次模型,即有epoch_0.pth,epoch_5.pth,… 然后我們發現在加載 epoch_15.pth 時報了這個錯,說明我們在保存 epoch_15.pth 時由于空間不足、停電或者什么亂七八糟的原因程序停止了,沒有完整地保存下 epoch_15.pth。這種情況當前文件應該是救不回來了,因為這相當于我們在把內存中的模型參數數據保存到磁盤上時程序停止了,這時內存中的數據已經丟失了,磁盤上的數據又沒有保存完。所以我們就只好丟棄這個 epoch_15.pth 了,然后從上一次最近的完整保存的模型文件恢復訓練,在本例中就是重新加載 epoch_10.pth 繼續訓練。沒什么大不了的,重新花點時間再訓練就好了。如果你的保存步長更小,比如一輪一保存的話,那影響就更小了。可以直接從 epoch_14.pth 繼續訓練。
Ref:
https://blog.csdn.net/weixin_44831720/article/details/113853623