PyTorch -运行时错误:[在inline_container.cc:209强制执行失败],文件未找到:archive/data.pkl

qxsslcnc  于 2023-06-23  发布在  Hive
关注(0)|答案(6)|浏览(251)

问题

我尝试使用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

假设

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

版本号

  • PyTorch版本:1.6.0
  • Python版本:3.8.0
suzh9iv8

suzh9iv81#

文件不知怎么被破坏了。再次生成后,它加载没有问题。

3wabscal

3wabscal2#

在我的情况下,我的磁盘驱动器是满的。

pnwntuvh

pnwntuvh3#

我也面临着同样的问题。我直接从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下载文件。现在起作用了

axkjgtzd

axkjgtzd4#

我遇到这个问题不是为一个单一的文件,但一贯对任何文件,我正在处理。看看文件大小,你可以说它们已经损坏,因为它们太小和不完整,但为什么它们总是以这种方式创建呢?
我认为问题是我对我保存的一个简单类做了无害的修改。就像我创建了一个类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 <class '__main__.Foo'>: 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")
huwehgph

huwehgph5#

在我的例子中,这个错误的主要原因是**.pt文件被损坏**。我开始下载文件时,文件仍在创建。
因此,为了避免错误,请将.pt文件复制到另一个目录中,然后从该目录下载.pt文件。

zpqajqem

zpqajqem6#

为什么不试着清理你的磁盘?这可能是最有可能的原因

相关问题