Anaconda & NumbaPro 使ってみた

7,352 views
6,905 views

Published on

関東GPGPU勉強会#2 発表スライド

Published in: Technology
0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,352
On SlideShare
0
From Embeds
0
Number of Embeds
258
Actions
Shares
0
Downloads
32
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide

Anaconda & NumbaPro 使ってみた

  1. 1. June 1, 2013Anaconda & NumbaPro 使ってみた関東GPGPU勉強会#2
  2. 2. お前、誰よ✤ おのうえ@最近GPGPUやってない✤ 京都の大学で博士課程の学生やってます✤ 関西GPGPU勉強会の主宰とかしてます
  3. 3. 今日のネタGPGPUによる高速化をPythonでお手軽にやる
  4. 4. ✤ PyCUDA✤ PyOpenCL✤ TheanoPythonでGPGPUといえばimport pyopencl as climport numpyimport numpy.linalg as laa = numpy.random.rand(50000).astype(numpy.float32)b = numpy.random.rand(50000).astype(numpy.float32)ctx = cl.create_some_context()queue = cl.CommandQueue(ctx)mf = cl.mem_flagsa_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a)b_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b)dest_buf = cl.Buffer(ctx, mf.WRITE_ONLY, b.nbytes)prg = cl.Program(ctx, """__kernel void sum(__global const float *a,__global const float *b, __global float *c){int gid = get_global_id(0);c[gid] = a[gid] + b[gid];}""").build()prg.sum(queue, a.shape, None, a_buf, b_buf, dest_buf)a_plus_b = numpy.empty_like(a)cl.enqueue_copy(queue, a_plus_b, dest_buf)print la.norm(a_plus_b - (a+b))
  5. 5. 1年ぐらい前にこんなことを言ってる人がいた気がする
  6. 6. 関東GPGPU勉強会 「LLVM meets GPU」
  7. 7. ✤ PythonのコードからGPUで実行できるバイナリをLLVMで生成PythonLLVM IR(NVVM IR)PTXNVIDIAGPUCUDA Compiler SDKLLVM meets GPUでやってたこと
  8. 8. こんな感じのコードが動くimport numpy as npfrom pynvvm.kernel import kernelfrom pynvvm.nvtype import array, float32, int32@kernel(array(float32), array(float32), array(float32), float32(), int32(), int32())def saxpy(z, x, y, a, w, h):xidx = pynvvm_ctaid_x() * pynvvm_ntid_x() + pynvvm_tid_x()yidx = pynvvm_ctaid_y() * pynvvm_ntid_y() + pynvvm_tid_y()if yidx < h and xidx < w:i = yidx * w + xidxz[i] = a * x[i] + y[i]def gpu(x, y, a, n):z = np.zeros_like(x)bsz = (16, 16, 1)gsz = ((n+16-1)/16, (n+16-1)/16, 1)saxpy(bsz, gsz)(z, x, y, a, np.int32(n), np.int32(n))return zif __main__ == __name__:n = 1024x = np.random.randn(n*n).astype(np.float32)y = np.random.randn(n*n).astype(np.float32)a = np.float32(2.71828183)gpu (x, y, a, n)
  9. 9. 時は過ぎ…
  10. 10. CUDAがPythonでサポート!✤ 習得や利用が容易なPythonでGPGPU!✤ Pythonの柔軟性、高生産性とGPGPUの高性能を両立!✤ 充実したPythonのライブラリでHPCなどのアプリケーション!
  11. 11. CUDAがPythonでサポート?✤ PyCUDA / PyOpenCL / Theanoは?✤ Pythonコンパイラ?✤ Wakariというブラウザベースのデータ探索・コード開発環境の一部?
  12. 12. こいつが何者なのか調べてみた
  13. 13. Anaconda✤ Continuum Analytics社の製品✤ Python本体と科学技術計算、可視化のライブラリを含んだディストリビューションパッケージ✤ 無料✤ Win / Mac OSX / Linux 対応
  14. 14. Anaconda Accelerate✤ Anacondaのプラグインみたいな商用製品✤ GPUやマルチコアプロセッサでPython & numpyの処理を高速化✤ NumbaPro✤ LLVMによるPython-to-GPU compiler✤ compute capability 2.0以上のNVIDIA GPU✤ $129、30日間フリートライアル、アカデミックフリー
  15. 15. AnacondaのInstall✤ http://continuum.io/downloads.html✤ Windows✤ インストーラー✤ Mac OSX / Linux✤ シェルスクリプトを実行$ sh Anaconda-1.5.1-MacOSX-x86_64.sh
  16. 16. Anacondaの使い方✤ Anacondaインストール先のbin/activateを実行すればPATHの設定等をいい感じにしてくれる$ source ~/anaconda/bin/activate
  17. 17. Accelerateのインストール✤ condaコマンドを使う✤ この時点でフリートライアルが有効化✤ ライセンスファイルを指定された場所に置く$ conda update conda$ conda install accelerate
  18. 18. NumbaProを使ってみるimport numpyfrom numbapro import cuda, int32@cuda.jit(argtypes=[int32[:], int32[:], int32, int32, int32])def dpstep(current, next, pj, wj, c):i = cuda.blockDim.x * cuda.blockIdx.x + cuda.threadIdx.xif i <= c:if i >= wj:val = current[i - wj] + pjnext[i] = current[i] if current[i] >= val else valelse:next[i] = current[i]def dp_numbapro(p, w, c):num_threads = 1024num_blocks = (c + 1) // num_threadsif (c + 1) % num_threads:num_blocks += 1current = numpy.zeros(c + 1, dtype=numpy.int32)next = numpy.empty_like(current)dev_current = cuda.to_device(current)dev_next = cuda.to_device(next)for pj, wj in zip(p, w):dpstep[num_blocks, num_threads](dev_current, dev_next, pj, wj, c)dev_current, dev_next = dev_next, dev_currentdev_next.to_host()dev_current.to_host()return current[-1]
  19. 19. 機能をざっと見る✤ PythonコードをGPUにJITコンパイル✤ vectorize✤ deviceマネジメント✤ cuRAND、cuFFT、cuBLASもサポート
  20. 20. サンプル動かしてみる
  21. 21. blackscholes計算時間(秒)NumpyNumbaNumbaPro1485.27830.1881.5503757501,1251,500numpyNumbaNumbaPro
  22. 22. monte_carlo_pricer計算時間(秒)NumpyNumbaNumbaPro11.2911.310.3703.757.511.2515NumpyNumbaNumbaPro
  23. 23. laplace2d計算時間(秒)numpynumbanumbapro-gpunumbapro-gpu-smemnumbapro-gpu-improve80000 ~3000 ~143.24138.367.5202505007501,000numpynumbanumbapro-gpunumbapro-gpu-smemnumbapro-gpu-improve
  24. 24. はやい(小並感)
  25. 25. PyCUDAと比べるとどうよ?
  26. 26. ナップザック問題を解いてみる✤ Pure Python、PyCUDA、NumbaProで実装し計算時間を比較✤ 問題規模のパラメータn, R✤ 計算量 O(n^2 * R / 4)
  27. 27. n=500, R=1000.3750.751.1251.5Pure PythonNumbaProPyCUDA計算時間(秒)高速化率Pure Python比PurePythonNumbaProPyCUDA1.450 1.00.056 25.90.018 80.6
  28. 28. n=1000, R=100000.0380.0750.1130.15NumbaProPyCUDA計算時間(秒)PurePythonNumbaProPyCUDA-0.1260.047
  29. 29. n=1000, R=1000000.0750.150.2250.3NumbaProPyCUDA計算時間(秒)PurePythonNumbaProPyCUDA-0.2700.072
  30. 30. はい…
  31. 31. チュ|ニングすることができません私が無能なばかりに、ただいたずらにYAMADA Systemの計算リソースを消費し、NumbaProの真の性能を突き止めることが、できませんでしたぁぁ!
  32. 32. まとめ✤ NumbaProで、Python / numpyで遅い処理を簡単に高速化できる✤ PyCUDA速い(白目✤ NumbaPro先生の今後のご活躍に期待します✤ 見た目上全部Pythonで書けるのは素敵✤ CUDA以外のバックエンドにも期待
  33. 33. おまけ
  34. 34. Wakari✤ Pythonクラウド!✤ ブラウザからPythonでHPCができる✤ AWSバックエンド✤ そのうちCUDAがサポートされるらしい
  35. 35. 最後に
  36. 36. 関西GPGPU勉強会#4 ハッカソン✤ 和室でゴロゴロしながらプログラム高速化する会✤ 日時 : 8 月 17日 (土) 9:30 ~ 17:00✤ 場所 : 大阪市立城北市民学習センター 和室✤ 募集ページ : http://connpass.com/event/2574/
  37. 37. 質問?

×