Upload
yosuke-onoue
View
5.393
Download
2
Embed Size (px)
DESCRIPTION
関東GPGPU勉強会#2 発表スライド
Citation preview
June 1, 2013
Anaconda & NumbaPro 使ってみた関東GPGPU勉強会#2
お前、誰よ
✤ おのうえ@最近GPGPUやってない
✤ 京都の大学で博士課程の学生やってます
✤ 関西GPGPU勉強会の主宰とかしてます
今日のネタ
GPGPUによる高速化をPythonでお手軽にやる
✤ PyCUDA
✤ PyOpenCL
✤ Theano
PythonでGPGPUといえばimport pyopencl as climport numpyimport numpy.linalg as la
a = 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))
1年ぐらい前にこんなことを言ってる人がいた気がする
関東GPGPU勉強会 「LLVM meets GPU」
✤ PythonのコードからGPUで実行できるバイナリをLLVMで生成
Python LLVM IR(NVVM IR) PTX NVIDIA
GPU
CUDA Compiler SDK
LLVM meets GPUでやってたこと
こんな感じのコードが動くimport numpy as np
from 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 + xidx z[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 z
if '__main__' == __name__: n = 1024 x = 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)
時は過ぎ…
CUDAがPythonでサポート!
✤ 習得や利用が容易なPythonでGPGPU!
✤ Pythonの柔軟性、高生産性とGPGPUの高性能を両立!
✤ 充実したPythonのライブラリでHPCなどのアプリケーション!
CUDAがPythonでサポート?
✤ PyCUDA / PyOpenCL / Theanoは?
✤ Pythonコンパイラ?
✤ Wakariというブラウザベースのデータ探索・コード開発環境の一部?
こいつが何者なのか調べてみた
Anaconda
✤ Continuum Analytics社の製品
✤ Python本体と科学技術計算、可視化のライブラリを含んだディストリビューションパッケージ
✤ 無料
✤ Win / Mac OSX / Linux 対応
Anaconda Accelerate
✤ Anacondaのプラグインみたいな商用製品
✤ GPUやマルチコアプロセッサでPython & numpyの処理を高速化
✤ NumbaPro
✤ LLVMによるPython-to-GPU compiler
✤ compute capability 2.0以上のNVIDIA GPU
✤ $129、30日間フリートライアル、アカデミックフリー
AnacondaのInstall
✤ http://continuum.io/downloads.html
✤ Windows
✤ インストーラー
✤ Mac OSX / Linux
✤ シェルスクリプトを実行
$ sh Anaconda-1.5.1-MacOSX-x86_64.sh
Anacondaの使い方
✤ Anacondaインストール先のbin/activateを実行すればPATHの設定等をいい感じにしてくれる
$ source ~/anaconda/bin/activate
Accelerateのインストール
✤ condaコマンドを使う
✤ この時点でフリートライアルが有効化
✤ ライセンスファイルを指定された場所に置く
$ conda update conda$ conda install accelerate
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.x if i <= c: if i >= wj: val = current[i - wj] + pj next[i] = current[i] if current[i] >= val else val else: next[i] = current[i]
def dp_numbapro(p, w, c): num_threads = 1024 num_blocks = (c + 1) // num_threads if (c + 1) % num_threads: num_blocks += 1 current = 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_current dev_next.to_host() dev_current.to_host() return current[-1]
機能をざっと見る
✤ PythonコードをGPUにJITコンパイル
✤ vectorize
✤ deviceマネジメント
✤ cuRAND、cuFFT、cuBLASもサポート
サンプル動かしてみる
blackscholes
計算時間(秒)
Numpy
Numba
NumbaPro
1485.27
830.18
81.550
375
750
1,125
1,500
numpyNumba
NumbaPro
monte_carlo_pricer
計算時間(秒)
Numpy
Numba
NumbaPro
11.29
11.31
0.370
3.75
7.5
11.25
15
NumpyNumba
NumbaPro
laplace2d
計算時間(秒)
numpy
numba
numbapro-gpu
numbapro-gpu-smem
numbapro-gpu-improve
80000 ~
3000 ~
143.24
138.36
7.52
0
250
500
750
1,000
numpynumba
numbapro-gpu
numbapro-gpu-smem
numbapro-gpu-improve
はやい(小並感)
PyCUDAと比べるとどうよ?
ナップザック問題を解いてみる
✤ Pure Python、PyCUDA、NumbaProで実装し計算時間を比較
✤ 問題規模のパラメータn, R
✤ 計算量 O(n^2 * R / 4)
n=500, R=10
0
0.375
0.75
1.125
1.5
Pure Python
NumbaPro
PyCUDA
計算時間(秒)
高速化率Pure Python比
Pure Python
NumbaPro
PyCUDA
1.450 1.0
0.056 25.9
0.018 80.6
n=1000, R=1000
0
0.038
0.075
0.113
0.15
NumbaPro
PyCUDA
計算時間(秒)
Pure Python
NumbaPro
PyCUDA
-
0.126
0.047
n=1000, R=10000
0
0.075
0.15
0.225
0.3
NumbaPro
PyCUDA
計算時間(秒)
Pure Python
NumbaPro
PyCUDA
-
0.270
0.072
はい…
チュ|ニングすることが
できません
私が無能なばかりに、ただいたずらにYAMADA Systemの計算リソースを消費し、
NumbaProの真の性能を突き止めることが、できませんでしたぁぁ!
まとめ
✤ NumbaProで、Python / numpyで遅い処理を簡単に高速化できる
✤ PyCUDA速い(白目
✤ NumbaPro先生の今後のご活躍に期待します
✤ 見た目上全部Pythonで書けるのは素敵
✤ CUDA以外のバックエンドにも期待
おまけ
Wakari
✤ Pythonクラウド!
✤ ブラウザからPythonでHPCができる
✤ AWSバックエンド
✤ そのうちCUDAがサポートされるらしい
最後に
関西GPGPU勉強会#4 ハッカソン
✤ 和室でゴロゴロしながらプログラム高速化する会
✤ 日時 : 8 月 17日 (土) 9:30 ~ 17:00
✤ 場所 : 大阪市立城北市民学習センター 和室
✤ 募集ページ : http://connpass.com/event/2574/
質問?