NumPy, SciPyをちゃんとインストールする(CentOS+Python2.7+easy_install)
研究室に新しくRedHatの計算機が来るそうなので、自分のMacBookにVirtualBoxを使用してCentOSを入れて自分の環境づくり&来年入って来る後輩にPythonを布教するための練習メモ。
目標:システムとは別のPythonをソースからインストール。yumでATLAS、easy_installでnumpyとscipyをインストールしてちゃんとATLASを使用するnumpy, scipy環境を構築する
1. NumPy, SciPy
RedHat, CentOSだとyumでインストールできるnumy, scipyがPython2.6と古く、システムで使ってるものを汚さない方がいいと思うので自分のユーザローカルにPython2.7を入れて、安定版のnumpyとscipy(執筆当時は1.6.1と0.10.0)をインストールします。
numpyとscipyは行列を高速に計算してくれるモジュールですが、その理由は裏でfortranとかを使いつつ超高速な計算ライブラリを呼び出してるからです。
numpy, scipyは
を使用します。この2つは計算分野でスタンダードになっていて、様々な科学計算ライブラリで使用されているようです。この2つが最適にコンパイルされていることは計算速度に直結するため、色々な企業がこの2つを独自に最適なコンパイルをして実装しています。
フリーで有名なのは
- ATLAS: オープンソースの計算ライブラリ
- MKL(Intel Math Kernel Library): インテルが販売してる有料の計算ライブラリ。ただし学術的な利用に限ってフリー版があるらしい
- Accelerate Framework: MacでXcodeをインストールすると付いてくるAppleの計算ライブラリ
MacならScipy-superpackでインストールするとAccelerate Frameworkを使うようにインストールしてくれるので何の問題もないです。(久しぶりに探したらNot Foundになってました・・・Macで新しく環境構築するときはめんどくさくなるな(-_-;)
LinuxならATLASかMKLになります。速度を求めるならMKLですが、そんなに高度な計算をするわけではないのでATLASにします。
ATLASはコンパイル済みのものがyumから落とせますが、速度を求めるなら自分の環境に合うようにコンパイルする方がいいみたいです。でもコンパイルの方法を調べてもよく分からないし、高度な計算をするわけでは(ry
ちゃんとソースからインストールしたい方はこのあたりを参考にすると良さそうです
http://www.scipy.org/Installing_SciPy/Linux
http://www.kkaneko.com/rinkou/linux/atlaslinux.html
Numpy, ScipyもソースからコンパイルしようとするとATLASのパスを設定したりとか色々めんどくさそうなので、easy_installでお手軽インストールします。
2. Python2.7のインストール
計算機の自分のアカウントで使用するPython2.7をインストールする。numpy, scipyのインストールだけが目的の方はここは飛ばしてください。
#もしも無ければgccをインストールしておく yum install gcc #Python2.7を自分のディレクトリにインストール cd /home/自分のユーザ名 mkdir src cd src wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2 tar -xvjf Python-2.7.2.tar.bz2 cd Python-2.7.2 ./configure --prefix=/home/自分のユーザ名/python2.7.2 make
ここで色々なモジュールが無いと言われるかもしれないので、必要なものがあるならyumでインストールしておく。zlib-develは後のeasy_installに必要なので必須。自分はsqlite3とopensslを使いたいのでこれらもインストールします。
yum install zlib-devel sqlite-devel openssl-devel make make install cd /home/自分のユーザ名/python2.7.2 ./bin/python ./bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory #何か足りないらしいので調べます ldd ./bin/python #ずらーっと出る中でlibpython2.7.so.1.0がnot foundなので、他のと同じディレクトリにコピーしてやる #(このやり方でいいのか怪しいかも。そのサーバで一人しか使わないのならシンボリックリンクでもOK?) cp ./lib/libpython2.7.so.1.0 /lib64/ ./bin/python
これで動くはず
このままだとpythonコマンドはシステムのpythonを呼び出すままなので、
cd /home/自分のユーザ名 vi .bashrc export PYTHONPATH=/home/自分のユーザ名/python2.7/lib/python2.7/site-packages/ export PATH=/home/自分のユーザ名/python2.7/bin:$PATH
の2行を追加。デフォルトのpythonコマンドのパスの前に自分のpython2.7のパスを通すので、再ログインするとpythonコマンドで自分のpythonを呼び出すようになります。
自分のpythonでeasy_installを使えるようにします
wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg sh setuptools-0.6c11-py2.7egg --prefix=/home/自分のユーザ名/python2.7
3. ATLAS, numpy, scipyのインストール
まずSSE命令が使えるか確認します
cat /proc/cpuinfo
#自分の環境ではこんな感じでした
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36
clflush mmx fxsr sse sse2 syscall nx lm constant_tsc up rep_good pni monitor ssse3 lahf_lm
SSE3が使えるらしいのでatlas-sse3-develをインストールする。SSEの数字が大きいほど多分速い。numpy, scipyのコンパイルにfortranのコンパイラが必要なのでgfortranもインストールする
yum install atlas-sse3-devel gcc-gfortran #numpyとテストに使用するnoseのインストール easy_install nose numpy #かなり盛大に警告とか出るけど気にしない
>>>import numpy >>>numpy.show_config() atlas_threads_info: libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')] language = f77 include_dirs = ['/usr/include'] blas_opt_info: libraries = ['ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')] language = c include_dirs = ['/usr/include'] atlas_blas_threads_info: libraries = ['ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')] language = c include_dirs = ['/usr/include'] lapack_opt_info: libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')] language = f77 include_dirs = ['/usr/include'] lapack_mkl_info: NOT AVAILABLE blas_mkl_info: NOT AVAILABLE mkl_info: NOT AVAILABLE >>>numpy.test() #自分の環境ではテスト成功。ATLASも使われてるっぽい。mklは入っているわけないので仕方ない。
#scipyのコンパイルにはg++(gcc-c++)が必要 yum install gcc-c++ #scipyのインストール easy_install scipy
自分の環境ではnumpyよりかなり盛大に警告とか色々出たけど大丈夫なのか・・・
>>>import scipy >>>scipy.show_config() umfpack_info: NOT AVAILABLE atlas_threads_info: libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')] language = f77 include_dirs = ['/usr/include'] blas_opt_info: libraries = ['ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')] language = c include_dirs = ['/usr/include'] atlas_blas_threads_info: libraries = ['ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')] language = c include_dirs = ['/usr/include'] lapack_opt_info: libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas'] library_dirs = ['/usr/lib64/atlas-sse3'] define_macros = [('ATLAS_INFO', '"\\"3.8.4\\""')] language = f77 include_dirs = ['/usr/include'] lapack_mkl_info: NOT AVAILABLE blas_mkl_info: NOT AVAILABLE mkl_info: NOT AVAILABLE #numpyになかったumfpackがNOT AVAILABLEになってる。 #コンパイルのときにも何か言われてたような気がします。 >>>scipy.test()
自分の環境ではFAILED。umfpack関係だろうか?failures=8だから自分がその機能を使わなきゃ大丈夫かな。調べたらumfpackは疎行列の線形方程式を解いたりするようなパッケージらしい。自分では今のところ使うつもりがないので放っておこう。
多分これでちゃんとATLASを使うnumpy, scipyのインストールができたはず。そもそも最新のfedoraとかubuntuならPython2.7でもyumとかapt-getで一発なんですけどねー。
[2012/2/4 追記]
numpyのソースをダウンロードしてsite.cfg.exampleを見てみたら、特に設定しないとデフォルトでATLASを使うような設定になっているみたいです。