例によって余計な枕から
今日は朝から事務仕事.自分の研究室の今年度の某予算の費目毎の支出状況を確認したり,今後のお買い物計画を見直したり.当初の計画になかった MacBook Air 6台(学生用)を買ったので,予定してた自分のメインマシンの更新をどうしようか,とか.
そんでちょっと計算してみると,消耗品費削ったらなんとかなりそうな気が….Mac Pro 買えるかな,いや,画像認識/検索の研究してるとごっついメモリ欲しくなるから128GB位積んだLinux機か,それともごっついGPU積んだのんにするか,とあれこれ妄想.物欲全開です.ぐふふ….で,ウェブで60万円のPCの見積もりをとった後で,予算総額を多目に勘違いしてたことに気づきました.あうー….ごっついのんはまた今度ね.
ここから本題
気を取り直して夏休みの自由研究のつづきをちょっと.もう夏休みも終わりやのにふらふらしてますが,
あたりの続きのようなそうでもないところでさらに迷走 (^^)
Theano + CUDA - まんぼう日記 の時は MacBook Pro に CUDA + Theano を入れて試したらちょっと変なことになったわけですが,上記物欲全開時に,自分のメインマシンもCUDA capable なGPU積んでることを思い出しました.すっかり忘れてましたがな.
- iMac 27-inch, Late 2012
- CPU: Intel Core i7 3.4GHz (Quad Core)
- メモリ: 32GB 1600MHz DDR3
- GPU: NVIDIA GeForce GTX 675MX 1024MB
こいつに CUDA 6.5 Production Release と Theano(MacPorts の py27-theano@0.6.0_1)をインストールしたら,MacBook Pro の時みたいな変なことは一切せずにすんなり Theano で GPU 使えちゃいました.Theano + CUDA - まんぼう日記 に書いた二つの対処法(~/.theanorc を書く& nvcc_compile.py に手を入れる)のいずれも必要ありませんでした.なんや.
そういうわけで,次のプログラム theano0908.py を使って実験.Numpy / Theano で行列の積を高速に計算するには - まんぼう日記 の theano0905.py と似てるけど,
- T.dmatrix じゃなくて T.matrix 使ってる
- a, b 二つの array の dtype を theano.config.floatX で指定してる
- time.clock() ではなく time.time() で時間計測してる
ってとこが違ってます.
import time import numpy as np import theano import theano.tensor as T A = T.matrix( 'A' ) B = T.matrix( 'B' ) AB = T.dot( A, B ) f = theano.function( [A, B], AB ) N = 2000 a = np.asarray( np.random.rand( N*N ).reshape( ( N, N ) ), theano.config.floatX ) b = np.asarray( np.random.rand( N*N ).reshape( ( N, N ) ), theano.config.floatX ) t_start = time.time() c = np.dot( a, b ) t_elapsed = time.time() - t_start print 'N = ', N, 'elapsed time for np.dot() [sec] = ', t_elapsed t_start = time.time() d = f( a, b ) t_elapsed = time.time() - t_start print 'N = ', N, 'elapsed time for theano [sec] = ', t_elapsed
結果は次のようになりました.
CPUで計算した場合
$ THEANO_FLAGS=mode=FAST_RUN,device=cpu,floatX=float32 python theano0908.py
N = 2000 elapsed time for np.dot() [sec] = 0.108350992203 N = 2000 elapsed time for theano [sec] = 0.118005990982 N = 5000 elapsed time for np.dot() [sec] = 1.66779589653 N = 5000 elapsed time for theano [sec] = 1.59694981575 N = 10000 elapsed time for np.dot() [sec] = 12.4607598782 N = 10000 elapsed time for theano [sec] = 12.5727579594
np.dot() も theano の f もCPUを使って行列の積を計算する場合です. Numpy / Theano で行列の積を高速に計算するには - まんぼう日記 でも観察したように,両者に差はありません.
GPUで計算した場合
$ THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python theano0908.py
Using gpu device 0: GeForce GTX 675MX N = 2000 elapsed time for np.dot() [sec] = 0.118518829346 N = 2000 elapsed time for theano [sec] = 0.0657360553741 N = 5000 elapsed time for np.dot() [sec] = 1.6408469677 N = 5000 elapsed time for theano [sec] = 0.661233901978 N = 10000 elapsed time for np.dot() [sec] = 12.3811430931 Error allocating 400000000 bytes of device memory (out of memory). Driver report 184778752 bytes free and 1073414144 bytes total
こちらは,theano の方だけGPU使って計算してます.ご覧の通り,GPU使うことでより高速に計算できてることがわかります.N = 10000 の時は,GPUの空きメモリ容量が足りなくて動きませんでした.1GBのうちほとんどが本来のグラフィックスカードとしての仕事に使われてるみたいですね.
じゃあ Pylearn2 の convolutional net の tutorial サンプルも動いたりして?
って試したら( cf. Pylearn2 の tutorial でお勉強 - 4時間目 - まんぼう日記 ),やぱし Segmentation fault...むむー.
なんやぁ,期待したのに.もう,Caffe とか
Accelerate Machine Learning with the cuDNN Deep Neural Network Library | Parallel Forall とかに浮気しちゃおうかしら.