Bug: NameError: name ‘nn’ is not defined in transformers/integrations/accelerate.py

该报错通常出现在 PyTorch 版本低于 Transformers 当前要求(Issue 中为 2.6)时,加载 ViT 等模型会触发 transformers/integrations/accelerate.py 中 nn 未导入的 NameError;优先排查 PyTorch 版本是否过低。

快速结论:该报错通常出现在 PyTorch 版本低于 Transformers 当前要求(Issue 中为 2.6)时,加载 ViT 等模型会触发 transformers/integrations/accelerate.py 中 nn 未导入的 NameError;优先排查 PyTorch 版本是否过低。

适用环境:OS: Windows;Python 3.11;PyTorch 2.5.1+cu121(CPU 环境亦可复现);Transformers 4.38.2。

最快修复方案:暂无确认的一步修复方案。Issue 最终以“Torch 版本过旧”关闭,可优先尝试将 PyTorch 升级到满足当前 Transformers 要求的版本(Issue 中提到的要求为 2.6 及以上)。

注意事项:评论中验证过:仅在 integrations/accelerate.py 加入 from __future__ import annotations 可以消除该文件的 NameError,但直接导入 transformers.models.vit.modeling_vit 时仍会在 distributed/pipeline_parallel.py 中因 nn.Identity 在导入期被求值而失败,因此该补丁不能作为完整修复。Issue 未合并修复代码,升级版本前请自行验证。

问题场景

用户在 Windows + Python 3.11 + PyTorch 2.5.1+cu121 + Transformers 4.38.2 环境下加载 ViT 类模型(Issue 复现路径为直接导入 transformers.models.vit.modeling_vit,实际发生在 TripoSR 的 venv 中),在导入阶段因 nn 未定义而崩溃。

报错原文

Traceback (most recent call last):
  File "...\transformers\models\vit\modeling_vit.py", line 23, in <module>
    from ...activations import ACT2FN
  ...
  File "...\transformers\integrations\accelerate.py", line 65, in <module>
    ) -> tuple[int, list[str], list[nn.Module]]:
                                       ^^
NameError: name 'nn' is not defined

原因分析

可能原因:Issue 中报告者使用 PyTorch 2.5.1,低于当前 Transformers 要求的 2.6。评论分析指出,此时 is_torch_available() 返回 False,nn 不会被导入;但 accelerate.py 第 65 行的类型注解 list[nn.Module] 在模块导入时仍会被求值,于是抛出 NameError。

此外,评论还指出存在第二个独立问题:distributed/pipeline_parallel.py 中 class PipelineIdentityLayer(nn.Identity) 在导入期就需要 nn,所以只修 accelerate.py 不足以让直接导入 modeling_vit 的路径正常工作。正常路径 from transformers import ViTModel 会抛出 ImportError,但提示文案称“未找到 PyTorch”,与实际“PyTorch 已安装但版本过旧”不符,容易误导排查。

环境排查

  • 确认 PyTorch 版本是否满足当前 Transformers 要求(Issue 中要求为 2.6 及以上)。
  • 确认 Python 版本(Issue 为 3.11)。
  • 确认 Transformers 版本(Issue 为 4.38.2)。
  • 确认是否通过直接导入 transformers.models.vit.modeling_vit 等底层模块触发,而非走 from transformers import ViTModel 的正常入口。
  • CUDA 版本在 Issue 中仅为 2.5.1+cu121 的附带信息,未单独验证对报错的影响。

解决步骤

  1. 先检查当前环境的 PyTorch 版本,与 Transformers 要求的版本(Issue 中为 2.6)对比。
  2. 如低于要求,可优先尝试升级 PyTorch 到满足要求的版本,再重新加载模型。
  3. 升级后如仍触发导入期 NameError,再排查是否绕过正常入口直接导入了 modeling_vit 等底层模块。
  4. Issue 中提到的两类代码改动(在 accelerate.py 加入 from __future__ import annotations、改进旧版 PyTorch 的错误提示)仅处于讨论和复现阶段,未合并,不建议作为生产环境修复依据。

验证方法

在升级 PyTorch 后,重新执行原复现路径:走正常入口 from transformers import ViTModel 应能正常导入;如仍直接导入 transformers.models.vit.modeling_vit,需确认不再出现 NameError: name 'nn' is not defined。

参考来源

huggingface/transformers #50026

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 30745

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注