2015/06/24(水)INTLAB version 9をubuntu上のoctaveで使う
INTLABは、http://www.ti3.tu-harburg.de/rump/intlab/で、50ユーロで購入できます。有償なのが残念ですが、PayPal経由で支払いを済ませると一時間だけ有効なダウンロードリンクがメールで送られてきます。ダウンロードしたファイルは完全にソースコードを見ることができます。また、Linux/Mac/Windows用、あるいはmatlab用/octave用といった区別はなく、すべてこのファイルでOKです。
octaveのインストールは、ubuntu 14.04で、
sudo apt-get install octave sudo apt-get install octave-doc sudo apt-get install octave-htmldoc sudo apt-get install liboctave-devのように行いました。特に最後のliboctave-devが必要なことに注意してください。また、ubuntu 14.04でBLASを使うの記事のようにATLASやopenblasを導入すれば、octaveから使われるBLASがそれに置き換わります。openblasを入れることをお勧めします。
ダウンロードした INTLAB.zip を任意のdirectoryに展開します。例えば ~/Intlab_V9/ としましょう。まず、octaveを起動し、必要ならば cd Intlab_V9 などとしてINTLAB directoryに移動し、
startintlabと実行します。これは、そこのdirectoryにある startintlab.m を実行しています。うまく行けば、これだけでintlabが使える状態になる筈です。初回起動時は、裏で
- Intlab_V9/setround/octave/setround.mex
- Intlab_V9/INTLAB_Data_Intlab_Version_9_x86_64-pc-linux-gnu3_8_1.mat
実際に区間演算をしてみます。T先生からの挑戦状で計算した例題です。
octave:1> format long octave:2> x=intval(1); octave:3> y=intval(1); octave:4> for i=2:10; z=(1+2*y)/(x*y^2); x=y; y=z; i, z, end i = 2 intval z = 3.00000000000000 i = 3 intval z = 0.77777777777777 i = 4 intval z = 1.40816326530612 i = 5 intval z = 2.47448015122873 i = 6 intval z = 0.68995395922102 i = 7 intval z = 2.0203934747424_ i = 8 intval z = 1.7898074714308_ i = 9 intval z = 0.7075878600520_ i = 10 intval z = 2.69514211796___ octave:5>のように計算出来ました。最初の intval を affari に変更すればaffine arithmeticで計算させることもできます。
また、行列積を計算させてみると、
octave:1> a=rand(5000);b=rand(5000); octave:2> tic;a*b;toc Elapsed time is 3.20024 seconds. octave:3> tic;intval(a)*b;toc Elapsed time is 8.66678 seconds.くらいでした。core i7 4770Kですがvmwareを挟んでいるので生で使うと更に速いでしょう。
なお、octave起動時に毎回startintlabを実行させるのは面倒なので常時実行させるには、
- /usr/share/octave/site/m/startup/octaverc
- home directoryの.octaverc
- current directoryの.octaverc
addpath('/intlabを入れたパス/Intlab_V9') startintlabと書いておけば良さそうです。
余談ですが、octave起動時に
octave --force-guiとすると、
のような感じで起動します。変数一覧とか見られて便利そう。
openblasで丸め変更に問題はないかとか、検証する必要はあるかと思います。
自分はmatlab嫌いなものでINTLABの使い方はよく分かっていませんが、お楽しみ下さい。
2015/06/21(日)ubuntu 14.04でBLASを使う
BLASは、Basic Linear Algebra Subprogramsの略で、行列積などの基本的な行列計算のためのライブラリです。LAPACKなどの様々なプログラムから呼び出されます。行列計算は環境によって最適な書き方が違うので、行列計算の部分を差し替え可能なように分離しておきユーザが最適なBLASに差し替えて最高の性能を出す、ということを意図しています。
多くの環境で、デフォルトのBLASは単なるfor文で書かれたちっとも速くない「reference BLAS」と呼ばれるものになっています。自分の環境でも、reference BLASが入っていました。この場合例えばnumpyの行列計算は、全くCPU本来の性能を出せていません。
ubuntu 14.04では、atlasとopenblasという高速なBLASがパッケージで提供されています。今回は、それらをインストールしてnumpyの速度がどうなるか調べてみました。
インストールは次のように行いました。
sudo apt-get install libatlas-base-dev sudo apt-get install libatlas-doc
sudo apt-get install libopenblas-base sudo apt-get install libopenblas-devこれで3種類のBLASがインストールされたことになりますが、これらは差し替えて使うことを意図しているのでshared libraryとして同一のファイル名になっています。Ubuntuでは、これらをsymbolic linkを張り直すことによって使い分ける仕組みがあります。
sudo update-alternatives --config libblas.so.3と入力すると、
% sudo update-alternatives --config libblas.so.3 alternative libblas.so.3 (/usr/lib/libblas.so.3 を提供) には 3 個の選択肢があり>ます。 選択肢 パス 優先度 状態 ------------------------------------------------------------ * 0 /usr/lib/openblas-base/libblas.so.3 40 自動モード 1 /usr/lib/atlas-base/atlas/libblas.so.3 35 手動モード 2 /usr/lib/libblas/libblas.so.3 10 手動モード 3 /usr/lib/openblas-base/libblas.so.3 40 手動モード 現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください:のように表示され、どのBLASを使うか選択することができます。単にインストールした場合はUbuntuが定めた優先度に従って選ばれるようで、openblasが選択された状態でした。
これを切り替えてnumpyで5000x5000の逆行列を計算させてみて、速度がどうなるか計測してみました。環境は、core i7 3770T で、VMwareを使ってメモリを4G、CPUコアを4個与えた状態で行いました。
まずreference BLASで。
% python >>> from numpy import * >>> from time import * >>> a=random.rand(5000,5000); t=time(); a=linalg.inv(a); time()-t 241.60200095176697このように241秒かかりました。
ATLASに切り替えてみました。
% python >>> from numpy import * >>> from time import * >>> a=random.rand(5000,5000); t=time(); a=linalg.inv(a); time()-t 32.5946981906890932秒に高速化されました。しかし、topでCPUを見ると100%となっており、どうやら一つのコアしか使っていないようです。
最後にopenblasです。
% python >>> from numpy import * >>> from time import * >>> a=random.rand(5000,5000); t=time(); a=linalg.inv(a); time()-t 6.0147957801818856秒まで高速化されました。topのCPU表示は400%となり、4コア使って計算しているようです。
もともとテキサス大学の後藤先生という方が開発したgotoblas(ごとうブラス)という高速で有名なパッケージがあったのですが、後藤先生がIntelに移られて開発が中止してしまい、それを有志が引き継いだのがopenblasです。後藤先生は現在はIntelの商用BLASであるMath Kernel Libraryの開発をされているようです。
最後に、ATLASに関して少し注釈を述べておきます。
ATLASはAutomatically Tuned Linear Algebra Softwareの略で、ライブラリのmake時にそのCPUのコア数やキャッシュサイズなどを調査し、それに最適化したライブラリを生成する仕組みです。すなわち、本来バイナリパッケージで入れるには適さないもので、ATLASの真の性能を引き出すには計算を行うCPUでライブラリをmakeし直す必要があります。
また、ATLASはLAPACKの一部を高速化したものを含んでいて、ATLASをインストールするとATLAS版LAPACKがインストールされます。
% sudo update-alternatives --config liblapack.so.3 alternative liblapack.so.3 (/usr/lib/liblapack.so.3 を提供) には 2 個の選択肢があります。 選択肢 パス 優先度 状態 ------------------------------------------------------------ * 0 /usr/lib/lapack/liblapack.so.3 10 自動モード 1 /usr/lib/atlas-base/atlas/liblapack.so.3 5 手動モード 2 /usr/lib/lapack/liblapack.so.3 10 手動モード 現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください:しかし、このように優先度が低くなっており、デフォルトでは使われていません。これがUbuntuの(というかDebianの)開発チームの見解ということでしょうか。