原帖在 PyTorch 1.6 的 torch.load 中失败,ZIP 读取器找不到预期的数据记录:
RuntimeError: [enforce fail at inline_container.cc:209] . file not found: archive/data.pkl
能打开 ZIP,不代表它就是 torch.save 文件
原题缺少保存端代码,cacheddata.pth 这个名字不足以确定格式。先看存档记录,再回到生成 API:普通 ZIP、TorchScript、NumPy 和 torch.save 的加载入口不同。空建 data.pkl 只能制造另一层错误,无法补出原对象。
这与“模型类路径变了”不是同一个判断。当前错误发生在读取存档记录阶段,先检查文件是不是完整 torch.save 存档,或根本是另一种缓存格式。
不执行 pickle,先查看文件信息与 ZIP 目录:
from pathlib import Path
import zipfile
p = Path("cacheddata.pth")
print("josh050608")
print("path/bytes:", p.resolve(), p.stat().st_size)
print("zip:", zipfile.is_zipfile(p))
if zipfile.is_zipfile(p):
with zipfile.ZipFile(p) as z:
print("entries:", z.namelist()[:20])
print("bad entry:", z.testzip())
现代 torch.save 的 ZIP 通常含某个根目录下的 data.pkl,以及版本和张量存储记录;根目录名不一定永远叫 archive。找不到对应记录可能是文件不完整、格式不匹配或生成流程不同,原帖没有展示保存端,不能确认哪一个。
回到生成 cacheddata.pth 的代码,区分 torch.save、torch.jit.save、NumPy、普通 pickle 或其他容器。按保存 API 选择相应加载器;改后缀不会改变格式。如果确认传输中断,应保留原件并重新取得完整文件或从上游重新生成缓存。
不要手工往 ZIP 塞一个空 data.pkl,也不要把 strict=False、map_location 当成修复文件结构的办法。完整模型的类路径问题可能在更后面出现,应先通过这一层检查。
验证文件大小/校验值与源文件一致,再用对应版本和加载器在 CPU 上读取,核对返回类型、键与张量形状。
用内存文件检查记录结构
下面展示当前 torch.save 存档里如何检查 data.pkl,根目录名不写死为 archive。代码不加载未知 pickle,也不修改真实 cacheddata.pth:
import io
import zipfile
import torch
buffer = io.BytesIO()
torch.save({
"features": torch.arange(6).reshape(2, 3)}, buffer)
buffer.seek(0)
with zipfile.ZipFile(buffer) as archive:
names = archive.namelist()
payload_names = [name for name in names if name.endswith("/data.pkl") or name == "data.pkl"]
assert len(payload_names) == 1
assert archive.testzip() is None
print("data record:", payload_names)
print("record count:", len(names))
该例说明当前格式的检查思路,不能用来断言所有历史 torch 文件都必须是 ZIP。真实文件若是旧格式,应使用对应版本和官方加载路径核对;若来自另一框架或缓存工具,追溯保存代码后再选加载器。
| 证据 | 下一步 |
|---|---|
| 与源文件大小或校验值不一致 | 保留原件,重新传输完整文件 |
| ZIP 完整但结构不是 torch.save | 核对生成工具与正确加载 API |
| 保存端确是 torch.save,缺关键记录 | 查保存/复制是否中断,寻找完整备份 |
| 文件结构通过,之后才报对象类路径错误 | 再处理反序列化环境,不混为本次记录缺失 |
验收应从文件一致性、正确加载器、返回对象类型到张量形状依次确认。map_location 解决设备映射,strict=False 处理参数键匹配,它们都不会恢复缺失的存档内容。
参考:原始求助帖;技术依据:PyTorch 序列化格式(2.5)、torch.load(2.5)、Python zipfile。