43
June 1, 2013 Anaconda & NumbaPro 使ってみた 関東GPGPU勉強会#2

Anaconda & NumbaPro 使ってみた

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Anaconda & NumbaPro 使ってみた

June 1, 2013

Anaconda & NumbaPro 使ってみた関東GPGPU勉強会#2

Page 2: Anaconda & NumbaPro 使ってみた

お前、誰よ

✤ おのうえ@最近GPGPUやってない

✤ 京都の大学で博士課程の学生やってます

✤ 関西GPGPU勉強会の主宰とかしてます

Page 3: Anaconda & NumbaPro 使ってみた

今日のネタ

GPGPUによる高速化をPythonでお手軽にやる

Page 4: Anaconda & NumbaPro 使ってみた

✤ 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))

Page 5: Anaconda & NumbaPro 使ってみた

1年ぐらい前にこんなことを言ってる人がいた気がする

Page 6: Anaconda & NumbaPro 使ってみた

関東GPGPU勉強会 「LLVM meets GPU」

Page 7: Anaconda & NumbaPro 使ってみた

✤ PythonのコードからGPUで実行できるバイナリをLLVMで生成

Python LLVM IR(NVVM IR) PTX NVIDIA

GPU

CUDA Compiler SDK

LLVM meets GPUでやってたこと

Page 8: Anaconda & NumbaPro 使ってみた

こんな感じのコードが動く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)

Page 9: Anaconda & NumbaPro 使ってみた

時は過ぎ…

Page 10: Anaconda & NumbaPro 使ってみた
Page 11: Anaconda & NumbaPro 使ってみた

CUDAがPythonでサポート!

✤ 習得や利用が容易なPythonでGPGPU!

✤ Pythonの柔軟性、高生産性とGPGPUの高性能を両立!

✤ 充実したPythonのライブラリでHPCなどのアプリケーション!

Page 12: Anaconda & NumbaPro 使ってみた

CUDAがPythonでサポート?

✤ PyCUDA / PyOpenCL / Theanoは?

✤ Pythonコンパイラ?

✤ Wakariというブラウザベースのデータ探索・コード開発環境の一部?

Page 13: Anaconda & NumbaPro 使ってみた
Page 14: Anaconda & NumbaPro 使ってみた

こいつが何者なのか調べてみた

Page 15: Anaconda & NumbaPro 使ってみた

Anaconda

✤ Continuum Analytics社の製品

✤ Python本体と科学技術計算、可視化のライブラリを含んだディストリビューションパッケージ

✤ 無料

✤ Win / Mac OSX / Linux 対応

Page 16: Anaconda & NumbaPro 使ってみた

Anaconda Accelerate

✤ Anacondaのプラグインみたいな商用製品

✤ GPUやマルチコアプロセッサでPython & numpyの処理を高速化

✤ NumbaPro

✤ LLVMによるPython-to-GPU compiler

✤ compute capability 2.0以上のNVIDIA GPU

✤ $129、30日間フリートライアル、アカデミックフリー

Page 17: Anaconda & NumbaPro 使ってみた

AnacondaのInstall

✤ http://continuum.io/downloads.html

✤ Windows

✤ インストーラー

✤ Mac OSX / Linux

✤ シェルスクリプトを実行

$ sh Anaconda-1.5.1-MacOSX-x86_64.sh

Page 18: Anaconda & NumbaPro 使ってみた

Anacondaの使い方

✤ Anacondaインストール先のbin/activateを実行すればPATHの設定等をいい感じにしてくれる

$ source ~/anaconda/bin/activate

Page 19: Anaconda & NumbaPro 使ってみた

Accelerateのインストール

✤ condaコマンドを使う

✤ この時点でフリートライアルが有効化

✤ ライセンスファイルを指定された場所に置く

$ conda update conda$ conda install accelerate

Page 20: Anaconda & NumbaPro 使ってみた

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]

Page 21: Anaconda & NumbaPro 使ってみた

機能をざっと見る

✤ PythonコードをGPUにJITコンパイル

✤ vectorize

✤ deviceマネジメント

✤ cuRAND、cuFFT、cuBLASもサポート

Page 22: Anaconda & NumbaPro 使ってみた

サンプル動かしてみる

Page 23: Anaconda & NumbaPro 使ってみた

blackscholes

計算時間(秒)

Numpy

Numba

NumbaPro

1485.27

830.18

81.550

375

750

1,125

1,500

numpyNumba

NumbaPro

Page 24: Anaconda & NumbaPro 使ってみた

monte_carlo_pricer

計算時間(秒)

Numpy

Numba

NumbaPro

11.29

11.31

0.370

3.75

7.5

11.25

15

NumpyNumba

NumbaPro

Page 25: Anaconda & 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

Page 26: Anaconda & NumbaPro 使ってみた

はやい(小並感)

Page 27: Anaconda & NumbaPro 使ってみた

PyCUDAと比べるとどうよ?

Page 28: Anaconda & NumbaPro 使ってみた

ナップザック問題を解いてみる

✤ Pure Python、PyCUDA、NumbaProで実装し計算時間を比較

✤ 問題規模のパラメータn, R

✤ 計算量 O(n^2 * R / 4)

Page 29: Anaconda & NumbaPro 使ってみた

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

Page 30: Anaconda & NumbaPro 使ってみた

n=1000, R=1000

0

0.038

0.075

0.113

0.15

NumbaPro

PyCUDA

計算時間(秒)

Pure Python

NumbaPro

PyCUDA

-

0.126

0.047

Page 31: Anaconda & NumbaPro 使ってみた

n=1000, R=10000

0

0.075

0.15

0.225

0.3

NumbaPro

PyCUDA

計算時間(秒)

Pure Python

NumbaPro

PyCUDA

-

0.270

0.072

Page 32: Anaconda & NumbaPro 使ってみた

はい…

Page 33: Anaconda & NumbaPro 使ってみた

チュ|ニングすることが

できません

私が無能なばかりに、ただいたずらにYAMADA Systemの計算リソースを消費し、

NumbaProの真の性能を突き止めることが、できませんでしたぁぁ!

Page 34: Anaconda & NumbaPro 使ってみた

まとめ

✤ NumbaProで、Python / numpyで遅い処理を簡単に高速化できる

✤ PyCUDA速い(白目

✤ NumbaPro先生の今後のご活躍に期待します

✤ 見た目上全部Pythonで書けるのは素敵

✤ CUDA以外のバックエンドにも期待

Page 35: Anaconda & NumbaPro 使ってみた

おまけ

Page 36: Anaconda & NumbaPro 使ってみた

Wakari

✤ Pythonクラウド!

✤ ブラウザからPythonでHPCができる

✤ AWSバックエンド

✤ そのうちCUDAがサポートされるらしい

Page 37: Anaconda & NumbaPro 使ってみた
Page 38: Anaconda & NumbaPro 使ってみた
Page 39: Anaconda & NumbaPro 使ってみた
Page 40: Anaconda & NumbaPro 使ってみた
Page 41: Anaconda & NumbaPro 使ってみた

最後に

Page 42: Anaconda & NumbaPro 使ってみた

関西GPGPU勉強会#4 ハッカソン

✤ 和室でゴロゴロしながらプログラム高速化する会

✤ 日時 : 8 月 17日 (土) 9:30 ~ 17:00

✤ 場所 : 大阪市立城北市民学習センター 和室

✤ 募集ページ : http://connpass.com/event/2574/

Page 43: Anaconda & NumbaPro 使ってみた

質問?