研究室でいろいろ悲しい事情があり、ガチのニューラルネットワークをフルスクラッチで書いています。

ちゃんと勉強して今はなんとなくかけるようになったのですが、ネットワークが大きくなっていくうちにだんだん実行時間で悩まされるようになりました。

パラメータを調整したいので実行時間がかかると研究の進みに支障が出てくる。

今は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

np: 0.001417398452758789
cp: 0.0008680820465087891

恩恵が少ないですね。

次はn=100

np: 0.013559579849243164
cp: 0.0023317337036132812

ここらへんになるとCupyがマストなきがしてきます。

n=1000は

np: 0.19229507446289062
cp: 0.00169658660888671

いい感じですね。Cupyの方の速度が上がっているのはたまたまだと思います。

10000*10000で試したんですけど

out of memory to allocate 800000000 bytes (total 2000000000 bytes)

てでたので諦めます。GPU内のメモリーの問題でしょうか・・・。

n=5000では

np: 6.1580588817596436
cp: 0.00854039192199707

 

もっと大きな行列を扱えばもっと恩恵を得られるんでしょうけど、GPU的に限界のようですし、そんなに大きな行列は扱わないのでここまでにしておきます。

とりあえず、バッチ化を検討するつもりです。

 

それでは。