数据集加载时报错file not found: archive/data.pkl,很多开源数据集缓存逻辑会把缓存文件命名为 cacheddata.pth,但代码内部逻辑却试图从压缩包 archive 里读取 data.pkl;高频根源是混淆了两种缓存范式:一部分代码直接用 pickle 保存单独的 data.pkl,另一套是用 torch.save 打包成 cacheddata.pth,二者后缀、序列化方式、内部结构完全不一样,直接混用就会去找不存在的 archive/data.pkl。cacheddata.pth 本身是 torch 的序列化文件,里面不一定包含一个叫 data.pkl 的子文件,它不是 zip/tar 压缩包,不能用读取压缩包内部文件的方式去访问;很多数据集脚本在缓存分支写死了从 archive 读取 pkl,当缓存开关打开、生成 cacheddata.pth 之后,代码分支没有切换加载逻辑,依旧尝试解压读取 archive/data.pkl,触发文件不存在报错。
报错基础信息清单
- 报错原文:file not found: archive/data.pkl
- 典型场景:数据集缓存、torchvision 自定义数据集、LM / 分割数据集预加载缓存
- 核心混淆点:cacheddata.pth ≠ 包含 data.pkl 的压缩包
- 格式区分:
- data.pkl:pickle 原生序列化文件
- cacheddata.pth:torch.save 序列化,本质是包含字典 / 对象的单文件,不是归档包
- 快速校验命令
判断是不是压缩包
file cacheddata.pth
读取torch缓存内容
python -c "import torch; data=torch.load('cacheddata.pth'); print(type(data))"
分步排查流程
- 确认当前代码分支:是否开启 use_cache,开启后是否走 cacheddata.pth 加载分支,还是仍然走 archive 解压分支
- 检查 cacheddata.pth 是真实存在,还是代码误以为它是压缩包
- 如果file命令显示 data、binary,就是 torch 序列化文件,不是 zip/tar
- 如果是 zip/tar,才可以读取内部 archive/data.pkl
- 分支修复思路
- 缓存开启:直接 torch.load 加载 cacheddata.pth,不要调用 zipfile/tarfile 去读取内部 data.pkl
- 缓存关闭:走原始解压逻辑,读取 archive 包内 data.pkl
- 缓存重建方案:缓存文件损坏、版本不匹配时,删除 cacheddata.pth,关闭 use_cache,重新从原始 archive 解压生成 data.pkl,再重新生成缓存
rm cacheddata.pth
- SLURM/NFS 额外注意:多进程同时生成缓存会出现半写坏文件,建议加文件锁或者单进程预生成缓存
高频踩坑误区
- 看到后缀 pth,误以为是压缩归档包,用 zip/tar 接口去读内部的 data.pkl
- 缓存开关变量写反,use_cache=True 但代码仍然执行解压分支
- 跨 Python 版本加载 pickle 缓存:即使读到文件,也会触发 pickle 协议报错,和本报错属于连锁问题
- 缓存路径硬编码:archive 目录和缓存文件不在同一个目录,路径相对位置错乱
【相关 FAQ】
问题 1:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,cacheddata.pth 是不是压缩包?
回答 1:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,cacheddata.pth 一般是 torch.save 生成的单序列化文件,不是 zip/tar 压缩包,里面没有 archive/data.pkl 这个子文件。
问题 2:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,什么时候才会存在 archive/data.pkl?
回答 2:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,原始归档包(zip/tar)内部才会带有 data.pkl,对应不开启缓存、走解压加载的分支;开启缓存后应该直接加载 cacheddata.pth。
问题 3:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,怎么快速修复这个报错?
回答 3:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,检查 use_cache 分支:开启缓存就用 torch.load 读 cacheddata.pth;关闭缓存才走解压 archive 读取 data.pkl,分支逻辑不要混用。
问题 4:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,cacheddata.pth 损坏怎么重建?
回答 4:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,直接删除 cacheddata.pth,关闭缓存,脚本会重新解压原始 archive 生成 data.pkl,再重新生成缓存文件。
【参考资料】
[2024-08](Dataset cache pth vs pkl archive error)GitHub dataset repo issue
[2024-05](torch.save/pickle 序列化格式区别)PyTorch 论坛
[2024-09](自定义数据集缓存分支编写规范)torchvision 文档
[2023-12](多进程数据集缓存竞态踩坑)Stack Overflow
[2024-02](file 命令识别二进制文件类型)Linux man page
【免责声明】
本文为数据集缓存加载报错排错笔记,不同开源项目的缓存命名、目录结构、分支逻辑差异较大,部分项目自定义 pth 也可以是压缩包,以项目源码逻辑为准;本文仅技术问题解读,不构成生产数据集加载方案担保。
本文来自作者[瞬态捕帧人]投稿,不代表乌兰科技网立场,如若转载,请注明出处:https://www.wlcbnews.com/rgzn/202611/548.html
评论列表(4条)
我是乌兰科技网的签约作者“瞬态捕帧人”!
希望本篇文章《报错 file not found archive/data.pkl,优先核查 cacheddata.pth 真实存储格式,区分 pkl 与 torch 序列化》能对你有所帮助!
本站[乌兰科技网]内容主要涵盖:互联网行业的追踪与探索
本文概览:数据集加载时报错file not found: archive data.pkl,很多开源数据集缓存逻辑会把缓存文件命名为 cacheddata.pth,但代码内部逻辑却试图从压缩包 archive 里读取 data.pkl;高频根源是混淆了两种缓存范式:一部分代码直接用 pickle 保存单独的 data.pkl,另一套是用 torch.save 打包成 cacheddata.pth,二者后缀、序列化方式、内部结构完全不一样,直接混用就会去找不存在的 archive data.pkl。cacheddata.pth 本身是 torch 的序列化文件,里面不一定包含一个叫 data.pkl 的子文件,它不是 zip tar 压缩包,不能用读取压缩包内部文件的方式去访问;很多数据集脚本在缓存分支写死了从 archive 读取 pkl,当缓存开关打开、生成 cacheddata.pth 之后,代码分支没有切换加载逻辑,依旧尝试解压读取 archive data.pkl,触发文件不存在报错。