DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

升级 PyArrow 21 后,datasets 导入报 PyExtensionType 不存在

旧 datasets 依赖已移除的 Arrow 类型。升级调用方或暂时固定兼容组合,不用类名别名掩盖序列化差异。

导入 datasets 或启动依赖它的训练框架时,程序停在 _ArrayXDExtensionType(pa.PyExtensionType),报 module 'pyarrow' has no attribute 'PyExtensionType'。如果这发生在升级 PyArrow 21 后,要检查已删除的 API,而不是把数据文件当成损坏。

NeMo 等上层框架如果仍锁定 datasets 2.14.4,升级到 PyArrow 21.0.0 后会遇到这个接口冲突。查依赖时要同时检查上层框架的锁定版本,不能只看自己是否直接安装了 datasets。

PyArrow 21.0.0 删除了 PyExtensionType。datasets 在 2023 年 11 月已迁移这个弃用接口,2.14.7 于当月发布;2.14.0 与 2.14.7 的基类差异只是历史对照,不是当前生产环境的推荐锁定组合。5.1.0 的特征实现已经不再引用 PyExtensionType。

不导入 datasets 也能查看安装版本

from importlib.metadata import version
import sys
for package in ("datasets", "pyarrow"):
    print(package, version(package))
print(sys.executable)

这适合 import datasets 已经失败的环境。再查看 traceback 所指的 features.py,确认它确实引用 pa.PyExtensionType。同名异常也可能出现在过老的 PyArrow 中,只有“刚升级至 21、调用方仍使用被移除类”符合本文路径。

优先升级 datasets 或上层训练框架到相互兼容的组合。可以在隔离环境检查历史迁移后的源码与包依赖,再决定生产锁定版本。若上层框架暂时卡住旧 datasets,短期把 PyArrow 固定到仍保留该 API 的兼容版本是一条退路。无法立即升级旧 datasets 时,可以评估将 PyArrow 从 21.0.0 临时回退到 20.0.0;这只是避开被删除接口的兼容退路,不能代替后续依赖升级。例如在你的环境支持该组合的前提下:

python -m pip install 'pyarrow==20.0.0'
python -m pip check

要同时检查 Python 版本、平台 wheel 和其他依赖,不把 20.0.0 当成全环境通用答案。变更应进入锁文件,重启进程后再验证;不要让下次镜像构建又解析到 21。

pa.PyExtensionType = pa.ExtensionType 不是等价迁移。两者的初始化和序列化接口不同,官方 datasets 的修改也包含具体的扩展类型处理。直接替换 site-packages 里的类名,可能把导入错误变成读写数据时的错误。也不要为消除提示打开 pickle 自动反序列化:被移除 API 和信任数据的安全边界是两件事。

环境修复后,除导入检查外,用实际涉及的 Array2D/Array3D 等特征做少量数据写入与重新读取,核对 shape、dtype 和值,再恢复训练。普通字符串列能读取,不代表原来触发扩展类型的样本也正常。