微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PyTorch-RuntimeError:[在inline_container.cc:209强制执行失败]找不到文件:archive / data.pkl

如何解决PyTorch-RuntimeError:[在inline_container.cc:209强制执行失败]找不到文件:archive / data.pkl

问题

我正在尝试使用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,**pickle_load_args)
    585         return _legacy_load(opened_file,**pickle_load_args)
    586 

~/opt/anaconda3/envs/matching/lib/python3.8/site-packages/torch/serialization.py in _load(zip_file,**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

解决方法

我遇到了同样的问题。我直接从 GCP AI Platform 上的笔记本下载了使用 GPU 训练的模型 (from selenium import webdriver driver = webdriver.Edge(executable_path="automation_drivers/msedgedriver.exe") driver.get("https://login.unice.fr/login?service=https://ent.unice.fr/uPortal/Login") usernameElement = driver.find_element_by_id("username") passwordElement = driver.find_element_by_id("password") usernameElement.send_keys("myUsername") passwordElement.send_keys("myPassword") login = driver.find_element_by_name("submit") login.click() mesInfos = driver.find_element_by_xpath("/html/body/table[2]/tbody/tr/td[3]/table/tbody/tr[2]/td[3]/a") mesInfos.click() intracursus = driver.find_element_by_xpath("/html/body/table[3]/tbody/tr/td[2]/span[2]/a[3]") intracursus.click() telechargerReleve = driver.find_element_by_xpath("/html/body/div/div[3]/div[2]/form[1]/input") telechargerReleve.click() )。当我通过 .pt 将其加载到本地时,出现此错误:

torch.load('models/model.pt',map_location=device)

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

,

原来该文件已损坏。再次生成它后,它加载就没有问题了。

,

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

我认为问题在于我对正在保存的简单类进行了无害的修改。所以就像我创建了一个类 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,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")
,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。