Python環境を構築する過程でPython仮想環境にNumPyとSciPyを組み込んだ。どちらもPythonでプログラム開発をやるには必須のライブラリだが、この2つについて調べるうちに、OpenBLASというオープンソースの線形計算ライブラリが存在し、このライブラリを組み込んでビルドするとNumPyとSciPyを高速化できるらしいことを知った。これにトライしてみたら成功したので、その作業記録を書いておく。■OpenBLASを組み込んだNumPyとSciPyのビルドすでにNumPyとSciPyをインストール済みだったので、まずは、「pip」コマンドを使ってこの2つのライブラリをアンイストールした。(0.1.2)続いて、Homebrewに新しいGitHubリポジトリを追加した。samueljohn/pythonOpenBLASについてググっているうちに、OpenBLASを組み込んでNumPyとSciPyをビルドできるフォーミュラ定義ファイルがこのsamueljohn/pythonリポジトリに存在しているのを見つけた。PACKAGE」コマンドを使って、手動でコンフィグレーション定義に変更を加えながらOpenBLASを組み込んでビルドする方法もある。実際にこの方法も試してみたが、かなり面倒な手順だったので、Pythonライブラリのビルドに慣れていない人には勧められない。上のリポジトリを利用すれば、簡単にOpenBLASを組み込むことができる。このリポジトリを追加すると、Homebrewを使ってNumPyとSciPyをPython環境へインストールできるようになる(この2つ以外に、PillowやmatplotlibなどのいくつかのPythonライブラリのフォーミュラも追加される)。support上のNumPyのフォーミュラ情報から、このNumPyはsuite-sparseというフォーミュラに依存していることが判る。用の疎行列演算ライブラリの詰め合わせパッケージ。suite-sparseとopenblasはいずれもhomebrew/scienceリポジトリに所属しているフォーミュラだ。したがって、NumPyやSciPyにこれらを組み込むには、あらかじめ下のコマンドによってhomebrew/scienceリポジトリをHomebrewに登録しておかなければならない。homebrew/scienceOpenBLASを有効にしてNumPyとSciPyをインストールするには、次のコマンドを実行すれば良い。--with-openblasただし、先にnose(Python用単体テストフレームワーク)ライブラリをインストールしておく必要がある。nosenumpyフォーミュラがnoseライブラリを要求してくるからだ。Python環境にnoseが入っていない状態でnumpyをインストールしようとすると、下のようなエラーメッセージが表示される。openblas(「--with-openblas」オプションを指定した場合のみ)も一緒にインストールされる。上の操作を行った後で、numpyとscipyライブラリがPython環境にちゃんと入っているか確認してみた。(0.1.2)■NumPyとSciPyの動作速度計測OpenBLASを組み込んだNumPyとSciPyがどれ位高速になっているか確認してみた。Gistページに掲載されている2つのPythonプログラムを利用させてもらった。sec上の動作速度計測を行った環境は次のとおり。0.12.0上の2つのケースの計測値を比較すると、次のような非常に興味深い結果になった。OpenBLASを組み込んだ後の方が若干速いググっていたときに、OpenBLASを組み込んだらNumPy/SciPyが2〜3倍速くなったいう情報をいくつか見かけたが、期待していたほど速くなっていない。これらの情報は多分Linux環境での話なんだろう。NumPyではOpenBLASを組み込む前の方がずっと高速だ。Frameworkに含まれる線形計算ライブラリが使われている。x86ならSSE)を利用して動作するようになっている。上のような結果になる理由は、このApple製のライブラリが相当優秀だからではないかと推測できる。この結果を受けて、OpenBLASの採用について次のようにすることに決めた。OpenBLASを組み込むという訳で、NumPyとSciPyのインストールを再度やり直した。--with-openblasSciPyも一旦アンイストールしたのは、このフォーミュラがNumPyに依存しているからだ。■NumPyとSciPyの動作テスト以上でOpenBLASを組み込んだNumPyとSciPyのインストールは終了だが、せっかくnoseを入れたので、noseを使ったNumPy/SciPyの動作テストもやってみた。Pythonライブラリの動作テストを簡単に行うことができるので、noseはとても有益なライブラリだ。先に、OpenBLASを組み込む前、つまり「pip」コマンドを使ってオプション指定なしでNumPy/SciPyをインストールした場合の動作テストの結果を載せておく。quit()NumPyの結果は「OK」だが、SciPyの方は「FAILED」になっていた。続いて、OpenBLASを組み込んだ後のNumPy/SciPyの動作テスト結果を示す。quit()両方の結果が「OK」になっている。じつは、上のOpenBLASを組み込む前のSciPyの動作テスト結果が「FAILED」だったことが気になって、この問題の解決方法がないかと探しているうちに、OpenBLASの存在に行き着いた。今回利用したsamueljohn/pythonリポジトリのNumPyとSciPyのフォーミュラ定義ファイルにはtestメソッドが定義されており、そのメソッドに上と同じnoseの「test()」関数を呼び出す処理が実装されている。numpyフォーミュラのインストール時にnoseライブラリを要求してくるのはこれが理由だ。FORMULA」というコマンドをタイプすれば、指定したフォーミュラのtestメソッドを実行することができる。上では「show_config()」という関数も使っているが、この関数を呼び出すと、NumPy/SciPyのコンフィグレーション情報を確認することができる。この情報を比較すると判るが、OpenBLASを組み込んだSciPyにはumfpackとamdという2つの外部ライブラリも一緒に追加されている。この2つのライブラリはSuiteSparseというフォーミュラの中に含まれているもので、numpyフォーミュラをインストールしたときにリンクされる。「show_config()」関数で表示されるコンフィグレーション情報の中に現れる用語の意味を下に示しておく。Library特定のCPUに最適化された数値演算ライブラリ(Intel社のMKLやAMD社のACMLが有名)OpenBLASを組み込んでもNumPy/SciPyの動作速度が大きく改善しなかったのは残念だったが、SciPyの動作テス結果が「FAILED」から「OK」に変わった瞬間は「よし。やったぜ」と叫んでしまった。[必須入力]※画像の中の文字を半角で入力してください。