1. ホーム
  2. python

[解決済み】RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility.

2022-02-05 22:29:58

質問

保存したSVMモデルを読み込もうとすると、このエラーが発生します。sklearn、NumPy、SciPyをアンインストールし、最新版をまとめて再インストール(pipを使用)してみました。それでもこのエラーが出ます。なぜでしょうか?

In [1]: import sklearn; print sklearn.__version__
0.18.1
In [3]: import numpy; print numpy.__version__
1.11.2
In [5]: import scipy; print scipy.__version__
0.18.1
In [7]: import pandas; print pandas.__version__
0.19.1

In [10]: clf = joblib.load('model/trained_model.pkl')
---------------------------------------------------------------------------
RuntimeWarning                            Traceback (most recent call last)
<ipython-input-10-5e5db1331757> in <module>()
----> 1 clf = joblib.load('sentiment_classification/model/trained_model.pkl')

/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/numpy_pickle.pyc in load(filename, mmap_mode)
    573                     return load_compatibility(fobj)
    574
--> 575                 obj = _unpickle(fobj, filename, mmap_mode)
    576
    577     return obj

/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/numpy_pickle.pyc in _unpickle(fobj, filename, mmap_mode)
    505     obj = None
    506     try:
--> 507         obj = unpickler.load()
    508         if unpickler.compat_mode:
    509             warnings.warn("The file '%s' has been generated with a "

/usr/lib/python2.7/pickle.pyc in load(self)
    862             while 1:
    863                 key = read(1)
--> 864                 dispatch[key](self)
    865         except _Stop, stopinst:
    866             return stopinst.value

/usr/lib/python2.7/pickle.pyc in load_global(self)
   1094         module = self.readline()[:-1]
   1095         name = self.readline()[:-1]
-> 1096         klass = self.find_class(module, name)
   1097         self.append(klass)
   1098     dispatch[GLOBAL] = load_global

/usr/lib/python2.7/pickle.pyc in find_class(self, module, name)
   1128     def find_class(self, module, name):
   1129         # Subclasses may override this
-> 1130         __import__(module)
   1131         mod = sys.modules[module]
   1132         klass = getattr(mod, name)

/usr/local/lib/python2.7/dist-packages/sklearn/svm/__init__.py in <module>()
     11 # License: BSD 3 clause (C) INRIA 2010
     12
---> 13 from .classes import SVC, NuSVC, SVR, NuSVR, OneClassSVM, LinearSVC, \
     14         LinearSVR
     15 from .bounds import l1_min_c

/usr/local/lib/python2.7/dist-packages/sklearn/svm/classes.py in <module>()
      2 import numpy as np
      3
----> 4 from .base import _fit_liblinear, BaseSVC, BaseLibSVM
      5 from ..base import BaseEstimator, RegressorMixin
      6 from ..linear_model.base import LinearClassifierMixin, SparseCoefMixin, \

/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py in <module>()
      6 from abc import ABCMeta, abstractmethod
      7
----> 8 from . import libsvm, liblinear
      9 from . import libsvm_sparse
     10 from ..base import BaseEstimator, ClassifierMixin

__init__.pxd in init sklearn.svm.libsvm (sklearn/svm/libsvm.c:10207)()

RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 80

UPDATE OK、以下の方法で こちら そして

pip uninstall -y scipy scikit-learn
pip install --no-binary scipy scikit-learn

エラーは解消されましたが、そもそもなぜ発生したのか、まだわかりません...。

解決方法

によると MAINT: dtype/ufunc サイズの変更に関する Cython 警告を消します。- numpy/numpy :

これらの警告は、scipy(または他の パッケージは、インストールされているものより古い numpy に対してコンパイルされています。

というチェックが Cython によって挿入されます (したがって、Cython でコンパイルされたすべてのモジュールに存在します)。

長くなりましたが これらの警告は、以下のような特殊なケースにおいては無害であるべきです。 numpy{を使用します。 そして のため、これらのメッセージはフィルタリングされます。 numpy 1.8 (このコミットが実行されたブランチ)。一方 scikit-learn 0.18.1 に対してコンパイルされます。 numpy 1.6.1.

これらの警告を自分でフィルタリングするには を実行することができます。 パッチが行うように :

import warnings
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ufunc size changed")

もちろんです。 に対してソースから再コンパイルすることができます。 numpypip install --no-binary :all:¹ 代わりに があれば ボール そのためのツールです。


長くなりましたが、パッチの提案者である クレーム で特にリスクはないはずです。 {コード {コード サードパーティーのパッケージは意図的に古いバージョンに対してビルドされています。

[現在のnumpyに対してすべてをリビルドすることは、] 実現不可能です。 の解決策であり、確かに必要ないはずです。Scipy (他の多くの パッケージは、いくつかのバージョンのnumpyと互換性があります。ですから、私たちが scipyのバイナリを配布する場合、サポートされる最も低いレベルのバイナリに対してビルドします。 numpyのバージョン(現時点では1.5.1)、1.6.x、1.7.x、および numpyマスターも同様です。

本当の正しさは、Cythonで dtypes/ufuncsのサイズがABIを破るような形で変更されました。 それ以外は黙認しています。

その結果、Cythonの開発者は バイナリ互換性を手作業で維持することをnumpyチームに任せることに合意しました。 そのため、ABIが変更されたバージョンを使用すると、特別に作られた例外や、その他の明示的なショーストッパーが発生することが予想されます。


¹ 従来からある {コード オプションは削除されました から numpy.