ValueError: numpy.ndarray size changed
このスクラップでの内容を記事として整理しました。
kaggleのノートブックで、 cpprb を import しようとして発生。
(そのノートブック自体は前には実行できていて、kaggle側のコンペライブラリの更新に併せて再度実行しようとして発生)
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject
- cpprb v9.4.4
- numpy 1.18.5
kaggle のノートブックは、 Python 3.7.6
(以下のコードで確認)
import sys
sys.version_info
cpprb 9.4.4 のPython 3.7 向けの wheel は numpy 1.20.0 でビルドしている。これが怪しそう。
類似の事例
Numpy 1.20.0 の リリースノート (長い。。。)
v1.19.5 と v1.20.0 の間のcommit (こっちも長い。。。)
どこかに、 ndarray の実装が変更されてるんじゃないかなぁ。。。
v1.20.0のリリースノートにあった。
Size of
np.ndarray
andnp.void_
changed
The size of thePyArrayObject
andPyVoidScalarObject
structures have
changed. The following header definition has been removed:
#define NPY_SIZEOF_PYARRAYOBJECT (sizeof(PyArrayObject_fields))
since the size must not be considered a compile time constant: it will
change for different runtime versions of NumPy.The most likely relevant use are potential subclasses written in C which
will have to be recompiled and should be updated. Please see the
documentation for :cPyArrayObject
{.interpreted-text role="type"} for
more details and contact the NumPy developers if you are affected by
this change.NumPy will attempt to give a graceful error but a program expecting a
fixed structure size may have undefined behaviour and likely crash.(gh-16938)
読めって書いてある PyArrayObject
のドキュメントってどれのことだろう?
影響があるならNumPy開発者にコンタクトしてとも書いてある。
影響があるならってことだけど、 v1.12.0と一緒にコンパイルしたwheelを古い NumPyと使おうとしてみんなトラブっているから、みんな影響があるのでは?
とりあえず、しばらくは v1.19.5 以下のバージョンでコンパイルした wheel を配布すればよいのかな?
逆方向のバイナリ非互換(旧でコンパイルして、新で使う)も問題になる??
手元のDocker環境でテストした限りでは、
- OK: NumPy 1.19.5 でコンパイル → NumPy 1.20.0 と一緒に使う
- NG: NumPy 1.20.0 でコンパイル → NumPy 1.19.5 と一緒に使う
これなら、しばらくは v1.19.5 以下でビルドして配布しようかな。