아쉽게도 아직 좋은 GPU는 갖고있지 않고, 가진건 비교적 성능이 뛰어나지 않은 16Core CPU뿐인데
오늘 Theano를 돌렸더니 1. import하면 에러가 나고 2. CPU를 2코어밖에 사용하지 않는 문제 가 있어서 고생했다.
언제나 그렇듯 기나긴 삽질을 통해 어떻게든 두 가지 모두 해결하긴 했는데, 나중에 분명!! 똑같은 문제를 겪을 것 같아 남겨둔다.
원인과 해결
import theano 의 에러
아마 이런 에러를 보게 될텐데,
Problem occurred during compilation with the command line below:
/usr/bin/g++ -shared -g -march = corei7-avx -mcx16 -msahf -mno-movbe -maes -mpclmul -mpopcnt -mno-abm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mno-avx -mno-avx2 -msse4 .2 -msse4 .1 -mno-lzcnt -mno-rtm -mno-hle -mno-rdrnd -mno-f16c -mno-fsgsbase -mno-rdseed -mno-prfchw -mno-adx -mfxsr -mno-xsave -mno-xsaveopt --param l1-cache-size= 0 --param l1-cache-line-size= 0 --param l2-cache-size= 256 -mtune = corei7-avx -D NPY_NO_DEPRECATED_API = NPY_1_7_API_VERSION -m64 -fPIC -I /home/kcy1019/.pyenv/versions/soma/lib/python2.7/site-packages/numpy/core/include -I /home/kcy1019/.pyenv/versions/2.7.10/include/python2.7 -o /home/kcy1019/.theano/compiledir_Linux-3.2--virtual-x86_64-with-debian-wheezy-sid-x86_64-2.7.10-64/lazylinker_ext/lazylinker_ext.so /home/kcy1019/.theano/compiledir_Linux-3.2--virtual-x86_64-with-debian-wheezy-sid-x86_64-2.7.10-64/lazylinker_ext/mod.cpp -L /home/kcy1019/.pyenv/versions/2.7.10/lib -lpython2 .7
/usr/bin/ld: /home/kcy1019/.pyenv/versions/2.7.10/lib/libpython2.7.a( abstract.o) : relocation R_X86_64_32S against ` _Py_NotImplementedStruct' can not be used when making a shared object; recompile with -fPIC
/home/kcy1019/.pyenv/versions/2.7.10/lib/libpython2.7.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
이건 Python을 재설치해야 해결 가능한 문제인데.. 다행히 우리에겐 pyenv 가 있기 때문에 비교적 쉽게 할 수 있다.
이 문제의 원인은 Python을 설치할 때 shared library를 사용하겠다는 flag를 주지 않고 컴파일해서 설치했기 때문이다.
따라서 다음과 같이 flag를 설치하고 Python을 설치하면 된다.
$ export CONFIGURE_OPTS = "--enable-shared"
$ export PYTHON_CONFIGURE_OPTS = "--enable-shared"
$ pyenv uninstall 2.7.10
$ pyenv install 2.7.10
Python의 설치가 끝나면, 해당 Python으로 theano를 설치/실행해보자. 감동적이게도 아무런 에러가 나지 않는다!
Theano 의 multicore 이용
하지만 감동도 잠깐, Theano를 테스트해보면…
# 경로는 자신의 pyenv에 맞게 수정
$ python ~/.pyenv/versions/soma/lib/python2.7/site-packages/theano/misc/check_blas.py -q &
$ htop # 없으면 설치하는걸 추천. CPU 및 메모리 사용 현황을 확인할 때 매우 편리하다.
슬프게도 코어를 2개만 사용하는 것을 확인할 수 있는데,
다행히도 이는 Python을 건드리지 않고 OpenBLAS 를 설치함으로써 해결할 수 있다.
아무래도 기본적으로 설치한 libblas는 multicore 지원을 제대로 하지 않아서 그런것 같다.
$ git clone https://github.com/xianyi/OpenBLAS.git
# 15는 자신의 상황에 맞게 수정
$ export OMP_NUM_THREADS = 15
$ export OPENBLAS_NUM_THREADS = 15
$ make
# 사실 여기서 굳이 sudo로 설치하지 않고, 자신의 home 아래에 설치해도 되지만
# 일단 여기선 다루지 않겠다(어차피 설정법은 같을테니 직접 해보길 추천한다).
$ sudo make PREFIX = /usr/local install
$ cat >> ~/.theanorc << EOF
[blas]
ldflags = -lopenblas
EOF
# 마지막으로 아래의 두 가지 중 한 가지를 하면 된다.
$ sudo bash -c 'echo "include /usr/local/lib" >> /etc/ld.so.conf'
# 또는
$ echo "export LD_LIBRARY_PATH=/usr/local/lib" >> ~/.bashrc
$ source ~/.bashrc
이제 아까처럼 Theano를 테스트해보면..! multicore를 제대로 사용하는 것을 볼 수 있다.
$ python ~/.pyenv/versions/soma/lib/python2.7/site-packages/theano/misc/check_blas.py -q &
$ htop