【BUG已解决】ModuleNotFoundError: No module named ‘torch._six‘ 解决方案
【BUG已解决】ModuleNotFoundError: No module named torch._six 解决方案前言本文主要介绍了ModuleNotFoundError: No module named torch._six解决方案希望能对使用 PyTorch 进行深度学习开发的同学们有所帮助。这个报错常见于运行一些较老的开源项目如早期的 Transformers、DeepSpeed 相关代码时因为 PyTorch 版本升级后移除了内部私有模块torch._six。1. 问题描述1.1 完整报错信息Traceback (most recent call last): File train.py, line 15, in module from torch._six import string_classes ModuleNotFoundError: No module named torch._six或在使用某些第三方库时间接触发File /usr/local/lib/python3.10/site-packages/deepspeed/utils/logging.py, line 10, in module from torch._six import inf ModuleNotFoundError: No module named torch._six1.2 具体现象克隆了一个 GitHub 上比较老的深度学习项目按照 README 执行pip install -r requirements.txt运行训练脚本python train.py立刻报No module named torch._six检查发现 requirements.txt 中并没有明确锁定 PyTorch 版本pip 安装了最新版1.3 为什么会出现这个模块缺失torch._six是 PyTorch内部私有模块注意下划线开头意味着不是公开 API它的作用是为了兼容 Python 2 和 Python 3 而封装的一些工具函数类似 Python 官方的six库。随着 Python 2 在 2020 年停止维护PyTorch 团队在PyTorch 2.02023年3月发布中彻底移除了这个不再需要的兼容层模块。任何在 2023 年之前编写、依赖torch._six的代码在 PyTorch 2.0 环境下运行都会报错。2. 原因分析2.1 PyTorch 版本时间线PyTorch 版本发布时间torch._six 状态1.x所有版本2019-2023✅ 存在2.02023年3月❌ 已移除2.12023年10月起❌ 已移除2.2 常见触发场景场景说明老项目 requirements 未锁版本pip 装了最新的 PyTorch 2.x使用较老的 DeepSpeed 版本DeepSpeed 0.9 依赖 torch._six使用较老的 Transformers 版本Transformers 4.30 部分代码依赖Fork 的老项目未更新项目长期未维护兼容性代码过时2.3torch._six中常用的内容# torch._six 提供的常见工具PyTorch 1.x 时代 from torch._six import string_classes # 相当于 str from torch._six import inf # 相当于 float(inf) from torch._six import container_abcs # 相当于 collections.abc这些内容在 Python 3 中都有原生替代所以移除torch._six后正确的做法是改用 Python 标准库的等价实现。3. 解决方案3.1 方案一降级 PyTorch 到 1.x最简单兼容老项目如果只是想让老项目能跑起来最快的方法是降级 PyTorch# 卸载当前版本 pip uninstall torch torchvision torchaudio -y # 安装 1.13.1最后一个稳定的1.x版本 pip install torch1.13.1 torchvision0.14.1 torchaudio0.13.1 # 验证 python -c import torch; print(torch.__version__) # 输出: 1.13.1如果使用 condaconda install pytorch1.13.1 torchvision0.14.1 torchaudio0.13.1 -c pytorch3.2 方案二手动修改代码替换 torch._six 引用如果需要保持 PyTorch 2.x享受新功能和性能提升需要手动修复代码# ❌ 旧代码 from torch._six import string_classes from torch._six import inf from torch._six import container_abcs # ✅ 替换为 string_classes str inf float(inf) import collections.abc as container_abcs批量替换脚本# fix_torch_six.py import os import re def fix_file(filepath): with open(filepath, r, encodingutf-8) as f: content f.read() original content # 替换 string_classes content re.sub( rfrom torch\._six import string_classes, string_classes str, content ) # 替换 inf content re.sub( rfrom torch\._six import inf, inf float(inf), content ) # 替换 container_abcs content re.sub( rfrom torch\._six import container_abcs, import collections.abc as container_abcs, content ) if content ! original: with open(filepath, w, encodingutf-8) as f: f.write(content) print(f已修复: {filepath}) # 遍历项目目录修复所有 .py 文件 for root, dirs, files in os.walk(.): for file in files: if file.endswith(.py): fix_file(os.path.join(root, file))运行脚本python fix_torch_six.py3.3 方案三升级依赖库到支持 PyTorch 2.x 的版本如果报错来自第三方库DeepSpeed、Transformers等优先尝试升级这些库本身# 升级 Transformers pip install --upgrade transformers # 升级 DeepSpeed pip install --upgrade deepspeed # 升级 accelerate pip install --upgrade accelerate新版本的这些库大多已经修复了对torch._six的依赖改用了兼容 PyTorch 2.x 的写法。3.4 方案四创建兼容层 Shim 模块不改动源码的折中方案如果不方便直接修改第三方代码比如通过 pip 安装的库可以创建一个 Shim 模块来伪造torch._six# 在你的项目中创建 torch_six_shim.py import sys import types _six_module types.ModuleType(torch._six) _six_module.string_classes str _six_module.inf float(inf) import collections.abc _six_module.container_abcs collections.abc sys.modules[torch._six] _six_module在主程序最开始导入这个 Shim必须在其他导入之前# main.py import torch_six_shim # 必须放在最前面 import torch from deepspeed import ... # 现在 deepspeed 内部的 torch._six 导入会走 shim3.5 方案五使用虚拟环境隔离保留新旧两个环境# 为老项目创建专用环境 python -m venv old_project_env source old_project_env/bin/activate # macOS/Linux pip install torch1.13.1 # 为新项目保留另一个环境 python -m venv new_project_env source new_project_env/bin/activate pip install torch # 最新版3.6 方案六使用 Docker 固定环境团队协作推荐FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD [python, train.py]4. 排查思路定位是哪个文件报错如果报错栈很深通过第三方库间接触发可以这样定位# 完整运行报错看栈追踪 python train.py 21 | grep -A 3 torch._six输出会显示具体是哪个文件、哪一行触发了这个导入File /usr/local/lib/python3.10/site-packages/deepspeed/utils/logging.py, line 10, in module from torch._six import inf ModuleNotFoundError: No module named torch._six据此可以判断问题出在deepspeed库内部优先尝试升级 deepspeed。5. 各深度学习项目已知兼容情况项目报错版本修复版本DeepSpeed 0.9.0≥ 0.9.0 已修复Transformers 4.29.0≥ 4.29.0 已修复fairseq部分老分支需手动修复或用官方新分支detectron2老版本官方仓库已更新7. 深入理解为什么 PyTorch 要移除这个模块7.1 torch._six 的历史背景six是 Python 社区著名的 Python 2/3 兼容库名字来源于2×36这个梗代表兼容Python 2和Python 3。PyTorch 早期为了同时支持 Python 2.7 和 Python 3.x内部维护了一个精简版的torch._six模块避免引入外部依赖。# torch._six 内部实现大致长这样简化 import sys if sys.version_info[0] 2: string_classes (str, unicode) inf float(inf) else: string_classes (str,) inf float(inf)随着 Python 2 于 2020 年 1 月 1 日正式终止支持EOLPyTorch 团队在 2.0 版本中彻底清理了所有 Python 2 兼容代码torch._six作为遗留产物被一并移除。7.2 为什么不能简单地装回这个模块有用户尝试自己写一个torch._six.py文件放到 site-packages 目录里骗过导入检测# 找到 torch 包路径 python -c import torch; print(torch.__path__) # 手动创建 _six.py不推荐仅作说明 cat $(python -c import torch; print(torch.__path__[0]))/_six.py EOF string_classes str inf float(inf) import collections.abc as container_abcs EOF不推荐这种做法原因每次升级/重装 PyTorch 都会被覆盖丢失团队协作时其他人的环境不会有这个补丁文件违背了官方的模块清理意图可能与未来版本产生更多冲突正确做法应该是使用本文方案二代码内Shim或方案四本地Shim模块。8. 常见问题 FAQ8.1 升级 PyTorch 后又出现新的兼容性问题怎么办AttributeError: module torch has no attribute xxx这类问题通常需要查阅 PyTorch 官方的 Release Notes每个大版本升级都会列出 Breaking Changes。建议按版本号逐步升级如 1.13 → 2.0 → 2.1而不是一次性跳跃多个大版本。8.2 conda 环境和 pip 环境混用导致的困惑# 检查当前实际使用的 torch 来自哪里 python -c import torch; print(torch.__file__) # 如果输出路径包含 conda说明是conda装的 # 如果路径包含 site-packages 但不含conda说明是pip装的 # 混用可能导致版本冲突建议统一用一种方式管理8.3 Docker 镜像中如何避免这个问题直接使用 PyTorch 官方提供的、与你项目需求版本匹配的基础镜像# 查看所有可用标签: https://hub.docker.com/r/pytorch/pytorch/tags FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime # 这样可以确保基础环境版本明确、可重复8.4 如何知道自己的项目具体依赖哪个PyTorch版本范围# 查看项目 requirements.txt 或 setup.py 中的版本约束 grep -i torch requirements.txt # 如果没有明确约束尝试查看项目 README 或者 issue 区 # 搜索关键词 torch version 或 requires torch8.5 使用 pip-tools 锁定完整依赖树避免版本漂移pip install pip-tools # 创建 requirements.in 文件写入宽松版本要求 echo torch1.13,2.0 requirements.in # 编译生成锁定版本的完整依赖清单 pip-compile requirements.in # 团队协作时统一使用锁定的 requirements.txt 安装 pip-sync requirements.txt这样可以避免我这边PyTorch是1.13.1能跑同事那边自动装了1.13.0却报别的错这类版本漂移问题。8.6 老项目长期维护的策略建议对于确实无法轻易升级比如依赖了大量已停止维护的第三方库的老项目建议固定完整的 conda 环境快照通过conda env export environment.yml保存使用 Docker 镜像固化环境避免能跑就不要动的脆弱状态被意外破坏逐步隔离并重构核心逻辑将真正需要长期维护的代码逐步迁移到兼容新版本的实现# 导出完整环境快照 conda env export environment.yml # 在新机器上完整还原 conda env create -f environment.yml8.7 排查清单速查表□ 1. python -c import torch; print(torch.__version__) 确认版本 □ 2. 报错栈追踪具体是哪个第三方库触发的导入 □ 3. 优先尝试升级该第三方库到最新版 □ 4. 如果第三方库长期不维护考虑降级PyTorch或手动Shim □ 5. Docker/conda环境固化避免团队协作版本不一致 □ 6. 逐步淘汰依赖过时代码的老项目9. 总结No module named torch._six排查优先级升级第三方库DeepSpeed/Transformers等→ 最推荐官方已修复降级 PyTorch 到 1.13.1→ 最快但放弃新特性手动替换代码→ 需要一定Python基础但保留新版PyTorchShim 模块→ 无需改动第三方源码的优雅方案Docker 固定环境→ 团队协作长期方案建议如果只是临时跑一下别人的项目优先方案一降级如果是自己维护的长期项目优先方案三升级依赖或方案二手动修复。长期来看紧跟 PyTorch 官方版本更新、及时升级依赖库才是避免此类兼容性问题的根本之道。