【debug日记】ModuleNotFoundError: No module named ‘torch._six‘(AI整理)
这是一个典型的的问题。
运行代码报错如下:
/home/xujianxia/anaconda3/bin/conda run -n monai --no-capture-output python /data/xujianxia/LDFC-main/detection/train.py
Traceback (most recent call last):
File "/data/xujianxia/LDFC-main/detection/train.py", line 12, in <module>
from train_utils import train_eval_utils as train_util
File "/data/xujianxia/LDFC-main/detection/train_utils/__init__.py", line 2, in <module>
from .coco_eval import CocoEvaluator
File "/data/xujianxia/LDFC-main/detection/train_utils/coco_eval.py", line 7, in <module>
import torch._six
ModuleNotFoundError: No module named 'torch._six'
ERROR conda.cli.main_run:execute(127): `conda run python /data/xujianxia/LDFC-main/detection/train.py` failed. (See above for error)
这个报错的核心原因是:你当前环境中安装的 PyTorch 版本太新了,而你运行的代码 (LDFC-main) 比较旧,它依赖一个在新版 PyTorch 中已经被移除的模块 torch._six。
这是一个典型的代码与库版本不兼容的问题。
错误原因分析 🧐
-
报错信息:
ModuleNotFoundError: No module named 'torch._six'- 这明确指出,在 PyTorch 库 (
torch) 中找不到一个名为_six的内部模块。
- 这明确指出,在 PyTorch 库 (
-
torch._six是什么?_six模块是 PyTorch 早期版本中内置的一个工具,它的作用类似于一个非常流行的第三方库six。- 它的主要功能是提供兼容性,帮助代码能同时在 Python 2 和 Python 3 环境下运行。例如,它提供了一些方法来处理在两个 Python 版本中不一样的字符串类型或数据结构。
-
为什么会找不到它?
- 随着 Python 2 在 2020 年停止官方支持,绝大多数库都放弃了对 Python 2 的兼容。
- PyTorch 在较新的版本中(大约从 v1.10 开始)为了精简代码和移除历史包袱,彻底删除了
torch._six这个兼容性模块。 - 因此,当你的旧代码
coco_eval.py尝试import torch._six时,在新版的 PyTorch 里自然就找不到了。
解决方案 ✅
方案一:降级 PyTorch 版本
这是最直接、最简单的解决方法。既然代码是为旧版 PyTorch 编写的,那么我们就把环境中的 PyTorch 降级到一个兼容的旧版本。通常,PyTorch 1.9 或 1.8 等版本是比较安全的选择。
操作步骤:
-
激活你的 conda 环境
conda activate monai -
完全卸载当前的 PyTorch
pip uninstall torch torchvision torchaudio -
安装一个兼容的旧版本
你需要根据你服务器的 CUDA 版本来选择正确的安装命令。你可以通过nvidia-smi命令查看 CUDA 版本。-
示例: 假如你的 CUDA 版本是 11.1,你可以安装 PyTorch 1.9.0:
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html -
示例: 假如你的 CUDA 版本是 10.2,你可以安装 PyTorch 1.9.0:
pip install torch==1.9.0+cu102 torchvision==0.10.0+cu102 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
注意:你可以在 PyTorch 官网的历史版本页面 找到适合你 CUDA 环境的精确安装命令。
-
方案二:修改源代码
好的,没有问题。既然您不想修改PyTorch版本,我们来通过修改源代码的方式解决这个问题。
这个方案是完全可行的,因为 torch._six 的作用只是为了兼容旧版的 Python 2,而在您当前只使用 Python 3 的环境下,这些兼容代码完全可以被标准的 Python 3 写法替代。
请按照以下步骤操作:
第一步:定位并打开文件
首先,您需要打开报错信息中提到的那个文件。文件路径是:/data/xujianxia/LDFC-main/detection/train_utils/coco_eval.py
第二步:删除或注释掉错误的导入语句
在 coco_eval.py 文件中,找到第 7 行左右的这句代码:
import torch._six
将这一行直接删除,或者在行首加上 # 将它注释掉,像这样:
# import torch._six
第三步:替换文件中已失效的代码
删除了导入语句后,程序还无法运行,因为文件中的其他地方还在使用 torch._six。我们需要找到这些地方并用现代 Python 3 的语法替换它。
在这个 coco_eval.py 文件中,最常见的用法是 torch._six.string_classes,它被用来判断一个变量是否是字符串类型。
-
在文件中搜索关键词:
torch._six.string_classes -
将其替换为:
str
举例说明,您很可能会在文件中看到类似这样的代码:
# -------------------
# 修改前 (Before modification):
# -------------------
if isinstance(key, torch._six.string_classes):
# ... do something
您需要把它修改为:
# -------------------
# 修改后 (After modification):
# -------------------
if isinstance(key, str):
# ... do something
这里的 str 就是 Python 3 中标准的字符串类型,完全可以替代原来复杂的兼容性写法。
第四步:检查其他可能的用法
为了确保万无一失,请在 coco_eval.py 文件中再搜索一下 torch._six 这个关键词,看看除了 string_classes 之外是否还有其他用法。另一种可能的用法是 torch._six.integer_classes。
- 如果找到
torch._six.integer_classes,请将其替换为int。
总结与操作清单
- ✅ 打开
/data/xujianxia/LDFC-main/detection/train_utils/coco_eval.py文件。 - ✅ 删除或注释掉
import torch._six这一行。 - ✅ 在整个文件中,查找所有的
torch._six.string_classes并全部替换为str。 - ✅ 保存文件。
完成这些修改后,torch._six 相关的兼容性代码就被完全移除了,您的程序应该就能在不降级 PyTorch 的情况下正常运行了。请再次尝试运行您的训练脚本。
更多推荐


所有评论(0)