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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐