tensorflow、pytorch与numpy的版本对应关系
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 version | NumPy版本 |
|---|---|
| 0x6 | numpy>=1.6,<1.7 |
| 0x7 | numpy>=1.7,<1.8 |
| 0x9 | numpy>=1.8,<1.10 |
| 0xa | numpy>=1.10,<1.13 |
| 0xb | numpy>=1.13,<1.14 |
| 0xc | numpy>=1.14,<1.16 |
| 0xd | numpy>=1.16,<1.20 |
| 0xe | numpy>=1.20,<1.22 |
| 0xf | numpy>=1.22,<1.23 |
| 0x10 | numpy>=1.23,<1.25 |
| 0x11 | numpy>=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版本就成了问题。
更多推荐


所有评论(0)