RuntimeWarning : numpy.dtype 크기가 변경되었습니다. 이진 비 호환성을 나타낼 수 있습니다


148

저장된 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

오류가 발생했지만 왜 처음에 왜 발생했는지 알 수 없습니다 ...


3
--no-use-wheel시스템에있는 모든 것에 대해 소스에서 모듈을 다시 컴파일합니다.
ivan_pozdeev

17
최신 버전의 pip에서는이 명령의 이름이로 변경되었습니다 --no-binary.
s_kirkiles

1
그래, 이것은 나를 위해 일했다 : pip install --no-binary :all: pandas. FWIW 나는 신선한에이 오류가 파이썬 버전의 상단에 빌드를 VE 얻고 있었다 Python 3.6.6 :: Anaconda, Inc.에서만 requestspandas환경에 설치되어 있어야합니다.
safay


gfortranscipy를 컴파일 하려면 다음을 설치해야합니다 .sudo apt install gfortran
ma3oun

답변:


145

MAINT 에 따르면 dtype / ufunc 크기 변경에 대한 Cython 경고를 침묵시킵니다. -numpy / numpy :

이 경고는 설치된 것보다 오래된 numpy에 대해 컴파일 된 scipy (또는 다른 패키지)를 가져올 때마다 표시됩니다.

그리고 체크는 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")

물론, 툴 이 있다면 대신 에 ¹를 사용 하여 소스에서 로컬numpy영향을받는 모든 모듈을 다시 컴파일 할 수 있습니다 .pip install --no-binary :all:


더 긴 이야기 : 패치의 제안자 특별히 위험이 없어야한다고 주장 하며 numpy타사 패키지는 의도적으로 이전 버전에 대해 빌드되었습니다.

[현재 numpy에 대비하여 모든 것을 재건하는 것은] 실현 가능한 해결책이 아니며 반드시 필요한 것은 아닙니다. Scipy (다른 많은 패키지와 마찬가지로)는 여러 버전의 numpy와 호환됩니다. 그래서 우리는 scipy 바이너리를 배포 할 때 가장 낮은 지원되는 numpy 버전 (현재 1.5.1)에 대해 빌드하고 1.6.x, 1.7.x 및 numpy 마스터와도 작동합니다.

실제 올바른 것은 Cython이 dtypes / ufuncs의 크기가 ABI를 중단시키는 방식으로 변경되었을 때만 경고를 발행하고 그렇지 않으면 침묵합니다.

결과적으로 Cython의 개발자 는 이진 호환성을 수동으로 유지 관리하여 numpy 팀을 신뢰하기로 합의했습니다 . 따라서 ABI 변경을 중단 한 버전을 사용하면 특수하게 조작 된 예외 또는 다른 명시 적 쇼 스토퍼가 발생할 것으로 예상 할 수 있습니다.


¹ 이전에 사용 가능한 --no-use-wheel옵션이 이후에 제거 되었습니다pip 10.0.0 .


1
문서 링크 : --no-binary, 요구 사항 파일 당 요구 사항을 무시 . 또한 여기에 왔 pandas으므로 관련 pandasGitHub 문제가 있습니다.
eacousineau

35

새로운 numpy 버전 (1.15.0)의 문제입니다.

numpy를 다운 그레이드 할 수 있으며이 문제가 해결됩니다.

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

마지막으로 numpy 1.15.1 버전이 출시되어 경고 문제가 해결되었습니다.

sudo pip install numpy == 1.15.1

작동 중입니다 ..


6
실수로 경고를 없애는 코드는 1.14.5와 1.15.0 사이에서 제거되었습니다. 이 수정 프로그램 은 1.15.1 버그 수정 릴리스의 일부이며, 2018 년 8 월 말에 출시 될 예정입니다.
mattip

3
@mattip 감사합니다. pip install numpy==1.15.11.15.0에서 1.15.1로 나를 보내었고 경고 메시지가 사라졌습니다.
keithpjolley

numpy 1.15.0에서는 PyTables 버전 3.4.4 및 H5Py 버전 2.8.0을 가져올 때 위의 보고서 경고 메시지가 표시됩니다. Numpy 버전 1.15.1을 설치 한 후 경고가 사라졌습니다.
Sun Bear

8

아나콘다 환경에있는 경우 :

conda update --all

2
또는 나를 위해 일한 numpy를 업데이트하십시오.conda update numpy
Dan King

8

위에서 언급 한 방법을 시도했지만 아무것도 효과가 없었습니다. 그러나 apt install을 통해 라이브러리를 설치하면 문제가 사라졌습니다.

Python3의 경우

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

Python2의 경우

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

희망이 도움이됩니다.


11
Py2 버전을 설치 제거하고 Py3 버전을 설치했습니다.
percusse

python3 버전을 설치하면 문제가 해결되었습니다.
Menuka Ishan

를 포함하여 numpyPyPI가 아닌 공식 배포 저장소에서 바이너리 패키지를 설치하는 경우 물론 모두 동일한 패키지에 대해 컴파일 numpy됩니다. 단점은 최신 버전을 얻지 못할 수 있다는 것입니다.
ivan_pozdeev

7

numpy 모듈을 업그레이드하면 바로 1.15.4입니다. 창문 용

pip install numpy --upgrade

1

설치된 패키지가 다른 버전의 numpy로 다시 빌드 되었기 때문에이 오류가 발생합니다.
우리는 scipy를 다시 빌드하고 local에 대해 scikit-learn을 배워야합니다 numpy.

새로운 pip(내 경우 pip 18.0)에는 다음과 같이 작동했습니다.

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

--no-binary바이너리를 무시하려는 패키지 이름 목록을 가져옵니다. 이 경우에 우리는 통과--no-binary scipy,scikit-learn scipy, scikit-learn 패키지의 바이너리를 무시할 것입니다. 나를 도와주지 않았다


0

메타 정보 : sklearn을 설치하는 권장 방법

이미 numpy와 scipy가 설치되어 있다면 scikit-learn을 설치하는 가장 쉬운 방법은 pip

pip install -U scikit-learn 

또는 conda:

conda install scikit-learn

[... pip를 사용하여 소스에서 컴파일하지 마십시오]

이미 NumPy와와 scipy와 파이썬 설치되어 있지 않은 경우, 우리는 당신의 패키지 관리자를 통해 또는 통해 중 하나를 설치하는 것이 좋습니다 파이썬 번들 . 여기에는 numpy, scipy, scikit-learn, matplotlib 및 기타 유용한 과학 및 데이터 처리 라이브러리가 있습니다.


0

cython 0.29 부터는 소스에서 경고를 제거 하는 새로운 check_size 옵션 이 있으므로 해당 버전이 다양한 패키지에 침투하면 해결 방법이 필요하지 않습니다.


-3

내 환경은 Python 2.7.15입니다.

나는 노력한다

pip uninstall
pip install --no-use-wheel

그러나 작동하지 않습니다. 오류가 표시됩니다.

그러한 옵션은 없습니다 : --no-use-wheel

그런 다음 시도합니다.

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

쓸모없는 경고는 표시되지 않습니다.


3
옵션 --no-use-wheel이 제거되었습니다. --no-binary :all:대신 사용하십시오 .
jmlarson

-5

가져 오기 scipy, 오류 정보가 표시됩니다 : RuntimeWarning : builtin .type size changed, 바이너리 비 호환성을 나타낼 수 있습니다. 예상 ZD, ZD 확보

파이썬 버전을 2.7.2에서 2.7.13으로 업데이트 하여이 문제를 해결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.