RuntimeWarning: zmieniono rozmiar numpy.dtype, może wskazywać na niezgodność plików binarnych

148

Mam ten błąd podczas próby załadowania zapisanego modelu SVM. Próbowałem odinstalować sklearn, NumPy i SciPy, ponownie instalując wszystkie najnowsze wersje (używając pip). Nadal otrzymuję ten błąd. Czemu?

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

AKTUALIZACJA: OK, podążając tutaj i

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

Błąd zniknął, chociaż nadal nie mam pojęcia, dlaczego wystąpił w pierwszej kolejności ...

Niebieski482
źródło
3
--no-use-wheelrekompiluje moduł ze źródła na wszystko, co masz w systemie.
ivan_pozdeev
17
W nowszych wersjach pip nazwa tego polecenia została zmieniona na --no-binary.
s_kirkiles
1
Tak, to pracował dla mnie pip install --no-binary :all: pandas. FWIW Otrzymałem ten błąd na nowej kompilacji VE na wersji Pythona Python 3.6.6 :: Anaconda, Inc.tylko requestsi pandaszainstalowanej w środowisku.
safay
Powinien zostać naprawiony teraz w cythonie 0.29, jak skomentowano poniżej
mattip
Musisz także zainstalować, gfortranaby Scipy mógł skompilować:sudo apt install gfortran
ma3oun

Odpowiedzi:

145

Według MAINT: cisza Cython ostrzega o zmianach dtype / ufunc size. - numpy / numpy :

Te ostrzeżenia są widoczne za każdym razem, gdy importujesz scipy (lub inny pakiet), który został skompilowany na starszym numpy niż jest zainstalowany.

a czeki są wstawiane przez Cythona (stąd są obecne w każdym skompilowanym module).

Krótko mówiąc, te ostrzeżenia powinny być łagodne w konkretnym przypadkunumpy , a te komunikaty są odfiltrowywane odnumpy 1.8 (gałęzi, do której trafiło zatwierdzenie). While scikit-learn 0.18.1jest kompilowany przeciwkonumpy 1.6.1 .

Aby samodzielnie filtrować te ostrzeżenia , możesz zrobić to samo, co robi łatka :

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

Oczywiście, można po prostu skompilować wszystkie moduły dotkniętych ze źródeł przeciwko lokalnymnumpy z pip install --no-binary :all:¹ zamiast jeśli masz kule narzędzia do tego.


Dłuższa historia: zwolennicy łatki twierdzą, że nie powinno być żadnego ryzyka numpy, a pakiety innych firm są celowo tworzone w oparciu o starsze wersje:

[Odbudowanie wszystkiego w stosunku do obecnego numpy] nie jest wykonalnym rozwiązaniem i na pewno nie powinno być konieczne. Scipy (jak wiele innych pakietów) jest kompatybilny z wieloma wersjami numpy. Więc kiedy dystrybuujemy binaria Scipy, budujemy je na najniższej obsługiwanej wersji numpy (obecnie 1.5.1) i działają one również z 1.6.x, 1.7.x i numpy master.

Naprawdę poprawne byłoby, gdyby Cython wydawał ostrzeżenia tylko wtedy, gdy rozmiar dtypes / ufuncs zmienił się w sposób, który łamie ABI, i milczał w przeciwnym razie.

W rezultacie programiści Cythona zgodzili się zaufać zespołowi numpy w kwestii ręcznego utrzymania kompatybilności binarnej , więc prawdopodobnie możemy się spodziewać, że używanie wersji z zepsutymi zmianami ABI przyniesie specjalnie spreparowany wyjątek lub inny wyraźny efekt zatrzymania .


¹ Wcześniej dostępna --no-use-wheelopcja została usunięta odpip 10.0.0 tego czasu .

ivan_pozdeev
źródło
1
Linki Doc: --no-binary, nadpisania per-wymogiem dla plików wymagania . Przyszedłem tutaj pandas, więc oto odpowiedni pandasproblem z GitHub .
eacousineau
35

To kwestia nowej wersji numpy (1.15.0)

Możesz obniżyć wersję Numpy, a ten problem zostanie naprawiony:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

W końcu zostaje wydana wersja numpy 1.15.1, więc problemy z ostrzeżeniami zostały naprawione.

sudo pip install numpy == 1.15.1

To działa ...

Parthiban Soundram
źródło
6
Przez pomyłkę kod wyciszający to ostrzeżenie został usunięty między 1.14.5 a 1.15.0. Fix jest częścią wydania 1.15.1 poprawkowe, które powinny być na zewnątrz pod koniec sierpnia 2018
mattip
3
Dzięki @mattip. pip install numpy==1.15.1dostałem mnie z 1.15.0 do 1.15.1 i ostrzeżenia zniknęły.
keithpjolley
W numpy 1.15.0 otrzymałem powyższy komunikat ostrzegawczy raportu podczas importowania PyTables w wersji 3.4.4 i H5Py w wersji 2.8.0. Ostrzeżenie zniknęło po zainstalowaniu Numpy w wersji 1.15.1.
Sun Bear
8

jeśli jesteś w środowisku anakondy, użyj:

conda update --all
H. Shad
źródło
2
Lub zaktualizuj po prostu numpy, który działał dla mnie:conda update numpy
Dan King,
8

Wypróbowałem wyżej wymienione sposoby, ale nic nie działało. Ale problem zniknął po zainstalowaniu bibliotek za pomocą apt install,

W przypadku Python3

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

W przypadku Python2

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

Mam nadzieję, że to pomoże.

Hemanth Kumar Talla
źródło
11
odinstalowałeś wersje Py2 i zainstalowałeś wersje Py3.
percusse
Wydaje się, że zainstalowanie wersji python3 rozwiązało również mój problem.
Menuka Ishan
Jeśli instalujesz pakiety binarne, w tym numpyz oficjalnego repozytorium dystrybucji, a nie z PyPI, oczywiście wszystkie są kompilowane z tym samym numpy. Wadą jest to, że możesz nie otrzymywać najnowszych wersji.
ivan_pozdeev
7

Po prostu zaktualizuj swój moduł numpy, w tej chwili jest to 1.15.4. Dla Windowsa

pip install numpy --upgrade
satyam_sareen
źródło
1

Ten błąd występuje, ponieważ zainstalowane pakiety zostały zbudowane dla innej wersji numpy.
Musimy odbudować scipy i scikit-learn przeciwko lokalnościnumpy .

Dla nowego pip(w moim przypadku pip 18.0) to zadziałało:

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

--no-binarypobiera listę nazw pakietów, dla których chcesz zignorować pliki binarne. W tym przypadku przeszliśmy, --no-binary scipy,scikit-learnktóra zignoruje pliki binarne dla pakietów scipy, scikit-learn. Nie pomogło mi

Temak
źródło
0

Meta-informacje: zalecany sposób instalacji sklearn

Jeśli masz już działającą instalację numpy i scipy, najłatwiejszym sposobem zainstalowania scikit-learn jest użycie pip

pip install -U scikit-learn 

lub conda:

conda install scikit-learn

[... nie kompiluj ze źródła przy użyciu pip]

Jeżeli nie masz jeszcze instalację Pythona w numpy i scipy zalecamy zainstalować za pośrednictwem swojego menedżera pakietów lub przez A Pythona wiązki . Są one dostarczane z numpy, scipy, scikit-learn, matplotlib i wieloma innymi przydatnymi bibliotekami naukowymi i przetwarzającymi dane.

serv-inc
źródło
0

Zauważ, że od cython 0.29 jest nowa opcja check_size, która eliminuje ostrzeżenie u źródła, więc żadne obejście nie powinno być potrzebne, gdy ta wersja przeniknie do różnych pakietów

mattip
źródło
-3

Moje środowisko to Python 2.7.15

próbuję

pip uninstall
pip install --no-use-wheel

ale to nie działa. Pokazuje błąd:

brak takiej opcji: --no-use-wheel

Następnie próbuję:

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

I to działa: bezużyteczne ostrzeżenia się nie pojawiają.

Dan
źródło
3
Opcja --no-use-wheelzostała usunięta. Użyj --no-binary :all:zamiast tego.
jmlarson
-5

Podczas importu scipy informacje o błędzie pokazują: RuntimeWarning: wbudowany .type rozmiar zmieniony, może wskazywać na niezgodność binarną. Oczekiwano zd, dostałem zd

Rozwiązałem ten problem, aktualizując wersję Pythona z 2.7.2 na 2.7.13

Hao Xiang
źródło