아쉽게도 아직 좋은 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