PytorchStreamReader failed finding central directory:AlexNet 预训练权重先查缓存文件

简介: 该错误表明PyTorch加载预训练AlexNet权重时,本地缓存的`.pth`文件损坏(非完整ZIP格式),常见于下载中断或保存异常。需定位并验证`torch.hub`缓存中的权重文件,检查是否为HTML错误页或截断文件,再备份后重新下载,而非强行修改或跳过校验。(239字)

原帖在创建预训练 AlexNet 时失败,尚未执行 model(batch)。堆栈显示 torch.hub 正在读取本地缓存权重:

RuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory

根据失败时机缩小范围

models.alexnet(pretrained=True) 尚在下载或加载参数,输入图片、batch 尺寸和 GPU 显存还没有参与。先处理它实际读取的权重文件,之后再排查前向。central directory 是 ZIP 存档的目录结构,文件名叫 .pth 并不能保证内容就是完整权重。

这个错误说明当前文件不能按预期的 ZIP 存档读出目录。下载中断、错误页被存成权重、保存中断都是候选原因;仅靠这条消息不能证明是哪一个。

先定位缓存,不要删除整个目录:

from pathlib import Path
import torch
cache = Path(torch.hub.get_dir()) / "checkpoints"
print("josh050608")
print("cache:", cache)
print("alexnet files:", [(p.name, p.stat().st_size) for p in cache.glob("alexnet*")])

将堆栈或下载日志里的确切文件路径赋给 weight_path,只检查该文件:

import zipfile
from pathlib import Path
p = Path(weight_path)
print(p.resolve(), p.stat().st_size)
print("zip:", zipfile.is_zipfile(p))
if zipfile.is_zipfile(p):
    with zipfile.ZipFile(p) as z:
        print("bad entry:", z.testzip())

现代 torch.save 文件通常使用 ZIP;很早的合法权重也可能使用旧格式,所以 is_zipfile=False 不能单独作为损坏结论。结合来源、预期格式、下载大小和官方校验值判断。

若已确认这是失败的自动下载缓存,先将这一个文件改名备份,再通过原来的 torchvision 模型加载入口重新下载。不要靠修改扩展名、切换到 CPU 或设置 map_location 修复缺失的存档内容。网络需要能访问权重官方地址,磁盘也要有足够空间。

重新加载后再执行 model.eval() 与一个 batch 的前向。对于自己训练的唯一 checkpoint,应保留原件,寻找最近一次完整保存,而不是直接删除。

保留损坏证据,只替换确定的缓存项

从堆栈确认 weight_path 后,可以读取文件开头,排除“下载到了 HTML 错误页”这一分支。以下代码承接前面的 p = Path(weight_path),只读取前 80 字节,不尝试执行文件内容:

with p.open("rb") as stream:
    prefix = stream.read(80)
print("size:", p.stat().st_size)
print("prefix:", repr(prefix))

若开头明显是网页、代理错误文本,应修正下载路径或网络后重新获取;若文件比下载日志预期小,怀疑截断,但仍应比较官方来源与校验信息。ZIP 测试可以发现结构或 CRC 异常,无法单独证明权重来自可信来源,也不验证模型结构匹配。

确认是可重新下载的官方缓存项后,可把它改名为带时间的备份,再调用原模型入口。不要同时删除其他模型权重;对于唯一的训练成果,应先找完整备份或上次 checkpoint,重命名扩展名无法补回丢失的数据。

下面用内存存档展示“完整 ZIP”和“尾部丢失”的区别,不生成模型权重,也不碰真实缓存:

import io
import zipfile
buffer = io.BytesIO()
with zipfile.ZipFile(buffer, "w") as archive:
    archive.writestr("example.txt", "synthetic archive")
complete = buffer.getvalue()
truncated = complete[:-22]
print("complete/truncated:", zipfile.is_zipfile(io.BytesIO(complete)),
      zipfile.is_zipfile(io.BytesIO(truncated)))
assert zipfile.is_zipfile(io.BytesIO(complete))
assert not zipfile.is_zipfile(io.BytesIO(truncated))

重新下载后先确认模型构造成功,再准备符合 AlexNet 输入预处理的 batch 做推理。加载错误消失而预测异常,是后续数据或模型使用问题;不要再拿这次 ZIP 报错解释所有失败。较新 torchvision 用 weights 参数选择预训练权重,维护旧代码时先核对实际安装版本,不必为了处理损坏缓存同时升级整个项目。

参考:原始求助帖;技术依据:torch.hub(2.5)、PyTorch 序列化格式(2.5)、Python zipfile。

相关文章
|
2天前
|
存储 PyTorch 算法框架/工具
can't convert a given np.ndarray to a tensor:字符串类别先建立稳定编码
该文详解PyTorch中字符串类别标签转Tensor的常见错误与正确做法:需先构建统一的类别→整数映射(如`class_to_id`),再生成`torch.long`型目标张量;强调训练/验证/推理必须复用同一映射,显式处理未知类别,并校验维度与语义一致性。
|
2天前
|
并行计算 IDE 索引
ModuleNotFoundError: No module named 'tools.nnwrap':先查 pip 为何走到旧版源码构建
Windows下`pip install torch`报`ModuleNotFoundError: No module named 'tools.nnwrap'`,实为pip未匹配到合适wheel而误入源码构建。该`tools`非第三方包,切勿`pip install tools`。应检查Python位数、版本、pip索引及网络,优先使用官方安装命令下载预编译wheel。(239字)
|
2天前
|
机器学习/深度学习 并行计算 Linux
CUBLAS_STATUS_EXECUTION_FAILED when calling cublasSgemm:在首个 Linear 前检查真实特征
该帖描述一维信号CNN在GPU上执行fc1层时触发cuBLAS执行失败错误。重点强调:勿凭空猜测展平维度,应通过打印输入/权重形状、dtype、设备及启用`CUDA_LAUNCH_BLOCKING=1`定位真实首错点,再系统排查设备一致性、内存压力或环境兼容性问题。(239字)
|
2天前
|
PyTorch API 算法框架/工具
Expected 4-dimensional input, got [3,224,224]:单张图片也要保留 batch 维
Inception等PyTorch模型要求输入为`[N,C,H,W]`格式,单张CHW图像(如`[3,224,224]`)需用`unsqueeze(0)`添加batch维,变为`[1,3,224,224]`,不可误拆通道或滥用`view`。注意预处理、设备/类型对齐及输出结构解析。(239字)
|
2天前
|
IDE 开发工具 iOS开发
ModuleNotFoundError: No module named 'torchvision':在失败脚本的解释器里安装匹配包
macOS下运行data.py报“ModuleNotFoundError: No module named 'torchvision'”,常因解释器路径与安装环境不一致所致。torch与torchvision是独立包,需确保二者版本兼容且同在当前Python环境中安装。建议先用`sys.executable`确认实际解释器,再用`importlib.metadata`检查安装状态,最后按官方兼容表安装匹配版本。(239字)
|
2天前
|
机器学习/深度学习 缓存 并行计算
cuDNN error: CUDNN_STATUS_INTERNAL_ERROR:长时间 DQN/LSTM 训练先保留失败前证据
该问题描述在Windows旧nightly版PyTorch上训练DQN/LSTM数小时后触发`CUDNN_STATUS_INTERNAL_ERROR`,非随机性偶发,与deterministic设置无关。需通过步级监控内存、输入状态与CUDA上下文,定位累积资源异常或特定批次触发点,强调小复现、进程隔离与对照实验,而非简单调参。
|
2天前
|
索引
IndexError: index out of range in self:BERT 先查 token ID 与 embedding 表大小
该文详解 `IndexError: index out of range in self` 在 `F.embedding` 中的根因:token ID 越界。强调优先检查输入 ID 范围、嵌入表行数(`num_embeddings`)、位置/类型表限制,而非误调标签;指出 tokenizer 与模型需配套,新增 special tokens 必须调用 `resize_token_embeddings()` 并同步保存,禁用取模等掩盖语义的错误修复。(239字)
|
2天前
|
并行计算 PyTorch 算法框架/工具
nll_loss_forward_reduce_cuda_kernel_2d_index not implemented for Int:类别标签要用 int64
PyTorch中CrossEntropyLoss报错“not implemented for 'Int'”,主因是标签为int32(torch.int32),而该损失要求long(int64)。需显式转换:`labels = labels.to(device, dtype=torch.long)`,并验证范围与维度。数据集入口统一转int64更稳妥。(239字)
|
2天前
|
并行计算 Linux Shell
cudaGetDeviceCount Error 804:检查 forward compatibility 库是否适用于当前 GPU
该问题源于CUDA“前向兼容性”机制冲突:宿主机驱动较新,而容器内预置的`/usr/local/cuda/compat`兼容库不支持当前GPU硬件,导致`cudaGetDeviceCount()`触发Error 804。需检查`LD_LIBRARY_PATH`、确认libcuda实际加载源,并依NVIDIA兼容矩阵调整方案。(239字)
|
2天前
|
机器学习/深度学习 并行计算 PyTorch
CUDA error: an illegal memory access was encountered:LSTM 分配 hidden 的行可能只是后续报错点
原帖在验证阶段创建LSTM hidden状态时触发CUDA非法内存访问错误。该异步报错常掩盖真实越界位置,需设`CUDA_LAUNCH_BLOCKING=1`定位首个失败操作,并通过输入派生`h0/c0`避免设备不一致,辅以CPU批次快照与小规模复现排查根因。(239字)

热门文章

最新文章