개발을 하다 보면 다양한 환경에서 여러 오류가 발생한다. 특히 파이썬 라이브러리들을 사용할 때 라이브러리 간 버전 호환성 문제로 인해 예상치 못한 오류가 발생할 때가 있는데, 최근에 겪었던 문제 중 하나는 NumPy를 사용할 때 나오는 다음과 같은 경고 메시지였다.
문제 상황
배치 워크플로우를 돌리는 경우에 cluster 에러가 나서 이후에 있는 모든 작업이 전부 중단됐다. log4j의 strerr을 다운받아서 확인해보니
아래와 같은 경고가 나타났다.
ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject
이 경고는 NumPy의 dtype 크기가 변경되었으며, 예상 크기와 실제 크기가 다르다는 내용이다. 이는 바이너리 호환성 문제를 나타내는 경고이다.
문제의 원인
이 경고는 일반적으로 NumPy와 다른 C 확장 모듈(예: `scipy`, `pandas` 등) 간의 바이너리 호환성 문제에서 기인한다고 한다. 주로 다음과 같은 상황에서 발생한다고 한다:
1. NumPy 버전이 달라졌을 때: 특정 C 확장 모듈이 특정 NumPy 버전에 맞춰 컴파일된 후, 나중에 NumPy가 업데이트되면서 발생하는 경우
2. 파이썬 라이브러리 호환성 문제: 일부 라이브러리가 NumPy의 이전 버전에 의존하고 있을 경우, 라이브러리 간에 바이너리 불일치가 생길 수 있는 경우
해결 방법
이 문제를 해결하기 위한 몇 가지 방법을 소개한다고 한다.
1. NumPy 및 의존성 패키지 재설치
가장 간단한 해결 방법은 NumPy와 관련된 라이브러리를 모두 최신 버전으로 재설치하는 것이다. 다음 명령어로 NumPy와 관련된 라이브러리들을 모두 최신 버전으로 업데이트하는 방법이다.
pip install --upgrade numpy scipy pandas
이를 통해 NumPy와 의존하는 라이브러리들이 모두 최신 버전으로 맞춰져, 바이너리 호환성 문제가 해결될 수 있다.
2. 바이너리 불일치가 발생한 라이브러리 재설치
특정 라이브러리가 NumPy와 호환되지 않는 경우, 해당 라이브러리를 직접 재설치하는 방법도 있다. 예를 들어, `pandas`에서 문제가 발생했다면, 해당 라이브러리를 다시 설치하는 방법이다.
pip install --force-reinstall scipy
3. NumPy 버전을 명시적으로 지정하여 설치(선택한 방법)
문제가 계속될 경우, NumPy의 특정 버전으로 다운그레이드하여 설치하는 방법도 있다. 아래 명령어로 NumPy의 특정 버전을 설치할 수 있는데, 필자는 pandas 라이브러리 간의 호환성이 맞지 않아서 오류가 발생했었다. 그래서 numpy와 pandas 간의 호환된 버전을 명시적으로 지정하여 재설치하여 진행했다.
pip install numpy==1.21.6
pip install pandas==1.3.5
이 방법은 문제를 일으키는 패키지들이 특정 버전의 NumPy에 의존하고 있을 때 유용하다고 한다.
이 두개의 라이브러리의 각 버전은 호환된 버전이기 때문에 각 버전으로 재설치를 진행했다.
마무리
NumPy는 다양한 데이터 라이브러리의 기반이 되는 중요한 라이브러리이므로, 발생한 경고나 오류를 적절히 처리하는 것이 필요하다. 위에서 제시한 해결 방법들을 통해 NumPy와 관련된 바이너리 호환성 문제를 해결할 수 있기를 바란다.
참고