PyTorch - RuntimeError: [enforce fail at inline_container.cc:209]。找不到文件:存档/data.pkl

Posted

技术标签:

【中文标题】PyTorch - RuntimeError: [enforce fail at inline_container.cc:209]。找不到文件:存档/data.pkl【英文标题】:PyTorch - RuntimeError: [enforce fail at inline_container.cc:209] . file not found: archive/data.pkl 【发布时间】:2021-01-20 04:02:45 【问题描述】:

问题

我正在尝试使用 PyTorch 加载文件,但错误状态 archive/data.pkl 不存在。

代码

import torch
cachefile = 'cacheddata.pth'
torch.load(cachefile)

输出

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-4-8edf1f27a4bd> in <module>
      1 import torch
      2 cachefile = 'cacheddata.pth'
----> 3 torch.load(cachefile)

~/opt/anaconda3/envs/matching/lib/python3.8/site-packages/torch/serialization.py in load(f, map_location, pickle_module, **pickle_load_args)
    582                     opened_file.seek(orig_position)
    583                     return torch.jit.load(opened_file)
--> 584                 return _load(opened_zipfile, map_location, pickle_module, **pickle_load_args)
    585         return _legacy_load(opened_file, map_location, pickle_module, **pickle_load_args)
    586 

~/opt/anaconda3/envs/matching/lib/python3.8/site-packages/torch/serialization.py in _load(zip_file, map_location, pickle_module, **pickle_load_args)
    837 
    838     # Load the data (which may in turn use `persistent_load` to load tensors)
--> 839     data_file = io.BytesIO(zip_file.get_record('data.pkl'))
    840     unpickler = pickle_module.Unpickler(data_file, **pickle_load_args)
    841     unpickler.persistent_load = persistent_load

RuntimeError: [enforce fail at inline_container.cc:209] . file not found: archive/data.pkl

假设

我猜这与泡菜有关,来自docs:

此保存/加载过程使用最直观的语法并涉及 最少的代码。以这种方式保存模型将保存整个 使用 Python 的 pickle 模块的模块。这种方法的缺点 是序列化的数据绑定到特定的类和 保存模型时使用的确切目录结构。的原因 这是因为 pickle 不保存模型类本身。相当, 它保存包含该类的文件的路径,该路径在 加载时间。因此,您的代码可能会以各种方式中断 用于其他项目或重构后。

版本

PyTorch 版本:1.6.0 Python 版本:3.8.0

【问题讨论】:

【参考方案1】:

原来文件以某种方式损坏。再次生成后,它加载没有问题。

【讨论】:

我遇到这个问题正是因为这个原因:一个常见的原因可能是中断模型训练过程(Ctrl-C,由于时间用完而被作业调度程序杀死等),而你正在写入文件系统。【参考方案2】:

我也遇到了同样的问题。我直接从 GCP AI Platform 上的笔记本下载了使用 GPU 训练的模型 (.pt)。当我通过torch.load('models/model.pt', map_location=device) 将其加载到本地时,出现此错误:

RuntimeError: [enforce fail at inline_container.cc:145] . PytorchStreamReader failed reading zip archive: failed finding central directory`.

我注意到下载文件的大小比预期的要小得多。与@Ian 一样,从笔记本下载时文件已损坏。最后,我不得不先将文件从笔记本传输到 Google Cloud Storage (GCS) 上的存储桶中,而不是直接下载,然后从 GCS 下载文件。现在可以了。

【讨论】:

【参考方案3】:

我不是针对单个文件遇到这个问题,而是在我处理的任何文件上都遇到过这个问题。 查看文件大小,您可以说它们已损坏,因为它们太小且不完整,但为什么它们总是以这种方式创建?

我认为问题在于我对我正在保存的一个简单类进行了无害的修改。所以就像我创建了一个类 Foo,保持数据相同但添加了一些方法,然后当我只有一个较新的类定义 Foo 时尝试保存旧实例。

这是我认为发生的事情的一个例子,但它并没有完全重现它:

class Foo(object):
  def __init__(self):
    self.contents = [1,2,3]
    
torch.save(Foo(), "foo1.pth")

foo1 = torch.load("foo1.pth") # saved with class version 1 of Foo

# some days later the code looks like this
class Foo(object):
  def __init__(self):
    self.contents = [1,2,3]
  def __len__(self):
    return len(self.contents)

foo1 = torch.load("foo1.pth") # still works
torch.save(foo1, "foo2.pth") # try to save version 1 object where class is no longer known

我第一次遇到像PicklingError: Can't pickle &lt;class '__main__.Foo'&gt;: it's not the same object as __main__.Foo 这样的错误,但是当使用 Jupyter Notebook 的自动重载功能时,很难知道到底发生了什么。 通常较旧的类可以毫无问题地加载到较新的类定义中。

无论如何,我的解决方案是加载旧版本并将数据字段手动复制到 Foo 的新实例化版本中,如下所示:

old = torch.load("foo1.pth")
new = Foo()
# new = old # this was the code that caused issues
new.contents = old.contents
torch.save(new, "foo2.pth")

【讨论】:

【参考方案4】:

就我而言,我的磁盘驱动器已满。

【讨论】:

【参考方案5】:

在我的例子中,这个错误的主要原因是 .pt 文件被损坏。当文件还在接受训练时,我开始下载文件。

因此,为了避免错误,请将.pt 文件复制到另一个目录中,然后从该目录下载.pt 文件。

【讨论】:

以上是关于PyTorch - RuntimeError: [enforce fail at inline_container.cc:209]。找不到文件:存档/data.pkl的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch:RuntimeError:输入、输出和索引必须在当前设备上

PyTorch - RuntimeError:后端 CPU 的预期对象,但为参数 #2 'weight' 获得了后端 CUDA

RuntimeError:cuDNN 错误:CUDNN_STATUS_NOT_INITIALIZED 使用 pytorch

PyTorch 模型训练:RuntimeError:cuDNN 错误:CUDNN_STATUS_INTERNAL_ERROR

Pytorch - RuntimeError:尝试第二次向后退,但缓冲区已被释放

RuntimeError:梯度计算所需的变量之一已被就地操作修改:PyTorch 错误