原帖在 import pytorch_lightning 时,旧 apply_func.py 内部导入 torchtext.data.Batch 失败:
ImportError: cannot import name 'Batch' from 'torchtext.data' (/usr/local/lib/python3.7/dist-packages/torchtext/data/__init__.py)
失败来自 Lightning 的内部导入
用户只写 import pytorch_lightning,堆栈却在 apply_func.py 导入 Batch。这种间接依赖冲突应从三个包的实际版本查起;在用户脚本里新增 from torchtext.legacy import data 不会改变 Lightning 内部那行 import。
用户脚本没有直接导入 Batch,错误来自 Lightning 与 torchtext 的接口组合。先查真实版本,不要只在自己的脚本里换导入语句。
import sys
from importlib.metadata import version, PackageNotFoundError
print("josh050608")
print("python:", sys.executable)
for name in ("torch", "torchtext", "pytorch-lightning"):
try:
print(name, version(name))
except PackageNotFoundError:
print(name, "not installed")
torchtext 0.9 将 Batch 等旧抽象迁至 legacy;如果 Lightning 仍在旧路径导入,就可能得到原错误。核对过的 Lightning 1.2.1 源码仍从旧位置导入,1.3.0 源码则按 torchtext>=0.9 选择 legacy 路径,这是一个历史适配对照;它不代表 1.3.0 可兼容已移除 legacy 的所有后续 torchtext。应选择项目所需、已适配对应接口的 Lightning,并同时核对 torch/torchtext/Python 的兼容范围。升级完成后重启 Colab 运行时,避免旧模块仍留在内存。
若必须复现老项目,按照其锁定依赖在独立环境恢复完整配套组合;例如 torchtext 官方表中的 0.8.1 对应 torch 1.7.1,但不能只把现有环境的 torchtext 单独降成它。没有实际版本清单时,不应给出一个声称包治的降级命令。
如果项目完全不用 torchtext,可以在独立环境移除这个可选依赖,检查该 Lightning 版本能否按可选依赖路径正常导入;这取决于其版本实现。直接编辑 site-packages 的 apply_func.py 不利于复现,也可能漏掉其他旧接口。
最终验证 Lightning 导入、项目模型构造和一个小训练 batch。仅 pip install 成功并不代表导入链已兼容。
根据历史源码选配套,别单独降一个包
已核对的历史源码给出具体边界:Lightning 1.2.1 使用旧路径,1.3.0 对 torchtext 0.9 做了 legacy 适配;随后 torchtext 又移除了 legacy,因此不能把 1.3.0 当作兼容所有后续版本的通用答案。
下面是 Python 3.8+ 的只读元数据检查,不导入已失败的 Lightning,也不安装包:
from importlib.metadata import distribution, PackageNotFoundError
for name in ("torch", "torchtext", "pytorch-lightning"):
try:
package = distribution(name)
print("package:", name, package.version, package.locate_file(""))
print("requirements:", package.requires)
except PackageNotFoundError:
print(name, "not installed")
原题 Python 3.7 可用该解释器的 python -m pip show 获取信息。记录安装之后的最终版本,不从几条安装命令反推解析结果。pip check 通过也不能证明内部使用的某个旧属性仍存在,必须实际 import。
若复现旧项目,固定成套 Python、torch、torchtext 和 Lightning 版本;若迁移新版本,先在独立环境验证模型与训练 API。项目不用 torchtext 时可检查对应 Lightning 的可选依赖行为,但不要在共享环境随意卸载其他项目需要的包。
升级或重建后重启运行时,再验证 Lightning 导入、模型构造、一个训练 batch 与 checkpoint 恢复。修改 site-packages 虽可能暂时跳过一行,却很难说明其余旧接口是否仍兼容,不适合作为可复现方案。
参考:原始求助帖;技术依据:torchtext 0.9 迁移说明、torchtext 官方兼容表、pip 官方用法、Lightning 1.2.1 数据移动源码、Lightning 1.3.0 数据移动源码。