RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility
I have this error for trying to load a saved SVM model. I have tried uninstalling sklearn, NumPy and SciPy, reinstalling the latest versions all-together again (using pip). I am still getting this error. Why?
In : import sklearn; print sklearn.__version__ 0.18.1 In : import numpy; print numpy.__version__ 1.11.2 In : import scipy; print scipy.__version__ 0.18.1 In : import pandas; print pandas.__version__ 0.19.1 In : 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, by following here, and
pip uninstall -y scipy scikit-learn pip install --no-binary scipy scikit-learn
The error has now gone, though I still have no idea why it occurred in the first place...
These warnings are visible whenever you import scipy (or another package) that was compiled against an older numpy than is installed.
and the checks are inserted by Cython (hence are present in any module compiled with it).
Long story short, these warnings should be benign in the particular case of
numpy , and these messages are filtered out since
numpy 1.8 (the branch this commit went onto). While
scikit-learn 0.18.1 is compiled against
To filter these warnings yourself , you can do the same as the patch does:
import warnings warnings.filterwarnings("ignore", message="numpy.dtype size changed") warnings.filterwarnings("ignore", message="numpy.ufunc size changed")
Of course, you can just recompile all affected modules from source against your local
pip install --no-binary :all:¹ instead if you have the
balls tools for that.
Longer story: the patch's proponent claims there should be no risk specifically with
numpy, and 3rd-party packages are intentionally built against older versions:
[Rebuilding everything against current numpy is] not a feasible solution, and certainly shouldn't be necessary. Scipy (as many other packages) is compatible with a number of versions of numpy. So when we distribute scipy binaries, we build them against the lowest supported numpy version (1.5.1 as of now) and they work with 1.6.x, 1.7.x and numpy master as well.
The real correct would be for Cython only to issue warnings when the size of dtypes/ufuncs has changes in a way that breaks the ABI, and be silent otherwise.
As a result, Cython's devs agreed to trust the numpy team with maintaining binary compatibility by hand, so we can probably expect that using versions with breaking ABI changes would yield a specially-crafted exception or some other explicit show-stopper.
¹The previously available
--no-use-wheel option has been removed since