Closed8

ValueError: numpy.ndarray size changed

山田(ymd)山田(ymd)

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
山田(ymd)山田(ymd)

Numpy 1.20.0 の リリースノート (長い。。。)
https://github.com/numpy/numpy/releases/tag/v1.20.0

v1.19.5 と v1.20.0 の間のcommit (こっちも長い。。。)
https://github.com/numpy/numpy/compare/v1.20.0...v1.19.5

どこかに、 ndarray の実装が変更されてるんじゃないかなぁ。。。

山田(ymd)山田(ymd)

v1.20.0のリリースノートにあった。

Size of np.ndarray and np.void_ changed
The size of the PyArrayObject and PyVoidScalarObject 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)

山田(ymd)山田(ymd)

読めって書いてある PyArrayObject のドキュメントってどれのことだろう?

影響があるならNumPy開発者にコンタクトしてとも書いてある。

影響があるならってことだけど、 v1.12.0と一緒にコンパイルしたwheelを古い NumPyと使おうとしてみんなトラブっているから、みんな影響があるのでは?

とりあえず、しばらくは v1.19.5 以下のバージョンでコンパイルした wheel を配布すればよいのかな?
逆方向のバイナリ非互換(旧でコンパイルして、新で使う)も問題になる??

山田(ymd)山田(ymd)

手元のDocker環境でテストした限りでは、

  • OK: NumPy 1.19.5 でコンパイル → NumPy 1.20.0 と一緒に使う
  • NG: NumPy 1.20.0 でコンパイル → NumPy 1.19.5 と一緒に使う

これなら、しばらくは v1.19.5 以下でビルドして配布しようかな。

このスクラップは2021/02/07にクローズされました