RuntimeWarning: la taille de numpy.dtype a changé, peut indiquer une incompatibilité binaire

149

J'ai cette erreur pour essayer de charger un modèle SVM enregistré. J'ai essayé de désinstaller sklearn, NumPy et SciPy, en réinstallant à nouveau les dernières versions (en utilisant pip). J'obtiens toujours cette erreur. Pourquoi?

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

MISE À JOUR: OK, en suivant ici , et

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

L'erreur est maintenant partie, même si je n'ai toujours aucune idée de la raison pour laquelle cela s'est produit en premier lieu ...

Bleu482
la source
3
--no-use-wheelrecompile le module à partir des sources avec tout ce que vous avez sur votre système.
ivan_pozdeev
17
Dans les versions plus récentes de pip, cette commande a été renommée --no-binary.
s_kirkiles
1
Oui, cela a fonctionné pour moi: pip install --no-binary :all: pandas. FWIW J'obtenais cette erreur sur une nouvelle version de VE au-dessus de la version Python Python 3.6.6 :: Anaconda, Inc.avec uniquement requestset pandasinstallée dans l'environnement.
safay
Devrait être corrigé maintenant dans cython 0.29, comme commenté ci
mattip
Vous devez également installer gfortranpour que scipy compile:sudo apt install gfortran
ma3oun

Réponses:

146

Selon MAINT: faites taire les avertissements Cython sur les changements de taille dtype / ufunc. - numpy / numpy :

Ces avertissements sont visibles chaque fois que vous importez scipy (ou un autre package) qui a été compilé avec un numpy plus ancien que celui installé.

et les vérifications sont insérées par Cython (sont donc présentes dans tout module compilé avec lui).

Pour faire court, ces avertissements devraient être bénins dans le cas particulier denumpy , et ces messages sont filtrés depuisnumpy 1.8 (la branche sur laquelle ce commit est allé). Alors que scikit-learn 0.18.1est compilé contrenumpy 1.6.1 .

Pour filtrer ces avertissements vous - même , vous pouvez faire la même chose que le patch :

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

Bien sûr, vous pouvez simplement recompiler tous les modules affectés à partir des sources contre votre localnumpy avec pip install --no-binary :all:¹ à la place si vous avez les outils balles pour cela.


Histoire plus longue: le promoteur du correctif affirme qu'il ne devrait y avoir aucun risque spécifiquement avec numpy, et les packages tiers sont intentionnellement construits contre des versions plus anciennes:

[Tout reconstruire contre le numpy actuel n'est] pas une solution réalisable, et ne devrait certainement pas être nécessaire. Scipy (comme beaucoup d'autres packages) est compatible avec un certain nombre de versions de numpy. Ainsi, lorsque nous distribuons des binaires scipy, nous les construisons avec la version numpy la plus basse prise en charge (1.5.1 à partir de maintenant) et ils fonctionnent également avec 1.6.x, 1.7.x et numpy master.

Le vrai correct serait que Cython émette des avertissements uniquement lorsque la taille de dtypes / ufuncs a changé d'une manière qui rompt l'ABI, et reste silencieux dans le cas contraire.

En conséquence, les développeurs de Cython ont accepté de faire confiance à l'équipe numpy pour maintenir la compatibilité binaire à la main , nous pouvons donc probablement nous attendre à ce que l'utilisation de versions avec des changements ABI cassants produise une exception spécialement conçue ou un autre show-stop explicite.


¹ L' --no-use-wheeloption précédemment disponible a été supprimée depuispip 10.0.0 .

ivan_pozdeev
la source
1
Liens Doc: --no-binary, remplacements pour les fichiers exigences par-exigence . Aussi, je suis venu ici pour pandas, alors voici le pandasproblème GitHub pertinent .
eacousineau
35

C'est le problème de la nouvelle version de numpy (1.15.0)

Vous pouvez rétrograder numpy et ce problème sera résolu:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

Enfin, la version numpy 1.15.1 est publiée afin que les problèmes d'avertissement soient résolus.

sudo pip install numpy == 1.15.1

Cela fonctionne.

Parthiban Soundram
la source
6
Par erreur, le code qui atténue cet avertissement a été supprimé entre 1.14.5 et 1.15.0. Le correctif fait partie de la version 1.15.1 du correctif de bogue, qui devrait sortir d'ici la fin du mois d'août 2018
Mattip
3
Merci @mattip. pip install numpy==1.15.1m'a fait passer de 1.15.0 à 1.15.1 et les messages d'avertissement sont partis.
keithpjolley
Avec numpy 1.15.0, j'ai reçu le message d'avertissement de rapport ci-dessus lors de l'importation de PyTables version 3.4.4 et H5Py version 2.8.0. L'avertissement a disparu après l'installation de Numpy version 1.15.1.
Sun Bear
8

si vous êtes dans un environnement anaconda, utilisez:

conda update --all
H. Shad
la source
2
Ou mettez à jour juste numpy qui a fonctionné pour moi:conda update numpy
Dan King
8

J'ai essayé les méthodes mentionnées ci-dessus, mais rien n'a fonctionné. Mais le problème avait disparu après avoir installé les bibliothèques via apt install,

Pour Python3,

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

Pour Python2,

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

J'espère que cela pourra aider.

Hemanth Kumar Talla
la source
11
vous avez désinstallé les versions Py2 et installé celles Py3.
percusse
Il semble que l'installation des versions de python3 a également résolu mon problème.
Menuka Ishan
Si vous installez des packages binaires, y compris numpy, à partir du référentiel officiel de la distribution plutôt que de PyPI, bien sûr, ils sont tous compilés par rapport à celui-ci numpy. L'inconvénient est que vous n'obtenez peut-être pas les dernières versions.
ivan_pozdeev
7

Mettez simplement à jour votre module numpy, pour le moment, il est 1.15.4. Pour les fenêtres

pip install numpy --upgrade
satyam_sareen
la source
1

Cette erreur se produit car les packages installés ont été compilés contre une version différente de numpy.
Nous devons reconstruire scipy et scikit-learn contre le localnumpy .

Pour nouveau pip(dans mon cas pip 18.0), cela a fonctionné:

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

--no-binaryprend une liste de noms de paquets pour lesquels vous souhaitez ignorer les binaires. Dans ce cas, nous avons passé --no-binary scipy,scikit-learnce qui ignorera les binaires pour les paquets scipy, scikit-learn. Ne m'a pas aidé

Temak
la source
0

Méta-informations: la méthode recommandée pour installer sklearn

Si vous avez déjà une installation fonctionnelle de numpy et scipy, le moyen le plus simple d'installer scikit-learn est d'utiliser pip

pip install -U scikit-learn 

ou conda:

conda install scikit-learn

[... ne pas compiler à partir des sources en utilisant pip]

Si vous ne disposez pas déjà d'une installation python avec numpy et scipy, nous vous recommandons de l'installer via votre gestionnaire de packages ou via un bundle python . Ceux-ci viennent avec numpy, scipy, scikit-learn, matplotlib et de nombreuses autres bibliothèques scientifiques et de traitement de données utiles.

serv-inc
la source
0

Notez qu'à partir de cython 0.29, il y a une nouvelle option check_size qui élimine l'avertissement à la source, donc aucune solution de contournement ne devrait être nécessaire une fois que cette version percole dans les différents packages

Mattip
la source
-3

Mon environnement est Python 2.7.15

J'essaie

pip uninstall
pip install --no-use-wheel

mais ça ne marche pas. Il montre l'erreur:

aucune option de ce type: --no-use-wheel

Alors j'essaye:

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

Et ça marche: les avertissements inutiles ne s'affichent pas.

Dan
la source
3
L'option --no-use-wheela été supprimée. Utilisez --no-binary :all:plutôt.
jmlarson
-5

Lors de l'importation de scipy, les informations d'erreur indiquent: RuntimeWarning: la taille .type intégrée a changé, peut indiquer une incompatibilité binaire. Attendu zd, obtenu zd

J'ai résolu ce problème en mettant à jour la version python de 2.7.2 à 2.7.13

Hao Xiang
la source