SlideShare a Scribd company logo
1 of 19
Download to read offline
Run Drug-Discovery Workloads
In-database on AWS
The PG-Strom Project
KaiGai Kohei <kaigai@kaigai.gr.jp>
The PG-Strom Project
自己紹介
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS2
▌海外 浩平 (KaiGai Kohei)
 tw: @kkaigai
 https://github.com/kaigai
▌PostgreSQL
 SELinux, Database Federation
(FDW, CustomScan), etc...
▌PG-Strom
 GPUを用いたPostgreSQL向け
高速化モジュールの作者
The PG-Strom Project
PG-Strom概要 – アーキテクチャ
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS3
Application
Storage
Query
Optimizer
Query
Executor
PG-Strom
Extension
SQL Parser
Storage Manager
GPU
No Storage
Changes
No Query
Changes
 機能
• SQLからGPUコードを自動生成。
• GPUによる非同期/超並列実行
• WHERE句、JOIN、GROUP BY、
Projectionに対応
 利点
• 数千演算コアを用いた透過的な
アクセラレーション
• 解析系ワークロードに対する
低コストのソリューション
The PG-Strom Project
GPUによるSQL実行高速化の一例
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS4
▌Test Query:
SELECT cat, count(*), avg(x)
FROM t0 NATURAL JOIN t1 [NATURAL JOIN t2 ...]
GROUP BY cat;
 t0 contains 100M rows, t1...t8 contains 100K rows (like a start schema)
40.44
62.79
79.82
100.50
119.51
144.55
201.12
248.95
9.96 9.93 9.96 9.99 10.02 10.03 9.98 10.00
0
50
100
150
200
250
300
2 3 4 5 6 7 8 9
QueryResponseTime[sec]
Number of joined tables
PG-Strom microbenchmark with JOIN/GROUP BY
PostgreSQL v9.5 PG-Strom v1.0
CPU: Xeon E5-2670v3
GPU: GTX1080
RAM: 384GB
OS: CentOS 7.2
DB: PostgreSQL 9.5 +
PG-Strom v1.0
The PG-Strom Project
失敗から学ぶ (1/2) – アルゴリズムをSQLで記述する
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS5
Apr-2016
問題①
そもそも SQL でアルゴリズムを
書く人って何人くらいいるのか?
The PG-Strom Project
失敗から学ぶ (2/2) – 性能上のアドバンテージ (?)
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS6
Apr-2016
問題②
性能アドバンテージが微妙。
SQL互換性に由来する非効率性や
行形式データのデータ密度。
The PG-Strom Project
解決策 – PL/CUDA + Array-Matrix
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS7
CREATE FUNCTION my_logic(matrix, matrix)
RETURNS vector
AS $$
$$ LANGUAGE ‘plcuda’;
ユーザ定義のCUDAコードブロック
Storage
GPU Kernel
ユーザ定義の
CUDAコードブロック
Post SQL Process
 Tables JOIN
 Window
Function
 ORDER BY
 GROUP BY
 etc....
関数の引数を
ロード
結果セットの
書き戻し
PL/CUDA
手動での最適化手段
ArrayType ヘッダ a1 a2 aN… b1 b2 bN… c1 c2 cN… d1 d2 dN…
𝑎1 ⋯ 𝑑1
⋮ ⋱ ⋮
𝑎 𝑁 ⋯ 𝑑 𝑁
4列N行 行列
Array-Matrix
非NULLの2次元配列を“行列”と解釈
The PG-Strom Project
PL/CUDA関数定義の例
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS8
CREATE OR REPLACE FUNCTION
knn_gpu_similarity(int, int[], int[])
RETURNS float4[]
AS $$
#plcuda_begin
cl_int k = arg1.value;
MatrixType *Q = (MatrixType *) arg2.value;
MatrixType *D = (MatrixType *) arg3.value;
MatrixType *R = (MatrixType *) results;
:
nloops = (ARRAY_MATRIX_HEIGHT(Q) + (part_sz - k - 1)) / (part_sz - k);
for (loop=0; loop < nloops; loop++) {
/* 1. calculation of the similarity */
for (i = get_local_id(); i < part_sz * part_nums; i += get_local_size()) {
j = i % part_sz; /* index within partition */
/* index of database matrix (D) */
dindex = part_nums * get_global_index() + (i / part_sz);
/* index of query matrix (Q) */
qindex = loop * (part_sz - k) + (j - k);
values[i] = knn_similarity_compute(D, dindex, Q, qindex);
}
}
:
#plcuda_end
$$ LANGUAGE 'plcuda';
CUDA code block
The PG-Strom ProjectJAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS9
Case Study
創薬における類似度サーチ
The PG-Strom Project
背景 – 病気と候補化合物の関係
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS10
ターゲットの病気
関連するたんぱく質
化合物 (= 医薬品の候補)
ターゲットたんぱく質に “active” である化合物の探索
inactive active
active
(毒性あり)
学術論文
The PG-Strom Project
k-NN法による類似化合物サーチ (1/2)
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS11
データベース化合物群
(D; ~1000万件程度)
クエリ化合物群
(Q; ~1000件程度)
類似度による
サーチ
ターゲットたんぱく質
“似た特性の化合物”は
“active”である可能性も高いはず。
学術論文等から
ターゲットたんぱく質に
“active” である化合物
をピックアップ
The PG-Strom Project
k-NN法による類似化合物サーチ (2/2)
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS12
類似度 = 距離の定義
ID NAME Fingerprint (1024bit)
1 CHEMBL153534 000000000001000000100000000000000100000000000001000000...
2 CHEMBL405398 000000000000000100100000000000000000000000000000100000...
3 CHEMBL503634 000001000000000000000000001000000100000000000000000000...
: : :
化合物のデータ構造
Tanimoto Indexによる類似度の定義:
𝑆𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦 𝐴, 𝐵 = 𝐴 𝐹𝑃 ∩ 𝐵 𝐹𝑃 𝐴 𝐹𝑃 ∪ 𝐵 𝐹𝑃
The PG-Strom Project
必要な計算量
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS13
データベース化合物群
(D; 10M件程度)
Q: クエリ化合物群
(~1000件程度)
上位3件の平均
𝑑𝑖 ∈ 𝐷
d 𝑄, 𝑑𝑖 : Q~di間の距離
𝑑𝑗 ∈ 𝐷
上位3件の平均
計算量の目安:
𝑂 𝑄 × 𝐷 + 𝑂 𝐷 × 𝑄𝑙𝑜𝑔𝑄
(距離計算) (ソート+平均値)
d 𝑄, 𝑑𝑗 : Q~dj間の距離
The PG-Strom Project
PL/CUDA関数の実装 (1/3)
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS14
Step-1
全てのQ×Dの論理的な組み合わせを、
複数のパーティションに分割。これらを
GPUの実行ユニットであるSMMに割り当て。
Step-2
各GPUコアがQ化合物群とd化合物間の
類似度スコアを算出。
L1キャッシュと同等のレイテンシでアクセス
可能な “共有メモリ” にこれを格納
The PG-Strom Project
PL/CUDA関数の実装 (2/3)
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS15
Step-3
類似度スコアによる Bitonic-Sorting を実行。
ある d 化合物に対する q 化合物が、類似度
の順に並ぶことになる。
Step-5
類似度上位k件による平均値を
算出し、結果バッファに格納。
Step-4
Q化合物群のサイズが共有メモリよりも巨大な場合、
Step-2以降を繰り返し。
The PG-Strom Project
PL/CUDA関数の実装 (3/3)
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS16
CREATE OR REPLACE FUNCTION
knn_gpu_similarity(int, -- k-value
int[], -- ID+bitmap of Q
int[]) -- ID+bitmap of D
RETURNS float4[] -- result: ID+similarity
AS $$
#plcuda_decl
:
#plcuda_begin
#plcuda_kernel_blocksz ¥
knn_gpu_similarity_main_block_size
#plcuda_num_threads ¥
knn_gpu_similarity_main_num_threads
#plcuda_shmem_blocksz 8192
cl_int k = arg1.value;
MatrixType *Q = (MatrixType *) arg2.value;
MatrixType *D = (MatrixType *) arg3.value;
MatrixType *R = (MatrixType *) results;
:
for (loop=0; loop < nloops; loop++)
{
/* 1. calculation of the similarity */
for (i = get_local_id();
i < part_sz * part_nums;
i += get_local_size()) {
j = i % part_sz; /* index within partition */
dindex = part_nums * get_global_index()
+ (i / part_sz);
qindex = loop * (part_sz - k) + (j - k);
if (dindex < ARRAY_MATRIX_HEIGHT(D) &&
qindex < ARRAY_MATRIX_HEIGHT(Q)) {
values[i] = knn_similarity_compute(D, dindex,
Q, qindex);
}
}
__syncthreads();
/* 2. sorting by the similarity for each partition */
knn_similarity_sorting(values, part_sz, part_nums);
__syncthreads();
:
}
#plcuda_end
#plcuda_sanity_check knn_gpu_similarity_sanity_check
#plcuda_working_bufsz 0
#plcuda_results_bufsz knn_gpu_similarity_results_bufsz
$$ LANGUAGE 'plcuda';
real[] -- ID+Similarity of D化合物 (2xN)
knn_gpu_similarity(int k, -- k-value
int[] Q, -- ID+Fingerprint of Q化合物 (33xM)
int[] D); -- ID+Fingerprint of D化合物 (33xN)
The PG-Strom Project
パフォーマンス
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS17
 CPU版は、同等のロジックをC言語によるバイナリ版で実装して比較計測
 D化合物群の数は1000万レコード、Q化合物群の数は10,50,100,500,1000個の5通り
 最大で100億通りの組合せを計算。これは実際の創薬ワークロードの規模と同等。
 HW) p2.xlargeインスタンス, 4vCPU, GPU: Tesla K80/2, RAM: 61GB
 SW) CentOS7, CUDA7.5, PostgreSQL v9.5 + PG-Strom v1.0
34.29
165.06
333.30
1723.91
3487.90
17.44 18.27 19.33 25.81 34.57
0
500
1000
1500
2000
2500
3000
3500
10 50 100 500 1000
SQLクエリ応答時間[sec]
(shorterisbetter)
クエリ化合物数
k-NN法による類似化合物サーチ SQL応答時間
CPU (???) GPU (Tesla K80/2)
x100 times
faster!
The PG-Strom Project
まとめ
JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS18
▌なぜ In-database Analytics なのか?
 データのある場所で計算を行う
 前処理/後処理もSQLで楽々
でも、アルゴリズムの中核部分はとてもDBに捌ける計算量ではなかった
▌PL/CUDA
 CUDAを使ってSQL関数を実装するための機能
 PL/CUDA関数の引数や戻り値は、ランタイムが自動的に CPUGPU 間を
転送してくれる。
DBの弱点である “計算能力” を補完するための機能。
▌今後の展望
 関数の引数/戻り値として 1GB を越えるデータの受け渡しができない。
(PostgreSQL可変長データ形式の制限による)
最大4TBまで扱えるようにするため、可変長データ形式の拡張を議論中。
 “よく使う” 解析アルゴリズムのパッケージ化。
一緒に “検証やろうぜ!” って方、ぜひお声がけを!
Thank you!

More Related Content

What's hot

What's hot (20)

20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache
 
20210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.020210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.0
 
20200828_OSCKyoto_Online
20200828_OSCKyoto_Online20200828_OSCKyoto_Online
20200828_OSCKyoto_Online
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ
 
20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow
 
20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw
 
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
20181211 - PGconf.ASIA - NVMESSD&GPU for BigData
 
(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する
 
20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdw20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdw
 
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
[20170922 Sapporo Tech Bar] 地図用データを高速処理!オープンソースGPUデータベースMapDってどんなもの?? by 株式会社...
 
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
GPUとSSDがPostgreSQLを加速する~クエリ処理スループット10GB/sへの挑戦~ [DB Tech Showcase Tokyo/2017]
 
20170726 py data.tokyo
20170726 py data.tokyo20170726 py data.tokyo
20170726 py data.tokyo
 
20191115-PGconf.Japan
20191115-PGconf.Japan20191115-PGconf.Japan
20191115-PGconf.Japan
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom
 
20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP
 
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
 
20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGIS20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGIS
 
NVIDIA TESLA V100・CUDA 9 のご紹介
NVIDIA TESLA V100・CUDA 9 のご紹介NVIDIA TESLA V100・CUDA 9 のご紹介
NVIDIA TESLA V100・CUDA 9 のご紹介
 
20180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #1020180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #10
 
Maxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングMaxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミング
 

Viewers also liked

Viewers also liked (20)

pgconfasia2016 plcuda en
pgconfasia2016 plcuda enpgconfasia2016 plcuda en
pgconfasia2016 plcuda en
 
SQL+GPU+SSD=∞ (English)
SQL+GPU+SSD=∞ (English)SQL+GPU+SSD=∞ (English)
SQL+GPU+SSD=∞ (English)
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
20160407_GTC2016_PgSQL_In_Place
20160407_GTC2016_PgSQL_In_Place20160407_GTC2016_PgSQL_In_Place
20160407_GTC2016_PgSQL_In_Place
 
UX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and ArchivesUX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and Archives
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging Challenges
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 
Task Parallel Library (TPL)
Task Parallel Library (TPL)Task Parallel Library (TPL)
Task Parallel Library (TPL)
 
PostgreSQL with OpenCL
PostgreSQL with OpenCLPostgreSQL with OpenCL
PostgreSQL with OpenCL
 
PG-Strom - A FDW module utilizing GPU device
PG-Strom - A FDW module utilizing GPU devicePG-Strom - A FDW module utilizing GPU device
PG-Strom - A FDW module utilizing GPU device
 
TPL Dataflow – зачем и для кого?
TPL Dataflow – зачем и для кого?TPL Dataflow – зачем и для кого?
TPL Dataflow – зачем и для кого?
 
Task Parallel Library 2014
Task Parallel Library 2014Task Parallel Library 2014
Task Parallel Library 2014
 
Technology Updates of PG-Strom at Aug-2014 (PGUnconf@Tokyo)
Technology Updates of PG-Strom at Aug-2014 (PGUnconf@Tokyo)Technology Updates of PG-Strom at Aug-2014 (PGUnconf@Tokyo)
Technology Updates of PG-Strom at Aug-2014 (PGUnconf@Tokyo)
 
Let's turn your PostgreSQL into columnar store with cstore_fdw
Let's turn your PostgreSQL into columnar store with cstore_fdwLet's turn your PostgreSQL into columnar store with cstore_fdw
Let's turn your PostgreSQL into columnar store with cstore_fdw
 
GPGPU Accelerates PostgreSQL ~Unlock the power of multi-thousand cores~
GPGPU Accelerates PostgreSQL ~Unlock the power of multi-thousand cores~GPGPU Accelerates PostgreSQL ~Unlock the power of multi-thousand cores~
GPGPU Accelerates PostgreSQL ~Unlock the power of multi-thousand cores~
 
dashDB & R によるデータ分析 - In database Analytics 基礎編 -
dashDB & R によるデータ分析 - In database Analytics 基礎編 -dashDB & R によるデータ分析 - In database Analytics 基礎編 -
dashDB & R によるデータ分析 - In database Analytics 基礎編 -
 
dashDB local ご紹介
dashDB local ご紹介 dashDB local ご紹介
dashDB local ご紹介
 
Oracle In-database-archiving ~Oracleでの論理削除~
Oracle In-database-archiving ~Oracleでの論理削除~Oracle In-database-archiving ~Oracleでの論理削除~
Oracle In-database-archiving ~Oracleでの論理削除~
 

Similar to 20170127 JAWS HPC-UG#8

GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE) GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
智啓 出川
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
Takuya Tsuchida
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GPars
Takahiro Sugiura
 

Similar to 20170127 JAWS HPC-UG#8 (20)

20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
 
20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extension
 
R -> Python
R -> PythonR -> Python
R -> Python
 
PostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQLPostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQL
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extension
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
Kubernetes on Alibaba Cloud
Kubernetes on Alibaba CloudKubernetes on Alibaba Cloud
Kubernetes on Alibaba Cloud
 
A Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on TezA Benchmark Test on Presto, Spark Sql and Hive on Tez
A Benchmark Test on Presto, Spark Sql and Hive on Tez
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
Pgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdwPgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdw
 
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE) GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
GPGPU Seminar (GPU Accelerated Libraries, 2 of 3, cuSPARSE)
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GPars
 

More from Kohei KaiGai

More from Kohei KaiGai (18)

20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History
 
20210928_pgunconf_hll_count
20210928_pgunconf_hll_count20210928_pgunconf_hll_count
20210928_pgunconf_hll_count
 
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
 
20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS
 
20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing
 
20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta
 
20190925_DBTS_PGStrom
20190925_DBTS_PGStrom20190925_DBTS_PGStrom
20190925_DBTS_PGStrom
 
20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai
 
20190516_DLC10_PGStrom
20190516_DLC10_PGStrom20190516_DLC10_PGStrom
20190516_DLC10_PGStrom
 
20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw
 
20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - English20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - English
 
20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA Unconference20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA Unconference
 
20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQL20181116 Massive Log Processing using I/O optimized PostgreSQL
20181116 Massive Log Processing using I/O optimized PostgreSQL
 
20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multi20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multi
 
20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdw20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdw
 
20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_EN20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_EN
 

20170127 JAWS HPC-UG#8

  • 1. Run Drug-Discovery Workloads In-database on AWS The PG-Strom Project KaiGai Kohei <kaigai@kaigai.gr.jp>
  • 2. The PG-Strom Project 自己紹介 JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS2 ▌海外 浩平 (KaiGai Kohei)  tw: @kkaigai  https://github.com/kaigai ▌PostgreSQL  SELinux, Database Federation (FDW, CustomScan), etc... ▌PG-Strom  GPUを用いたPostgreSQL向け 高速化モジュールの作者
  • 3. The PG-Strom Project PG-Strom概要 – アーキテクチャ JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS3 Application Storage Query Optimizer Query Executor PG-Strom Extension SQL Parser Storage Manager GPU No Storage Changes No Query Changes  機能 • SQLからGPUコードを自動生成。 • GPUによる非同期/超並列実行 • WHERE句、JOIN、GROUP BY、 Projectionに対応  利点 • 数千演算コアを用いた透過的な アクセラレーション • 解析系ワークロードに対する 低コストのソリューション
  • 4. The PG-Strom Project GPUによるSQL実行高速化の一例 JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS4 ▌Test Query: SELECT cat, count(*), avg(x) FROM t0 NATURAL JOIN t1 [NATURAL JOIN t2 ...] GROUP BY cat;  t0 contains 100M rows, t1...t8 contains 100K rows (like a start schema) 40.44 62.79 79.82 100.50 119.51 144.55 201.12 248.95 9.96 9.93 9.96 9.99 10.02 10.03 9.98 10.00 0 50 100 150 200 250 300 2 3 4 5 6 7 8 9 QueryResponseTime[sec] Number of joined tables PG-Strom microbenchmark with JOIN/GROUP BY PostgreSQL v9.5 PG-Strom v1.0 CPU: Xeon E5-2670v3 GPU: GTX1080 RAM: 384GB OS: CentOS 7.2 DB: PostgreSQL 9.5 + PG-Strom v1.0
  • 5. The PG-Strom Project 失敗から学ぶ (1/2) – アルゴリズムをSQLで記述する JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS5 Apr-2016 問題① そもそも SQL でアルゴリズムを 書く人って何人くらいいるのか?
  • 6. The PG-Strom Project 失敗から学ぶ (2/2) – 性能上のアドバンテージ (?) JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS6 Apr-2016 問題② 性能アドバンテージが微妙。 SQL互換性に由来する非効率性や 行形式データのデータ密度。
  • 7. The PG-Strom Project 解決策 – PL/CUDA + Array-Matrix JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS7 CREATE FUNCTION my_logic(matrix, matrix) RETURNS vector AS $$ $$ LANGUAGE ‘plcuda’; ユーザ定義のCUDAコードブロック Storage GPU Kernel ユーザ定義の CUDAコードブロック Post SQL Process  Tables JOIN  Window Function  ORDER BY  GROUP BY  etc.... 関数の引数を ロード 結果セットの 書き戻し PL/CUDA 手動での最適化手段 ArrayType ヘッダ a1 a2 aN… b1 b2 bN… c1 c2 cN… d1 d2 dN… 𝑎1 ⋯ 𝑑1 ⋮ ⋱ ⋮ 𝑎 𝑁 ⋯ 𝑑 𝑁 4列N行 行列 Array-Matrix 非NULLの2次元配列を“行列”と解釈
  • 8. The PG-Strom Project PL/CUDA関数定義の例 JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS8 CREATE OR REPLACE FUNCTION knn_gpu_similarity(int, int[], int[]) RETURNS float4[] AS $$ #plcuda_begin cl_int k = arg1.value; MatrixType *Q = (MatrixType *) arg2.value; MatrixType *D = (MatrixType *) arg3.value; MatrixType *R = (MatrixType *) results; : nloops = (ARRAY_MATRIX_HEIGHT(Q) + (part_sz - k - 1)) / (part_sz - k); for (loop=0; loop < nloops; loop++) { /* 1. calculation of the similarity */ for (i = get_local_id(); i < part_sz * part_nums; i += get_local_size()) { j = i % part_sz; /* index within partition */ /* index of database matrix (D) */ dindex = part_nums * get_global_index() + (i / part_sz); /* index of query matrix (Q) */ qindex = loop * (part_sz - k) + (j - k); values[i] = knn_similarity_compute(D, dindex, Q, qindex); } } : #plcuda_end $$ LANGUAGE 'plcuda'; CUDA code block
  • 9. The PG-Strom ProjectJAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS9 Case Study 創薬における類似度サーチ
  • 10. The PG-Strom Project 背景 – 病気と候補化合物の関係 JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS10 ターゲットの病気 関連するたんぱく質 化合物 (= 医薬品の候補) ターゲットたんぱく質に “active” である化合物の探索 inactive active active (毒性あり) 学術論文
  • 11. The PG-Strom Project k-NN法による類似化合物サーチ (1/2) JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS11 データベース化合物群 (D; ~1000万件程度) クエリ化合物群 (Q; ~1000件程度) 類似度による サーチ ターゲットたんぱく質 “似た特性の化合物”は “active”である可能性も高いはず。 学術論文等から ターゲットたんぱく質に “active” である化合物 をピックアップ
  • 12. The PG-Strom Project k-NN法による類似化合物サーチ (2/2) JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS12 類似度 = 距離の定義 ID NAME Fingerprint (1024bit) 1 CHEMBL153534 000000000001000000100000000000000100000000000001000000... 2 CHEMBL405398 000000000000000100100000000000000000000000000000100000... 3 CHEMBL503634 000001000000000000000000001000000100000000000000000000... : : : 化合物のデータ構造 Tanimoto Indexによる類似度の定義: 𝑆𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦 𝐴, 𝐵 = 𝐴 𝐹𝑃 ∩ 𝐵 𝐹𝑃 𝐴 𝐹𝑃 ∪ 𝐵 𝐹𝑃
  • 13. The PG-Strom Project 必要な計算量 JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS13 データベース化合物群 (D; 10M件程度) Q: クエリ化合物群 (~1000件程度) 上位3件の平均 𝑑𝑖 ∈ 𝐷 d 𝑄, 𝑑𝑖 : Q~di間の距離 𝑑𝑗 ∈ 𝐷 上位3件の平均 計算量の目安: 𝑂 𝑄 × 𝐷 + 𝑂 𝐷 × 𝑄𝑙𝑜𝑔𝑄 (距離計算) (ソート+平均値) d 𝑄, 𝑑𝑗 : Q~dj間の距離
  • 14. The PG-Strom Project PL/CUDA関数の実装 (1/3) JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS14 Step-1 全てのQ×Dの論理的な組み合わせを、 複数のパーティションに分割。これらを GPUの実行ユニットであるSMMに割り当て。 Step-2 各GPUコアがQ化合物群とd化合物間の 類似度スコアを算出。 L1キャッシュと同等のレイテンシでアクセス 可能な “共有メモリ” にこれを格納
  • 15. The PG-Strom Project PL/CUDA関数の実装 (2/3) JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS15 Step-3 類似度スコアによる Bitonic-Sorting を実行。 ある d 化合物に対する q 化合物が、類似度 の順に並ぶことになる。 Step-5 類似度上位k件による平均値を 算出し、結果バッファに格納。 Step-4 Q化合物群のサイズが共有メモリよりも巨大な場合、 Step-2以降を繰り返し。
  • 16. The PG-Strom Project PL/CUDA関数の実装 (3/3) JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS16 CREATE OR REPLACE FUNCTION knn_gpu_similarity(int, -- k-value int[], -- ID+bitmap of Q int[]) -- ID+bitmap of D RETURNS float4[] -- result: ID+similarity AS $$ #plcuda_decl : #plcuda_begin #plcuda_kernel_blocksz ¥ knn_gpu_similarity_main_block_size #plcuda_num_threads ¥ knn_gpu_similarity_main_num_threads #plcuda_shmem_blocksz 8192 cl_int k = arg1.value; MatrixType *Q = (MatrixType *) arg2.value; MatrixType *D = (MatrixType *) arg3.value; MatrixType *R = (MatrixType *) results; : for (loop=0; loop < nloops; loop++) { /* 1. calculation of the similarity */ for (i = get_local_id(); i < part_sz * part_nums; i += get_local_size()) { j = i % part_sz; /* index within partition */ dindex = part_nums * get_global_index() + (i / part_sz); qindex = loop * (part_sz - k) + (j - k); if (dindex < ARRAY_MATRIX_HEIGHT(D) && qindex < ARRAY_MATRIX_HEIGHT(Q)) { values[i] = knn_similarity_compute(D, dindex, Q, qindex); } } __syncthreads(); /* 2. sorting by the similarity for each partition */ knn_similarity_sorting(values, part_sz, part_nums); __syncthreads(); : } #plcuda_end #plcuda_sanity_check knn_gpu_similarity_sanity_check #plcuda_working_bufsz 0 #plcuda_results_bufsz knn_gpu_similarity_results_bufsz $$ LANGUAGE 'plcuda'; real[] -- ID+Similarity of D化合物 (2xN) knn_gpu_similarity(int k, -- k-value int[] Q, -- ID+Fingerprint of Q化合物 (33xM) int[] D); -- ID+Fingerprint of D化合物 (33xN)
  • 17. The PG-Strom Project パフォーマンス JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS17  CPU版は、同等のロジックをC言語によるバイナリ版で実装して比較計測  D化合物群の数は1000万レコード、Q化合物群の数は10,50,100,500,1000個の5通り  最大で100億通りの組合せを計算。これは実際の創薬ワークロードの規模と同等。  HW) p2.xlargeインスタンス, 4vCPU, GPU: Tesla K80/2, RAM: 61GB  SW) CentOS7, CUDA7.5, PostgreSQL v9.5 + PG-Strom v1.0 34.29 165.06 333.30 1723.91 3487.90 17.44 18.27 19.33 25.81 34.57 0 500 1000 1500 2000 2500 3000 3500 10 50 100 500 1000 SQLクエリ応答時間[sec] (shorterisbetter) クエリ化合物数 k-NN法による類似化合物サーチ SQL応答時間 CPU (???) GPU (Tesla K80/2) x100 times faster!
  • 18. The PG-Strom Project まとめ JAWS-UG HPC#8 / Run Drug-Discovery Workloads In-database, On AWS18 ▌なぜ In-database Analytics なのか?  データのある場所で計算を行う  前処理/後処理もSQLで楽々 でも、アルゴリズムの中核部分はとてもDBに捌ける計算量ではなかった ▌PL/CUDA  CUDAを使ってSQL関数を実装するための機能  PL/CUDA関数の引数や戻り値は、ランタイムが自動的に CPUGPU 間を 転送してくれる。 DBの弱点である “計算能力” を補完するための機能。 ▌今後の展望  関数の引数/戻り値として 1GB を越えるデータの受け渡しができない。 (PostgreSQL可変長データ形式の制限による) 最大4TBまで扱えるようにするため、可変長データ形式の拡張を議論中。  “よく使う” 解析アルゴリズムのパッケージ化。 一緒に “検証やろうぜ!” って方、ぜひお声がけを!