RuntimeWarning: el tamaño de numpy.dtype cambió, puede indicar incompatibilidad binaria

148

Tengo este error al intentar cargar un modelo SVM guardado. He intentado desinstalar sklearn, NumPy y SciPy, reinstalando las últimas versiones completamente juntas (usando pip). Todavía recibo este error. ¿Por qué?

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

ACTUALIZACIÓN: OK, siguiendo aquí , y

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

El error ahora se ha ido, aunque todavía no tengo idea de por qué ocurrió ...

Blue482
fuente
3
--no-use-wheelrecompila el módulo desde la fuente contra lo que tenga en su sistema.
ivan_pozdeev
17
En versiones más recientes de pip, este comando ha sido renombrado --no-binary.
s_kirkiles
1
Sí, esto funcionó para mí: pip install --no-binary :all: pandas. FWIW Estaba recibiendo este error en una nueva versión de VE sobre la versión de Python Python 3.6.6 :: Anaconda, Inc.con solo requestse pandasinstalado en el entorno.
safay
Debería arreglarse ahora en cython 0.29, como se comenta a continuación
mattip
También necesita instalar gfortranScipy para compilar:sudo apt install gfortran
ma3oun

Respuestas:

145

Según MAINT: silencia las advertencias de Cython sobre los cambios en el tamaño dtype / ufunc. - numpy / numpy :

Estas advertencias son visibles cada vez que importa scipy (u otro paquete) que se compiló contra un numpy anterior al que está instalado.

y Cython inserta las comprobaciones (por lo tanto, están presentes en cualquier módulo compilado con él).

En pocas palabras, estas advertencias deben ser benignas en el caso particular denumpy , y estos mensajes se filtran desdenumpy 1.8 (la rama a la que se envió este compromiso). Mientras scikit-learn 0.18.1se compila contranumpy 1.6.1 .

Para filtrar estas advertencias usted mismo , puede hacer lo mismo que el parche :

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

Por supuesto, puede recompilar todos los módulos afectados desde la fuente contra su localnumpy con pip install --no-binary :all:¹ en su lugar si tiene las herramientas de bolas para eso.


Una historia más larga: el proponente del parche afirma que no debería haber ningún riesgo específicamente con numpy, y los paquetes de terceros se construyen intencionalmente contra versiones anteriores:

[Reconstruir todo contra numpy actual] no es una solución factible, y ciertamente no debería ser necesaria. Scipy (como muchos otros paquetes) es compatible con varias versiones de numpy. Entonces, cuando distribuimos binarios scipy, los compilamos con la versión numpy más baja compatible (1.5.1 a partir de ahora) y también funcionan con 1.6.x, 1.7.xy numpy master.

Lo correcto sería que Cython solo emitiera advertencias cuando el tamaño de dtypes / ufuncs tenga cambios que rompan el ABI y, de lo contrario, se mantenga en silencio.

Como resultado, los desarrolladores de Cython acordaron confiar en que el equipo numpy mantendría la compatibilidad binaria a mano , por lo que probablemente podamos esperar que el uso de versiones con cambios de ABI de última generación produzca una excepción especialmente diseñada o algún otro show-stopper explícito.


¹ La --no-use-wheelopción disponible anteriormente se ha eliminado desde entoncespip 10.0.0 .

ivan_pozdeev
fuente
1
Doc enlaces: --no-binary, anulaciones por-requisito para archivos requisitos . Además, vine aquí pandas, así que aquí está el pandasproblema relevante de GitHub .
eacousineau
35

Es el tema de la nueva versión numpy (1.15.0)

Puede degradar numpy y se solucionará este problema:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

Finalmente, se lanza la versión numpy 1.15.1 para que se solucionen los problemas de advertencia.

sudo pip install numpy == 1.15.1

Esto esta funcionando ..

Parthiban Soundram
fuente
66
Por error, el código que silencia esa advertencia se eliminó entre 1.14.5 y 1.15.0. La solución es parte de la versión de corrección de errores 1.15.1, que debería estar disponible a fines de agosto de 2018
mattip
3
Gracias @mattip. pip install numpy==1.15.1me llevó de 1.15.0 a 1.15.1 y los mensajes de advertencia desaparecieron.
keithpjolley
Con Numpy 1.15.0, recibí el mensaje de advertencia de informe anterior al importar PyTables versión 3.4.4 y H5Py versión 2.8.0. La advertencia desapareció después de instalar Numpy versión 1.15.1.
Sun Bear
8

Si está en un entorno de anaconda, utilice:

conda update --all
H. Shad
fuente
2
O actualizar simplemente numpy que funcionó para mí:conda update numpy
Dan King
8

He intentado las formas mencionadas anteriormente, pero nada funcionó. Pero el problema desapareció después de instalar las bibliotecas a través de apt install,

Para Python3,

pip3 uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python3-numpy python3-scipy python3-pandas python3-sklearn 

Para Python2,

pip uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python-numpy python-scipy python-pandas python-sklearn 

Espero que ayude.

Hemanth Kumar Talla
fuente
11
desinstaló las versiones de Py2 e instaló las de Py3.
percusse
Parece que la instalación de versiones de python3 también resolvió mi problema.
Menuka Ishan
Si instala paquetes binarios, incluidos numpy, desde el repositorio de la distribución oficial en lugar de desde PyPI, por supuesto, todos se compilan contra eso numpy. La desventaja es que es posible que no obtenga las últimas versiones.
ivan_pozdeev
7

Simplemente actualice su módulo numpy, ahora es 1.15.4. Para ventanas

pip install numpy --upgrade
satyam_sareen
fuente
1

Este error se produce porque los paquetes instalados se compilaron contra una versión diferente de numpy.
Necesitamos reconstruir scipy y scikit-learn contra el localnumpy .

Para nuevo pip(en mi caso pip 18.0) esto funcionó:

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

--no-binarytoma una lista de nombres de paquetes para los que desea ignorar los binarios. En este caso pasamos --no-binary scipy,scikit-learnlo que ignorará los binarios para paquetes scipy, scikit-learn. No me ayudo

Temak
fuente
0

Metainformación : la forma recomendada de instalar sklearn

Si ya tiene una instalación funcional de numpy y scipy, la forma más fácil de instalar scikit-learn es usar pip

pip install -U scikit-learn 

o conda:

conda install scikit-learn

[... no compilar desde la fuente usando pip]

Si aún no tiene una instalación de python con numpy y scipy, le recomendamos instalarla a través de su administrador de paquetes o mediante un paquete de python . Estos vienen con numpy, scipy, scikit-learn, matplotlib y muchas otras bibliotecas científicas y de procesamiento de datos útiles.

serv-inc
fuente
0

Tenga en cuenta que a partir de cython 0.29 hay una nueva opción check_size que elimina la advertencia en la fuente, por lo que no se necesitarán soluciones alternativas una vez que la versión se filtre a los diversos paquetes

Mattip
fuente
-3

Mi ambiente es Python 2.7.15

lo intento

pip uninstall
pip install --no-use-wheel

Pero no funciona. Muestra el error:

no existe esa opción: --no-use-wheel

Entonces intento:

pip uninstall
pip install --user --install-option="--prefix=" -U scikit-learn

Y funciona: las advertencias inútiles no se muestran.

Dan
fuente
3
La opción --no-use-wheelha sido eliminada. Usar en su --no-binary :all:lugar.
jmlarson
-5

Al importar scipy, la información de error muestra: RuntimeWarning: el tamaño incorporado del tipo. Cambiado, puede indicar incompatibilidad binaria. Zd esperado, tengo zd

Resolví este problema actualizando la versión de Python de 2.7.2 a 2.7.13

Hao Xiang
fuente