2018년 5월 2일 수요일

요즘 anaconda 5.1 환경에서 많이 발생하는 undefined symbol error의 해결책

아래 URL에 나오는 간단한 LSTM 관련 python code를 수행하려고 하는데, 이런 error가 나는 경우가 있습니다.

https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/


minsky@minsky:~/exam$ python lstm1.py
...
    import scipy.special as spec
  File "/home/minsky/anaconda3/lib/python3.6/site-packages/scipy/special/__init__.py", line 6   40, in <module>
    from ._ufuncs import *
ImportError: /home/minsky/anaconda3/lib/python3.6/site-packages/scipy/special/_ufuncs.cpython   -36m-powerpc64le-linux-gnu.so: undefined symbol: _gfortran_stop_numeric_f08


이건 꼭 ppc64le 환경에서만 나는 error는 아닙니다.  그러나 최근에 저도 caffe를 build하면서 이와 유사한 undefined symbol error로 인해 고생을 한 적이 있습니다. 

이 error는 한줄 요약하면 올해 초에 release된 Anaconda 5.1 때문에 발생하는 것입니다.  그렇다고 Anaconda 5.1에 bug가 있는 것은 아니고, Anaconda 5.1을 build하기 위해 사용된 gcc 버전이 7.2.0이라는 것에 문제가 있는 것입니다.

minsky@minsky:~/exam$ python
Python 3.6.4 |Anaconda, Inc.| (default, Feb 11 2018, 08:19:13)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

저  undefined symbol error는 서로 다른 버전의 gcc로 compile된 object file들을 하나로 link할 때 주로 발생합니다.  따라서 Anaconda 5.1 환경에서 gcc로 뭔가 build할 때는 gcc 버전도 7.2로 맞추는 것이 좋습니다.  그러나 Redhat 7.4의 경우 포함된 gcc의 default 버전은 4.8이고, Ubuntu 16.04도 5.4에 불과합니다.

minsky@minsky:~/exam$ gcc --version
gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

다시 말해, Anaconda 5.1에 포함된 python library들은 gcc 7.2로 compile된 것에 비해 OS에 포함된 gcc 버전은 훨씬 낮기 때문에 이 문제가 발생합니다. 

이 문제를 해결하려면 어떻게 해야 할까요 ?  가장 간단한 방법은 Anaconda 5.0을 쓰는 것입니다.  이 버전은 gcc 4.8로 compile되었거든요. 

https://repo.continuum.io/archive/

Filename Size Last Modified MD5
Anaconda2-5.1.0-Linux-ppc64le.sh 267.3M 2018-02-15 09:08:49 e894dcc547a1c7d67deb04f6bba7223a
Anaconda3-5.1.0-Linux-ppc64le.sh 285.7M 2018-02-15 09:08:56 47b5b2b17b7dbac0d4d0f0a4653f5b1c
Anaconda2-5.0.0-Linux-ppc64le.sh 282.3M 2017-09-26 16:25:07 157890d591c61a9b511f8452476d6d19
Anaconda3-5.0.0-Linux-ppc64le.sh 296.3M 2017-09-25 14:39:31 8fe5b29ca5be3ff11411621f79babfc2

아래와 같이 Anaconda 5.0을 download 받아 설치하면 그 속에 든 python은 GCC 4.8.4로 build된 것을 보실 수 있습니다.

minsky@minsky:~/files$ wget https://repo.continuum.io/archive/Anaconda3-5.0.0-Linux-ppc64le.sh

minsky@minsky:~/exam$ which python
/home/minsky/anaconda3_50/bin/python

minsky@minsky:~/exam$ python
Python 3.6.2 |Anaconda, Inc.| (default, Sep 15 2017, 20:38:23)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.

이제 새로 설치된 Anaconda 환경에 keras와 tensorflow를 설치합니다. 

minsky@minsky:~/exam$ pip install keras

minsky@minsky:~/exam$ pip install ~/files/tensorflow_pkg/tensorflow-1.3.1-cp36-cp36m-linux_ppc64le.whl

이제 아까 돌리려 했던 lstm1.py를 다시 수행해보는데, 이번엔 또 색다른 error가 납니다.

minsky@minsky:~/exam$ python lstm1.py
Using TensorFlow backend.
RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb
ImportError: numpy.core.multiarray failed to import
...

이건 numpy의 버전이 낮아서 생기는 문제입니다.  numpy를 upgrade하면 해결됩니다.

minsky@minsky:~/exam$ pip install numpy --upgrade

minsky@minsky:~/exam$ time python lstm1.py
/home/minsky/anaconda3_50/lib/python3.6/site-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
Using TensorFlow backend.
...
 - 4s - loss: 0.0057
Epoch 1/1
 - 1s - loss: 0.0141
Epoch 1/1
 - 1s - loss: 0.0099
Epoch 1/1
 - 1s - loss: 0.0072
Epoch 1/1
...
Epoch 1/1
 - 1s - loss: 0.0039
Epoch 1/1
 - 1s - loss: 0.0038
Epoch 1/1
 - 1s - loss: 0.0038
Epoch 1/1
 - 1s - loss: 0.0037
Epoch 1/1
 - 1s - loss: 0.0036
Train Score: 29.74 RMSE
Test Score: 79.26 RMSE

real    2m12.613s
user    3m1.860s
sys     0m9.948s


다만 이 sample code는 아래와 같이 CPU도 GPU도 사용량이 그다지 많지 않습니다.  따라서 POWER 아키텍처의 장점인 intel x86 대비 2배에 가까운 memory bandwidth를 보여주기에는 적절한 예는 아닌 것으로 생각됩니다.



댓글 없음:

댓글 쓰기