まだcpuで消耗してるの? - edirium.co.jp · jubatus casual talks #4 2016年6月18日 ....

16
まだCPUで消耗してるの? Jubatusによる近傍探索の GPUを利用した高速化 ヱヂリウム株式会社 渡邉卓也 室井浩明 Jubatus Casual Talks #4 2016618

Upload: others

Post on 27-Oct-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

まだCPUで消耗してるの? Jubatusによる近傍探索の

GPUを利用した高速化

ヱヂリウム株式会社渡邉卓也 室井浩明

JubatusCasualTalks#4

2016年6月18日

Page 2: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

やりたいこと p Jubatusの近傍探索を商用利用したい

n LSHによる近傍探索をリアルタイムなレコメンデーションに活用したい

p 性能面の制約がきついn 規定の応答時間に納める為に、データ件数やLSHのハッシュ数を抑える必要があった

n CPUの機能の活用や無駄な処理の削除で徐々に高速化しているn 0.9.1でさらに高速化したと聞く

p GPGPUで一気に高速化できないかn 近傍探索は各ベクトルについて独立に処理でき、最もGPU向きな処理の一つである

n 探索対象のビットベクトルは予めGPU側メモリに格納しておけばよいので、近傍探索時のデータ転送は少ない

n 目標は2000万件を100ms以内

1

Page 3: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

GPGPUとは p GraphicsProcessingUnit(GPU)

n 主にゲームの映像を描画する為に発展してきたプロセッサn 中身は高並列度のベクトル計算機- 最近はCPUにもベクトル演算器が入っているが、それらよりもずっと並列度が高い(cf.SSE,AVX)

p GeneralPurposeGPU(GPGPU)n GPUを汎用のベクトル計算機として利用- かつてのベクトル型スーパーコンピュータは科学技術計算に利用- GPUは安価なので手軽にビジネス用途にも活用できる

n nVidiaのCUDA(C言語ベース)を利用するのが一般的- 実行方式やメモリアクセスパターンについて慎重に検討する必要がある-  CPUで高速な方式がGPUで高速とは限らない(むしろ大抵遅い)

- 高い並列度を活かして力押しするのが基本- できるだけメモリ帯域を活かすようメモリアクセスパターンを設計する

2

Page 4: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

基本方針 p 対象

n  jubanearest_neighborを改造- bit_vector_nearest_neighbor_base.cppを.cuにリネームして改造-  .cuはCUDAソースファイルの拡張子- 本来ならstorageとして実装すべきであろうか

n LSHのみ実装

p とりあえず動く物を作るn どの程度の性能が見込めるのかを計測する為なので動けばよいn 性能に関係する箇所は方式通りきちんと実装する

p できるだけ手を抜くn 既存の実装があればそれを利用n 性能に関係が薄いところは非効率でもそのままn エラー処理は最小限(すらしない)

3

Page 5: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

プロジェクトへの組み込み p wafで.cuをビルド可能にする

n wafはJubatusの利用しているmakeのようなものn wafは標準ではCUDAに対応していないn 既存の実装を利用- hSps://github.com/krig/waf/blob/master/playground/cuda/cuda.py

n Cプログラムに対する処理を拡張して.cuの場合にnvcc(CUDAコンパイラ)を利用してくれる

n 作りかけっぽくそのままでは動かない- 数カ所修正の必要があった

p ライブラリやライブラリパスの指定n conf.env.LINKFLAGSに-lcudaや-lcudartを追加n 適宜CUDAのライブラリパスも追加

4

Page 6: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

メモリレイアウト p column-majororderでGPU側メモリに格納

n cudaMallocPitchで確保

5

stored

que

rybitvector

stored

bitvector1

stored

bitvector2

stored

bitvectorn

distancevector

indexvector

address->

...

padd

ing

<-execuao

npe

rthread

pitchedmatrix

Page 7: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

ビットベクトルの投入 p set_row時にベクトルの向きの変換が必要

n column-majororderとpitchedmemorylayoutへの対応が必要n cudaMemcpy2Dで投入

p queryvectorも同様

6

stored

bitvector1

stored

bitvector2

bitvector1

GPUmemory

CPUmemory

Page 8: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

距離の算出 p ハミング距離をxorしてpopcountで求める

n __popcプリミティブを利用

7

stored

que

rybitvector

stored

bitvector1

distancevector

indexvector

if(x<width){intcount=0;for(inti=0;i<height;i++){count+=__popc(mat[i*pitch]^mat[i*pitch+x+1]);}dist[x]=count;idx[x]=x;}

Page 9: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

後処理 p 整列

n Thrust(GPUで使えるSTLのようなもの)を利用- distancevectorとindexvectorへのポインタをthrust::device_ptrでラップ- ラップするとGPU側と認識される

-  thrust::sort_by_keyを用い、distanceをキーとして整列- 実装はradixsortらしい-  400万件からエラーを吐く

n GPUではよくbitonicsortやradixsortが用いられる- 多くの実装が公開されている

p CPU側メモリへ結果をコピーn 呼び出し元へ返す分のdistanceとindexをCPU側へコピーする

p 距離を正規化n LSHのハッシュ数で割る

8

Page 10: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

性能計測環境 p AWSで性能計測

n インスタンス:g2.2xlargen CPU:IntelXeonE5-26702.6GHzx8(SandyBridge世代)n GPU:nVidiaGRIDK520(Kepler世代、GeForceGTX680に近い)n GPUのメモリ:4GBn 料金:時間あたり$0.898

p ソフトウェアn OS:Ubuntu14.04n CUDA:7.5.18n nVidiaディスプレイドライバ:361.45.11n  Jubatus:0.9.1- 通常版はパッケージで導入- CUDA版は標準のコンパイルオプションでコンパイル

9

Page 11: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

性能計測条件 p jubanearest_neighborのパラメータ

n method:lshn hash_num:256,512,1024,2048n  threads:1,2,4- ただし2以上は通常版のみ-  CUDA版はマルチスレッドに対応していない為

p 投入データn  [0,1)の一様分布から生成した100次元のベクトルn データ件数:100万、200万、400万、800万- ただし400万以上は通常版のみ

p 近傍探索の条件n PythonクライアントからRPCで近傍1000件を取得- neighbor_row_from_id

n ランダムなIDで100回実行し、実行時間の平均と標準偏差を求めた

10

Page 12: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

性能計測結果(通常版・ハッシュ数可変)

11

0

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

0 100000020000003000000400000050000006000000700000080000009000000

threads=1

256

512

1024

2048

Page 13: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

性能計測結果(通常版・スレッド数可変)

12

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0 100000020000003000000400000050000006000000700000080000009000000

hash_num=1024

1

2

4

Page 14: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

性能計測結果(CUDA版)

13

0

0.002

0.004

0.006

0.008

0.01

0.012

0.014

0.016

0.018

500000 1000000 1500000 2000000 2500000

GPU

256_GPU

512_GPU

1024_GPU

2048_GPU

Page 15: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

通常版とCUDA版の性能比較

14

0

0.02

0.04

0.06

0.08

0.1

0.12

0.14

0.16

0.18

0.2

0 2000000 4000000 6000000 8000000

CPU:threads=4 GPU

256

512

1024

2048

256_GPU

512_GPU

1024_GPU

2048_GPU

Page 16: まだCPUで消耗してるの? - edirium.co.jp · Jubatus Casual Talks #4 2016年6月18日 . やりたいこと p Jubatusの近傍探索を商用利用したい n LSHによる近傍探索をリアルタイムなレコメンデーションに活用

まとめ p Jubatusの近傍探索をGPUで実行するよう改修

n CUDAで実装n  jubanearest_neighborのLSHのみ対応

p 性能計測を実施n データ件数やLSHのハッシュ数を変えて計測- データ件数はほぼ線形な影響- ハッシュ数の影響も線形に近いように見える- なお、どの場合も計測値の標準偏差はかなり小さい

n 0.9.1で高速化されていることは確認- マルチスレッドは有効

p GPUにより大幅な高速化が達成できることを確認n 並列度を活かせる処理はGPUは速いn 目標(2000万件を100ms以内)は達成の見込み- ハッシュ数の影響が相対的に小さいので精度も改善できる

15