まんぼう日記

takataka's diary

続 Theano + CUDA

例によって余計な枕から

今日は朝から事務仕事.自分の研究室の今年度の某予算の費目毎の支出状況を確認したり,今後のお買い物計画を見直したり.当初の計画になかった 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 と似てるけど,

  1. T.dmatrix じゃなくて T.matrix 使ってる
  2. a, b 二つの array の dtype を theano.config.floatX で指定してる
  3. 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 とかに浮気しちゃおうかしら.