RuntimeError: module compiled against API version 0xe but this version of numpy is 0xd

安装完成pytorch,再做验证的时候,有时会收到会这样的错误提示。网上大部分解决办法仅仅是让你升级/降级NumPy。但不告诉我们该升级到什么版本,版本号多少合适。那作为一个喜欢刨根问底的人,就要好好检查一番了。

关于NumPy API version

关于这个NumPy的api version,网上能够找到的内容不多,但是很有用。官方文档介绍存在一个 C_API_VERSION,为了确保ABI的兼容性,这个数字在计算了C API接口的hash,发现要变动的时候就必须加1,这就是“API version 0xe”的含义了。

文档让我们去修改 numpy/core/meson.build 文件中的C_API_VERSION,但是我们没在build或者Release NumPy,代码仓库也根本没这个文件,那怎么办呢?
这个可以看 numpy/ core/ code_generators/ cversions.txt,这个文件在每个维护的分支总都存在,但是mian分支是没有的。例如,这个链接是1.20.x版本的 cversions.txt。

那根据最新的 NumPy 1.26,我们可以得到如下的关系表

API versionNumPy版本
0x6numpy>=1.6,<1.7
0x7numpy>=1.7,<1.8
0x9numpy>=1.8,<1.10
0xanumpy>=1.10,<1.13
0xbnumpy>=1.13,<1.14
0xcnumpy>=1.14,<1.16
0xdnumpy>=1.16,<1.20
0xenumpy>=1.20,<1.22
0xfnumpy>=1.22,<1.23
0x10numpy>=1.23,<1.25
0x11numpy>=1.25,<1.26

其中,numpy 1.25 中c api没有做什么实际的修改,因此理论上跟前面版本0x10是兼容的。

pyTorch 与 NumPy 的 版本对应

(待补充)

pyTorch版本NumPy版本

Tensorflow编译报错 C++ compilation of rule ‘//tensorflow/python:bfloat16_lib’ failed

错误信息:

tensorflow/python/lib/core/bfloat16.cc: In function 'bool tensorflow::{anonymous}::Initialize()':
tensorflow/python/lib/core/bfloat16.cc:636:36: error: no match for call to '(tensorflow::{anonymous}::Initialize()::<lambda(const char*, PyUFuncGenericFunction, const std::array<int, 3>&)>) (const c
har [6], <unresolved overloaded function type>, const std::array<int, 3>&)'
                       compare_types)) {
                                    ^

原因:numpy 1.19.0修改了ABI(见numpy/numpy#15355),Tensorflow1.15 - 2.2 之间的版本,需要将环境限定为numpy<1.19.0。这个问题在tensrflow PR #42533上做了限制。

具体原因请参考:tensrflow issue #40688,嫌长可以看 #41061 。当时numpy release了新版本,然后项目编译的时候就炸了。

这个错误笔者编译 NVIDIA/tensorflow 1.15.4 的时候也曾遇到过,但是当时也没仔细思索,只是做了笔记。按照上面说法,其实底层的C API没有变,变的只是PyUFuncGenericFunction的定义。所以理论上可以靠简单地修改代码来解决这个问题。后来commit 75ea0b31几行代码就把这个问题修复了。

为啥要记录出这么一大段话呢?因为我需要一个Tensorflow1.15和PyTorch打在一起的docker镜像,还要基于ARM64架构,那如何选择、调整PyTorch版本就成了问题。

更多推荐