研究室でいろいろ悲しい事情があり、ガチのニューラルネットワークをフルスクラッチで書いています。
ちゃんと勉強して今はなんとなくかけるようになったのですが、ネットワークが大きくなっていくうちにだんだん実行時間で悩まされるようになりました。
パラメータを調整したいので実行時間がかかると研究の進みに支障が出てくる。
今は10分ちょいなので、10回パラメータ変えて試しても2時間で終わりますが、これが1時間とかになったらやばい。というか、理論的には今出ている案で最悪の場合は10時間超える笑。
研究室には同じような悩みをかかけている人間がいて、openMPやらCUDAやらを使う人間も(CUDAは今はいない)いるんですが、python組でライブラリーをつかてない人間はそういう芸当を持っている人はいなくて、使ってるライブラリーがGPU対応だといいねってかんじでした。
ただ、せっかくpython使ってるんだから、Cupy使えばいいんですよね。
って思ってたんですけど、めんどくさかったり、GPUのドライバーが壊れていたりといままで使ってなかったんです。
ただ、いい加減使おうと持ったので、研究室のメンバー向けに検証を行ったので共有しておきます。
検証プログラム
巷の検証記事はMnist使ってたり、計算が複雑だったりと、いまいち実感が持てないやつばかりだったので、今回はランダムのn*n行列の積を求めるだけのプログラムにしました。
実行環境はubuntu 16.04、GTX 750 Ti 2GB、chainerとCupyのバージョンは知りませんが最新だと思います。
n = 200 t1 = time.time() a = np.random.rand(n,n) b = np.random.rand(n,n) np.dot(a,b) t2 = time.time() a = cp.random.rand(n,n) b = cp.random.rand(n,n) cp.dot(a,b) t3 = time.time() print ('np:',t2-t1) print ('cp:',t3-t2)
繰り返しがあるのはうちの研究室はやたら行列計算をforループ内で使うので一応つけてます。
まずはn=10
恩恵が少ないですね。
次はn=100
np: 0.013559579849243164 cp: 0.0023317337036132812
ここらへんになるとCupyがマストなきがしてきます。
n=1000は
もっと大きな行列を扱えばもっと恩恵を得られるんでしょうけど、GPU的に限界のようですし、そんなに大きな行列は扱わないのでここまでにしておきます。
とりあえず、バッチ化を検討するつもりです。
それでは。