SlideShare a Scribd company logo
1 of 16
Download to read offline
まだCPUで消耗してるの? Jubatus
による近傍探索の
GPUを利用した高速化
ヱヂリウム株式会社
渡邉卓也 室井浩明
Jubatus Casual Talks #4
2016年6月18日
やりたいこと
 Jubatusの近傍探索を商用利用したい
 LSHによる近傍探索をリアルタイムなレコメンデーションに活用したい
 性能面の制約がきつい
 規定の応答時間に納める為に、データ件数やLSHのハッシュ数を抑え
る必要があった
 CPUの機能の活用や無駄な処理の削除で徐々に高速化している
 0.9.1でさらに高速化したと聞く
 GPGPUで一気に高速化できないか
 近傍探索は各ベクトルについて独立に処理でき、最もGPU向きな処理
の一つである
 探索対象のビットベクトルは予めGPU側メモリに格納しておけばよいの
で、近傍探索時のデータ転送は少ない
 目標は2000万件を100 ms以内
1
GPGPUとは
 Graphics Processing Unit (GPU)
 主にゲームの映像を描画する為に発展してきたプロセッサ
 中身は高並列度のベクトル計算機
-最近はCPUにもベクトル演算器が入っているが、それらよりもずっと並列度が
高い(cf. SSE, AVX)
 General Purpose GPU (GPGPU)
 GPUを汎用のベクトル計算機として利用
-かつてのベクトル型スーパーコンピュータは科学技術計算に利用
-GPUは安価なので手軽にビジネス用途にも活用できる
 nVidiaのCUDA(C言語ベース)を利用するのが一般的
-実行方式やメモリアクセスパターンについて慎重に検討する必要がある
- CPUで高速な方式がGPUで高速とは限らない(むしろ大抵遅い)
-高い並列度を活かして力押しするのが基本
- できるだけメモリ帯域を活かすようメモリアクセスパターンを設計する
2
基本方針
 対象
 jubanearest_neighborを改造
-bit_vector_nearest_neighbor_base.cppを.cuにリネームして改造
- .cuはCUDAソースファイルの拡張子
- 本来ならstorageとして実装すべきであろうか
 LSHのみ実装
 とりあえず動く物を作る
 どの程度の性能が見込めるのかを計測する為なので動けばよい
 性能に関係する箇所は方式通りきちんと実装する
 できるだけ手を抜く
 既存の実装があればそれを利用
 性能に関係が薄いところは非効率でもそのまま
 エラー処理は最小限(すらしない)
3
プロジェクトへの組み込み
 wafで.cuをビルド可能にする
 wafはJubatusの利用しているmakeのようなもの
 wafは標準ではCUDAに対応していない
 既存の実装を利用
-https://github.com/krig/waf/blob/master/playground/cuda/cuda.py
 Cプログラムに対する処理を拡張して.cuの場合にnvcc(CUDAコンパイ
ラ)を利用してくれる
 作りかけっぽくそのままでは動かない
-数カ所修正の必要があった
 ライブラリやライブラリパスの指定
 conf.env.LINKFLAGSに-lcudaや-lcudartを追加
 適宜CUDAのライブラリパスも追加
4
メモリレイアウト
 column-major orderでGPU側メモリに格納
 cudaMallocPitchで確保
5
storedquerybitvector
storedbitvector1
storedbitvector2
storedbitvectorn
distance vector
index vector
address ->
...
padding
<-executionperthread
pitched matrix
ビットベクトルの投入
 set_row時にベクトルの向きの変換が必要
 column-major orderとpitched memory layoutへの対応が必要
 cudaMemcpy2Dで投入
 query vectorも同様
6
storedbitvector1
storedbitvector2
bit vector 1
GPU memory
CPU memory
距離の算出
 ハミング距離をxorしてpopcountで求める
 __popcプリミティブを利用
7
storedquerybitvector
storedbitvector1
distance vector
index vector
if (x < width) {
int count = 0;
for (int i = 0; i < height; i++) {
count += __popc(mat[i*pitch] ^ mat[i*pitch+x+1]);
}
dist[x] = count;
idx[x] = x;
}
後処理
 整列
 Thrust(GPUで使えるSTLのようなもの)を利用
-distance vectorとindex vectorへのポインタをthrust::device_ptrでラップ
- ラップするとGPU側と認識される
-thrust::sort_by_keyを用い、distanceをキーとして整列
- 実装はradix sortらしい
- 400万件からエラーを吐く
 GPUではよくbitonic sortやradix sortが用いられる
-多くの実装が公開されている
 CPU側メモリへ結果をコピー
 呼び出し元へ返す分のdistanceとindexをCPU側へコピーする
 距離を正規化
 LSHのハッシュ数で割る
8
性能計測環境
 AWSで性能計測
 インスタンス: g2.2xlarge
 CPU: Intel Xeon E5-2670 2.6 GHz x 8(Sandy Bridge世代)
 GPU: nVidia GRID K520(Kepler世代、GeForce GTX 680に近い)
 GPUのメモリ: 4 GB
 料金: 時間あたり$0.898
 ソフトウェア
 OS: Ubuntu 14.04
 CUDA: 7.5.18
 nVidiaディスプレイドライバ: 361.45.11
 Jubatus: 0.9.1
-通常版はパッケージで導入
-CUDA版は標準のコンパイルオプションでコンパイル
9
性能計測条件
 jubanearest_neighborのパラメータ
 method: lsh
 hash_num: 256, 512, 1024, 2048
 threads: 1, 2, 4
-ただし2以上は通常版のみ
- CUDA版はマルチスレッドに対応していない為
 投入データ
 [0, 1)の一様分布から生成した100次元のベクトル
 データ件数: 100万、200万、400万、800万
-ただし400万以上は通常版のみ
 近傍探索の条件
 PythonクライアントからRPCで近傍1000件を取得
-neighbor_row_from_id
 ランダムなIDで100回実行し、実行時間の平均と標準偏差を求めた
10
性能計測結果(通常版・ハッシュ数可変)
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
性能計測結果(通常版・スレッド数可変)
12
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0 1000000 2000000 3000000 4000000 5000000 6000000 7000000 8000000 9000000
時間(秒)
データ件数
スレッド数の影響(hash_num=1024)
1
2
4
性能計測結果(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
通常版と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
まとめ
 Jubatusの近傍探索をGPUで実行するよう改修
 CUDAで実装
 jubanearest_neighborのLSHのみ対応
 性能計測を実施
 データ件数やLSHのハッシュ数を変えて計測
-データ件数はほぼ線形な影響
-ハッシュ数の影響も線形に近いように見える
-なお、どの場合も計測値の標準偏差はかなり小さい
 0.9.1で高速化されていることは確認
-マルチスレッドは有効
 GPUにより大幅な高速化が達成できることを確認
 並列度を活かせる処理はGPUは速い
 目標(2000万件を100 ms以内)は達成の見込み
-ハッシュ数の影響が相対的に小さいので精度も改善できる
15

More Related Content

What's hot

Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
maebashi
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
Takahiro Iwase
 
20110519 okuyama tokyo_linuxstudy
20110519 okuyama tokyo_linuxstudy20110519 okuyama tokyo_linuxstudy
20110519 okuyama tokyo_linuxstudy
Takahiro Iwase
 

What's hot (20)

EthernetやCPUなどの話
EthernetやCPUなどの話EthernetやCPUなどの話
EthernetやCPUなどの話
 
Jubakit の紹介
Jubakit の紹介Jubakit の紹介
Jubakit の紹介
 
東北クラウド実践カンファレンス2011
東北クラウド実践カンファレンス2011東北クラウド実践カンファレンス2011
東北クラウド実践カンファレンス2011
 
【旧版】2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
【旧版】2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来【旧版】2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
【旧版】2009/12/10 GPUコンピューティングの現状とスーパーコンピューティングの未来
 
CPUに関する話
CPUに関する話CPUに関する話
CPUに関する話
 
Next-L Enju ワークショップ #86
Next-L Enju ワークショップ #86Next-L Enju ワークショップ #86
Next-L Enju ワークショップ #86
 
自作GPUへの道
自作GPUへの道自作GPUへの道
自作GPUへの道
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
 
MySQLやSSDとかの話 その後
MySQLやSSDとかの話 その後MySQLやSSDとかの話 その後
MySQLやSSDとかの話 その後
 
Jubaanomalyについて
JubaanomalyについてJubaanomalyについて
Jubaanomalyについて
 
Web時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメWeb時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメ
 
InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
 
CloudAtCostを使ってみた
CloudAtCostを使ってみたCloudAtCostを使ってみた
CloudAtCostを使ってみた
 
WebGLで浮動小数点テクスチャを扱う話
WebGLで浮動小数点テクスチャを扱う話WebGLで浮動小数点テクスチャを扱う話
WebGLで浮動小数点テクスチャを扱う話
 
リアルタイム処理エンジン Gearpumpの紹介
リアルタイム処理エンジンGearpumpの紹介リアルタイム処理エンジンGearpumpの紹介
リアルタイム処理エンジン Gearpumpの紹介
 
Amazon RDS for PostgreSQL ( JPUG 2014夏セミナー) #jpug
Amazon RDS for PostgreSQL ( JPUG 2014夏セミナー)  #jpugAmazon RDS for PostgreSQL ( JPUG 2014夏セミナー)  #jpug
Amazon RDS for PostgreSQL ( JPUG 2014夏セミナー) #jpug
 
20110519 okuyama tokyo_linuxstudy
20110519 okuyama tokyo_linuxstudy20110519 okuyama tokyo_linuxstudy
20110519 okuyama tokyo_linuxstudy
 
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
 

Viewers also liked

FIT2012招待講演「異常検知技術のビジネス応用最前線」
FIT2012招待講演「異常検知技術のビジネス応用最前線」FIT2012招待講演「異常検知技術のビジネス応用最前線」
FIT2012招待講演「異常検知技術のビジネス応用最前線」
Shohei Hido
 
第1回 Jubatusハンズオン
第1回 Jubatusハンズオン第1回 Jubatusハンズオン
第1回 Jubatusハンズオン
JubatusOfficial
 

Viewers also liked (20)

Python 特徴抽出プラグイン
Python 特徴抽出プラグインPython 特徴抽出プラグイン
Python 特徴抽出プラグイン
 
Jubakitの解説
Jubakitの解説Jubakitの解説
Jubakitの解説
 
新機能紹介 1.0.6
新機能紹介 1.0.6新機能紹介 1.0.6
新機能紹介 1.0.6
 
小町のレス数が予測できるか試してみた
小町のレス数が予測できるか試してみた小町のレス数が予測できるか試してみた
小町のレス数が予測できるか試してみた
 
かまってちゃん小町
かまってちゃん小町かまってちゃん小町
かまってちゃん小町
 
Jubatus 1.0 の紹介
Jubatus 1.0 の紹介Jubatus 1.0 の紹介
Jubatus 1.0 の紹介
 
Jubatus解説本の紹介
Jubatus解説本の紹介Jubatus解説本の紹介
Jubatus解説本の紹介
 
新聞から今年の漢字を予測する
新聞から今年の漢字を予測する新聞から今年の漢字を予測する
新聞から今年の漢字を予測する
 
単語コレクター(文章自動校正器)
単語コレクター(文章自動校正器)単語コレクター(文章自動校正器)
単語コレクター(文章自動校正器)
 
発言小町からのプロファイリング
発言小町からのプロファイリング発言小町からのプロファイリング
発言小町からのプロファイリング
 
銀座のママ
銀座のママ銀座のママ
銀座のママ
 
小町の溜息
小町の溜息小町の溜息
小町の溜息
 
JUBARHYME
JUBARHYMEJUBARHYME
JUBARHYME
 
地域の魅力を伝えるツアーガイドAI
地域の魅力を伝えるツアーガイドAI地域の魅力を伝えるツアーガイドAI
地域の魅力を伝えるツアーガイドAI
 
コンテンツマーケティングでレコメンドエンジンが必要になる背景とその活用
コンテンツマーケティングでレコメンドエンジンが必要になる背景とその活用コンテンツマーケティングでレコメンドエンジンが必要になる背景とその活用
コンテンツマーケティングでレコメンドエンジンが必要になる背景とその活用
 
FIT2012招待講演「異常検知技術のビジネス応用最前線」
FIT2012招待講演「異常検知技術のビジネス応用最前線」FIT2012招待講演「異常検知技術のビジネス応用最前線」
FIT2012招待講演「異常検知技術のビジネス応用最前線」
 
Jubatus: Jubakitでもっと楽をしよう
Jubatus: Jubakitでもっと楽をしようJubatus: Jubakitでもっと楽をしよう
Jubatus: Jubakitでもっと楽をしよう
 
Jubatus Python特徴抽出プラグイン
Jubatus Python特徴抽出プラグインJubatus Python特徴抽出プラグイン
Jubatus Python特徴抽出プラグイン
 
第1回 Jubatusハンズオン
第1回 Jubatusハンズオン第1回 Jubatusハンズオン
第1回 Jubatusハンズオン
 
Anomaly detection in deep learning (Updated) English
Anomaly detection in deep learning (Updated) EnglishAnomaly detection in deep learning (Updated) English
Anomaly detection in deep learning (Updated) English
 

Similar to まだCPUで消耗してるの?Jubatusによる近傍探索のGPUを利用した高速化

小ゼミ進捗 0601
小ゼミ進捗 0601小ゼミ進捗 0601
小ゼミ進捗 0601
robo_lab
 
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
智啓 出川
 
SIGMOD'10勉強会 -Session 8-
SIGMOD'10勉強会 -Session 8-SIGMOD'10勉強会 -Session 8-
SIGMOD'10勉強会 -Session 8-
Takeshi Yamamuro
 

Similar to まだCPUで消耗してるの?Jubatusによる近傍探索のGPUを利用した高速化 (11)

小ゼミ進捗 0601
小ゼミ進捗 0601小ゼミ進捗 0601
小ゼミ進捗 0601
 
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
2015年度GPGPU実践プログラミング 第15回 GPU最適化ライブラリ
 
SIGMOD'10勉強会 -Session 8-
SIGMOD'10勉強会 -Session 8-SIGMOD'10勉強会 -Session 8-
SIGMOD'10勉強会 -Session 8-
 
PyCUDAの紹介
PyCUDAの紹介PyCUDAの紹介
PyCUDAの紹介
 
KubernetesでGPUクラスタを管理したい
KubernetesでGPUクラスタを管理したいKubernetesでGPUクラスタを管理したい
KubernetesでGPUクラスタを管理したい
 
Isca13 study
Isca13 studyIsca13 study
Isca13 study
 
VIOPS08: Behavior Analysis Solution for Bigdata
VIOPS08: Behavior Analysis Solution for BigdataVIOPS08: Behavior Analysis Solution for Bigdata
VIOPS08: Behavior Analysis Solution for Bigdata
 
10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化
 
AWSとGPUインスタンスのご紹介
AWSとGPUインスタンスのご紹介AWSとGPUインスタンスのご紹介
AWSとGPUインスタンスのご紹介
 
深層学習ネットワークのモバイル実装
深層学習ネットワークのモバイル実装深層学習ネットワークのモバイル実装
深層学習ネットワークのモバイル実装
 
Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装
 

More from JubatusOfficial (8)

Jubakitの紹介
Jubakitの紹介Jubakitの紹介
Jubakitの紹介
 
Jubatusハンズオン 機械学習はじめてみた
Jubatusハンズオン 機械学習はじめてみたJubatusハンズオン 機械学習はじめてみた
Jubatusハンズオン 機械学習はじめてみた
 
もくもく成果 IMAMASU
もくもく成果 IMAMASUもくもく成果 IMAMASU
もくもく成果 IMAMASU
 
Jubatusでuserとbrandのレコメンドを試してみた話
Jubatusでuserとbrandのレコメンドを試してみた話Jubatusでuserとbrandのレコメンドを試してみた話
Jubatusでuserとbrandのレコメンドを試してみた話
 
相撲
相撲相撲
相撲
 
興味ありそうなもの検索
興味ありそうなもの検索興味ありそうなもの検索
興味ありそうなもの検索
 
チーム:大杉さんの壮大な夢
チーム:大杉さんの壮大な夢チーム:大杉さんの壮大な夢
チーム:大杉さんの壮大な夢
 
Jubatus使ってみた 作ってみたJubatus
Jubatus使ってみた 作ってみたJubatusJubatus使ってみた 作ってみたJubatus
Jubatus使ってみた 作ってみたJubatus
 

まだCPUで消耗してるの?Jubatusによる近傍探索のGPUを利用した高速化