機械学習とその他

機械学習したいマン

chainer以外でのcupyの使用について

アドベントカレンダー8日目です。
今日はcupyについて書いていきたいと思います。

速度比較

今回は、0~300000000までの配列を生成し、それをシグモイド関数に通します。その時の速度を以下の3つで比較します。

def sigmoid(x):
    temp = x.copy()
    for i,x in enumerate(x):
        temp[i] = 1/(1+math.exp(-x))
    return temp

start = time.time()
x = list(range(300000000))
sigmoid(x)
print(time.time()-start)
  • numpyのarangeとnp.exp
def numpy_sigmoid(x):
    return 1/(1+np.exp(-x))

start = time.time()
x = np.arange(300000000)
numpy_sigmoid(x)
print(time.time()-start)
  • cupyのarangeとcupy.exp
def cupy_sigmoid(x):
    return 1/(1+xp.exp(-x))

start = time.time()
x = xp.arange(300000000)
numpy_sigmoid(x)
print(time.time()-start)

実行結果

何秒かかったか以下に示します。

80.69074440002441

  • numpy

5.5577309131622314

  • cupy

0.0005419254302978516

numpyを使うことでかなり早くなってますね。
cupyは異次元です*2

まとめ

やはりGPUを使うと異常に早いですね。
chainer以外にもみなさんつかってみてください。

検証のソースコードは以下になります。

*1:sigmoidの返り値があまりきれいではない。リスト内包表記とかでもう少し早くなりそう

*2:ただしGPU Memoryを7709MB使用した