読者です 読者をやめる 読者になる 読者になる

Kesin's diary

プログラミングの記事がメインです

NumPy, SciPyをちゃんとインストールする(CentOS+Python2.7+easy_install)

研究室に新しくRedHatの計算機が来るそうなので、自分のMacBookVirtualBoxを使用して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は

  • BLAS: 行列のライブラリ
  • LAPACK: 線形方程式ソルバ

を使用します。この2つは計算分野でスタンダードになっていて、様々な科学計算ライブラリで使用されているようです。この2つが最適にコンパイルされていることは計算速度に直結するため、色々な企業がこの2つを独自に最適なコンパイルをして実装しています。

フリーで有名なのは

  • ATLAS: オープンソースの計算ライブラリ
  • MKL(Intel Math Kernel Library): インテルが販売してる有料の計算ライブラリ。ただし学術的な利用に限ってフリー版があるらしい
  • Accelerate Framework: MacXcodeをインストールすると付いてくるAppleの計算ライブラリ

MacならScipy-superpackでインストールするとAccelerate Frameworkを使うようにインストールしてくれるので何の問題もないです。(久しぶりに探したらNot Foundになってました・・・Macで新しく環境構築するときはめんどくさくなるな(-_-;)


追記2011/12/30
別の場所で見つけました。
http://fonnesbeck.github.com/ScipySuperpack/

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を使うような設定になっているみたいです。