SlideShare una empresa de Scribd logo
1 de 49
Descargar para leer sin conexión
PL/CUDA
~Fusion of HPC Grade Power with In-Database Analytics~
The PG-Strom Project / NEC OSS Promotion Center
KaiGai Kohei <kaigai@ak.jp.nec.com>
http://www.slideshare.net/kaigai/pgconfasia2016-plcuda
The PG-Strom Project
自己紹介
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics2
▌KaiGai Kohei
 tw: @kkaigai
 https://github.com/kaigai
▌PostgreSQL
 SELinux, FDW, CustomScan, ...
▌PG-Strom
 GPUを用いたPostgreSQL向け
高速化モジュールの作者
▌お仕事
 NEC OSS推進センタ
 SW開発/ビジネス開拓
The PG-Strom Project
PG-Strom概要 (1/2) – アーキテクチャ
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics3
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 (Graphic Processor Unit) の特徴
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics4
GPU CPU
Model
NVIDIA
Tesla P100
Intel Xeon
E5-2699v4
Architecture Pascal Broadwell
Launch Q2-2016 Q1-2016
# of transistors 15billion 7.2billion
# of cores
3584
(simple)
22
(functional)
core clock
1.126GHz
~1.303GHz
2.20GHz
~3.60GHz
Perk FFLOPS
(FP32)
9.3 TFLOPS
1.2 TFLOPS
(with AVX2)
DRAM Size 16GB (HBM2) max 1.5TB (DDR4)
Memory Band 732GB/s 76.8GB/s
Power
Consumption
250W 145W
The PG-Strom Project
PG-Strom概要 (2/2) – GPUバイナリの自動生成
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics
QUERY: SELECT cat, count(*), avg(x) FROM t0
WHERE x between y and y + 20.0 GROUP BY cat;
:
STATIC_FUNCTION(bool)
gpupreagg_qual_eval(kern_context *kcxt,
kern_data_store *kds,
size_t kds_index)
{
pg_float8_t KPARAM_1 = pg_float8_param(kcxt,1);
pg_float8_t KVAR_3 = pg_float8_vref(kds,kcxt,2,kds_index);
pg_float8_t KVAR_4 = pg_float8_vref(kds,kcxt,3,kds_index);
return EVAL((pgfn_float8ge(kcxt, KVAR_3, KVAR_4) &&
pgfn_float8le(kcxt, KVAR_3,
pgfn_float8pl(kcxt, KVAR_4, KPARAM_1))));
} :
例) WHERE句での計算式を
CUDAプログラムに変換。
Reference to input data
SQL expression in CUDA source code
Run-time
Compiler
(nvrtc)
Just-in-time
Compile
Parallel
Execution
5
The PG-Strom Project
GPUによるSQL実行高速化の一例
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics6
▌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
v1.0開発過程におけるユーザからのフィードバック
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics7
Application
Storage
Query
Optimizer
Query
Executor
PG-Strom
Extension
SQL Parser
Storage Manager
GPU
計算集約的ワークロード
• In-database Analytics
• 科学技術計算、マーケティング
 by PL/CUDA + Matrix-Array
I/O集約的ワークロード
• 汎用の大規模OLAP
• ETL、レポーティング
 by SSD-to-GPU P2P DMA
The PG-Strom ProjectPGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics8
Introduction of PL/CUDA
The PG-Strom Project
失敗から学ぶ (1/3) – アルゴリズムをSQLで記述する
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics9
Apr-2016
The PG-Strom Project
失敗から学ぶ (2/3) – 性能上のアドバンテージ (?)
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics10
Apr-2016
The PG-Strom Project
失敗から学ぶ (3/3) – 問題点
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics11
▌問題① – SQLでアルゴリズムを記述する人なんていない。
 そもそも、アルゴリズムの大半は手続き型言語を前提として開発されている。
 ユーザがCUDAでアルゴリズムの核を記述する必要がないとしても、
これは権局、SQLのパズルを考えながらアルゴリズムのロジックを記述
しているのと同じ事。
▌問題② – 性能上のメリットは本当にあった?
 Min-Max法の距離計算において、確かにPG-Stromの実行性能は
PostgreSQLを遥かに上回っているが、そもそも、この種の計算を
PostgreSQLで行っている人っていないんじゃないの?
 GpuProjectionの性能は、このアルゴリズムを処理するために設計された
CPU版の外部アプリの性能と概ね同等だった。なぜ?
 SQL互換性に由来する非効率性
 PostgreSQLの行フォーマットに由来する非効率性
The PG-Strom Project
解決策 – PL/CUDA + Array-Matrix
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics12
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関数定義の例
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics13
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 Project
どのようにGPUカーネルを起動するか
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics14
CREATE OR REPLACE FUNCTION
my_cuda_func(float[])
RETURNS int[]
$$
#plcuda_sanity_check func_sc
#plcuda_begin
#plcuda_end
#plcuda_working_bufsz func_wb
$$ LANGUAGE ‘plcuda’;
ユーザ定義のCUDAコードブロック
bool func_sc(float[])
引数チェックのためのヘルパー関数
bigint func_wb(float[])
バッファサイズ推定のためのヘルパー関数
GPU
バイナリ
GPU
カーネル
作業用
バッファ
PL/CUDA
関数の引数
ランタイム
コンパイラ
SQLデータの
入出力
ユーザ定義の
CUDAコードブロック
共通の
GPUライブラリ
GPUカーネルの
ソースコード
GPU側へ
引数をロード
The PG-Strom Project
自動生成のGPUコードがベスト性能を出せない理由
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics15
 各変数を参照するたびにNULLチェックが必要
 個々の四則演算の度にオーバフローチェックが必要
 プリミティブな演算を関数呼び出しで実現せざるを得ない
STATIC_FUNCTION(pg_float4_t)
pgfn_float4mul(kern_context *kcxt, pg_float4_t arg1, pg_float4_t arg2)
{
pg_float4_t result;
result.isnull = arg1.isnull | arg2.isnull;
if (!result.isnull)
{
result.value = arg1.value * arg2.value;
CHECKFLOATVAL(&kcxt->e, result,
isinf(arg1.value) || isinf(arg2.value),
arg1.value == 0.0 || arg2.value == 0.0);
}
return result;
}
select x*y from c_test;
The PG-Strom Project
データ形式に起因する非効率さ (1/2)
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics16
▌行形式(Row-oriented)データ
× 参照されない値も含む
× データアクセスに複数回のメモリ参照
〇 PostgreSQLにおける標準のデータ構造
▌列形式(Column-oriented)データ
〇 参照される列のみをロードできる
〇 O(1)でデータを参照できる
× データ形式の変換が必要
GPU
core
GPU
core
GPU
core
a c d feb
a c d feb
a d feb
a c d feb
GPU
core
eb
GPU
core
GPU
core
GPU
core
GPU
core
b
b
b
b
b
GPU
core
GPU
core
e
e
e
e
e
 通常のSQLワークロード程度の負荷では、さすがにデータ形式変換のコストを
正当化できないが、高度なアルゴリズム処理となると話は変わってくる。
The PG-Strom Project
データ形式に起因する非効率さ (2/2)
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics17
▌ランダムメモリアクセス (random memory access)
 メモリトランザクション回数が増える一方、メモリバスの使用率は決して高くない。
▌コアレスメモリアクセス (coalesced memory access)
 最小限のメモリトランザクションで、メモリバスの使用率を最大化する事ができる。
32bit
メモリトランザクション幅: 256bit
32bit 32bit32bit 32bit 32bit
32bit 32bit 32bit 32bit 32bit 32bit 32bit 32bit
メモリトランザクション幅: 256bit
32bit x 8 = 256bit: 256bit幅の
メモリトランザクションのうち、
256bit全てが有効なデータ
(バス使用率: 100%)
32bit x 1 = 32bit: 256bit幅の
メモリトランザクションのうち、
32bitだけが有効なデータ
(バス使用率: 12.5%)
GPU cores
GPU cores
The PG-Strom Project
行列表現としての二次元配列
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics18
▌datatype[] array_matrix(variadic datatype[])
 入力データを蓄積し二次元配列として出力する集約関数
 datatypeはint2, int4, int8, float4 および float8 のどれか。
 この二次元配列はNULLを含んでいてはならない。
▌SETOF record matrix_unnest(datatype[])
 m列n行の二次元配列を、m列から成るn個のレコードへと展開する関数。
▌課題
 可変長データを扱う事ができない。
 PostgreSQLの可変長データの制約により、最大でも1GBになってしまう。
ArrayType header a1 a2 aN… b1 b2 bN… c1 c2 cN… d1 d2 dN…
𝑎1 ⋯ 𝑑1
⋮ ⋱ ⋮
𝑎 𝑁 ⋯ 𝑑 𝑁
4列N行行列
Array-Matrix
非NULL固定長の二次元配列を “行列” と見なす
The PG-Strom Project
PL/CUDA関数の呼び出し例
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics19
SELECT row_number() OVER (),
float4_as_int4(R.key_id) key_id,
R.score
FROM matrix_unnest(
(SELECT my_plcuda_function(A.matrix,
B.matrix)
FROM (SELECT cbind(array_matrix(id),
array_matrix(x, y, z)) matrix
FROM normal_table
WHERE tag LIKE ‘%abc%’) A,
(SELECT matrix
FROM matrix_table) B
)
) AS R(key_id real, score real)
ORDER BY score DESC
LIMIT 1000;
2つのMatrix-like Arrayを
引数に持つ
PL/CUDA関数の呼出し
Matrix-like Arrayの生成、
または構築済みのものをロード
Matrix-like Arrayを
N個のレコードに再展開
SQLによる後処理
(JOIN, Window関数)
The PG-Strom ProjectPGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics20
Case Study
創薬における類似度サーチ
The PG-Strom Project
背景 – 病気と候補化合物の関係
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics21
ターゲットの病気
関連するたんぱく質
化合物 (= 医薬品の候補)
ターゲットたんぱく質に “active” である化合物の探索
inactive active
active
(毒性あり)
学術論文
The PG-Strom Project
k-NN法による類似化合物サーチ (1/2)
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics22
データベース化合物群
(D; ~1000万件程度)
クエリ化合物群
(Q; ~1000件程度)
類似度による
サーチ
ターゲットたんぱく質
“似た特性の化合物”は
“active”である可能性も高いはず。
学術論文等から
ターゲットたんぱく質に
“active” である化合物
をピックアップ
The PG-Strom Project
k-NN法による類似化合物サーチ (2/2)
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics23
類似度 = 距離の定義
ID NAME Fingerprint (1024bit)
1 CHEMBL153534 000000000001000000100000000000000100000000000001000000...
2 CHEMBL405398 000000000000000100100000000000000000000000000000100000...
3 CHEMBL503634 000001000000000000000000001000000100000000000000000000...
: : :
化合物のデータ構造
Tanimoto Indexによる類似度の定義:
𝑆𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦 𝐴, 𝐵 = 𝐴 𝐹𝑃 ∩ 𝐵 𝐹𝑃 𝐴 𝐹𝑃 ∪ 𝐵 𝐹𝑃
The PG-Strom Project
必要な計算量
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics24
データベース化合物群
(D; 10M件程度)
Q: クエリ化合物群
(~1000件程度)
上位3件の平均
𝑑𝑖 ∈ 𝐷
d 𝑄, 𝑑𝑖 : Q~di間の距離
𝑑𝑗 ∈ 𝐷
上位3件の平均
計算量の目安:
𝑂 𝑄 × 𝐷 + 𝑂 𝐷 × 𝑄𝑙𝑜𝑔𝑄
(距離計算) (ソート+平均値)
d 𝑄, 𝑑𝑗 : Q~dj間の距離
The PG-Strom Project
PL/CUDA関数の実装 (1/3)
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics25
Step-1
全てのQ×Dの論理的な組み合わせを、
複数のパーティションに分割。これらを
GPUの実行ユニットであるSMMに割り当て。
Step-2
各GPUコアがQ化合物群とd化合物間の
類似度スコアを算出。
L1キャッシュと同等のレイテンシでアクセス
可能な “共有メモリ” にこれを格納
The PG-Strom Project
PL/CUDA関数の実装 (2/3)
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics26
Step-3
類似度スコアによる Bitonic-Sorting を実行。
ある d 化合物に対する q 化合物が、類似度
の順に並ぶことになる。
Step-5
類似度上位k件による平均値を
算出し、結果バッファに格納。
Step-4
Q化合物群のサイズが共有メモリよりも巨大な場合、
Step-2以降を繰り返し。
The PG-Strom Project
PL/CUDA関数の実装 (3/3)
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics27
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
PL/CUDA関数の呼出し
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics28
PREPARE knn_sim_rand_10m_gpu_v2(int) -- arg1:@k-value
AS
SELECT row_number() OVER (),
fp.name,
similarity
FROM (SELECT float4_as_int4(key_id) key_id, similarity
FROM matrix_unnest(
(SELECT rbind( knn_gpu_similarity($1,Q.matrix,
D.matrix))
FROM (SELECT cbind(array_matrix(id),
array_matrix(bitmap)) matrix
FROM finger_print_query) Q,
(SELECT matrix
FROM finger_print_10m_matrix) D
)
) AS sim(key_id real, similarity real)
ORDER BY similarity DESC) sim,
finger_print_10m fp
WHERE fp.id = sim.key_id
LIMIT 1000;
SQLによる後処理
• 他のテーブルとJOINして化合物ID化合物名を変換
• window関数による類似度順位の計算
Q行列/D行列を引数にとる
PL/CUDA関数の呼出し。
テーブルから読み出したレコードを
Array-Matrixに変換
(または、事前にビルド)
PL/CUDA関数の返り値である
3xNのArray-Matrixを展開し、
通常の3列N行のレコードへ変換
The PG-Strom Project
パフォーマンス
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics29
 CPU版は、同等のロジックをC言語によるバイナリ版で実装して比較計測
 D化合物群の数は1000万レコード、Q化合物群の数は10,50,100,500,1000個の5通り
 最大で100億通りの組合せを計算。これは実際の創薬ワークロードの規模と同等。
 HW) CPU: Xeon E5-2670v3, GPU: GTX980 / GTX1080, RAM:384GB
 SW) CentOS7, CUDA8.0, PostgreSQL v9.5 + PG-Strom v1.0
30.25
145.29
295.95
1503.31
3034.94
12.97 13.46 13.90 18.16 24.6513.00 13.23 13.59 16.01 19.13
0
500
1000
1500
2000
2500
3000
3500
10 50 100 500 1000
QueryResponseTime[sec]
(*Lowerisbetter)
クエリ化合物群の数[Q]
k-NN法による類似化合物サーチ応答時間 (k=3, D=10M)
CPU(E5-2670v3) GTX980 GTX1080
x150 times
faster!
The PG-Strom ProjectPGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics30
Another Usage
In-databaseでk-meansクラスタリング
The PG-Strom Project
クラスター分析
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics31
The PG-Strom Project
k-meansクラスタリング アルゴリズム
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics32
1. ランダムで初期クラスタ
を割り当て。
2. 各クラスタ毎に
クラスタ中心点を計算
3. 各要素から最も近傍の
クラスタ中心点を選択。
クラスタ割当てを更新。
The PG-Strom Project
k-meansクラスタリング アルゴリズム
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics33
1. ランダムで初期クラスタ
を割り当て。
5. 新しいクラスタ割当てに
基づいて、クラスタ中心
点を再計算
6. クラスタ中心点が変動
しなくなったので計算終了
4. 収束するか、一定回数に
達するまで繰り返し
The PG-Strom Project
PL/CUDAによるk-meansクラスタリングの実装
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics34
CREATE OR REPLACE FUNCTION
gpu_kmeans(real[], -- ID + Data Matrix
int, -- k-value (number of clusters)
int = 10, -- max number of iteration
int = 1) -- seed of initial randomness
RETURNS int[]
AS $$
#plcuda_decl
:
KERNEL_FUNCTION_MAXTHREADS(void)
update_centroid(MatrixType *D,
MatrixType *R,
MatrixType *C)
{
:
/* accumulate the local centroid */
for (did = get_global_id();
did < nitems;
did += get_global_size())
{
/* pick up the target cluster */
cid = r_values[nitems + did];
atomicAdd(&l_cent[cid], 1.0);
for (index=1; index < width; index++)
atomicAdd(&l_cent[index * k_value + cid],
d_values[index * nitems + did]);
}
__syncthreads();
/* write back to the global C-matrix */
for (index = get_local_id();
index < width * k_value;
index += get_local_size())
atomicAdd(&c_values[index], l_cent[index]);
}
:
#plcuda_begin
:
status = pgstromLaunchDynamicKernel4((void *)
setup_initial_cluster,
(kern_arg_t)(D),
(kern_arg_t)(R),
(kern_arg_t)(C),
(kern_arg_t)(r_seed),
nitems, 0, 0);
if (status != cudaSuccess)
PLCUDA_RUNTIME_ERROR_RETURN(status);
for (loop=0; loop < nloops; loop++)
{
:
status = pgstromLaunchDynamicKernelMaxThreads3(
(void *)kmeans_update_cluster,
(kern_arg_t)(D),
(kern_arg_t)(R),
(kern_arg_t)(C),
(kern_arg_t)k_value,
nitems, 0,
sizeof(cl_int) + sizeof(cl_float));
if (status != cudaSuccess)
PLCUDA_RUNTIME_ERROR_RETURN(status);
:
}
#plcuda_sanity_check gpu_kmeans_sanity_check
#plcuda_working_bufsz gpu_kmeans_working_bufsz
#plcuda_results_bufsz gpu_kmeans_results_bufsz
#plcuda_end
$$ LANGUAGE 'plcuda';
The PG-Strom Project
k-meansクラスタリングの検証に使用したデータ
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics35
▌データセットの概要
 測定区間毎に収集された自動車通行量の
パブリックデータ
 デンマーク・オーフス市(Arhus, Denmark)における
449観測点ののデータ。
 データ件数: 1350万件 (2014年2月~6月)
▌データに含まれるもの
 平均速度
 平均観測時間
 自動車台数
 測定区間(始点、終点)lの緯度・経
 など...
▌やった事
 平均速度や自動車台数によって測定区間を
5つのカテゴリに分割する。
The PG-Strom Project
GPU版k-means関数の呼出し
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics36
SELECT report_id, k, c
FROM (SELECT report_id, k, c,
row_number() OVER (PARTITION BY report_id
ORDER BY c DESC) rank
FROM (SELECT report_id, k, count(*) c
FROM matrix_unnest(
(SELECT gpu_kmeans ( array_matrix(
int4_as_float4(report_id),
avg_measured_time,
avg_speed,
vehicle_count),
5)
FROM tr_rawdata)
) R(report_id int, k int)
GROUP BY report_id, k
) __summary_1
) __summary_2
WHERE rank = 1;
Make a matrix from the raw-data
Run k-means clustering logic
Pick-up most frequent cluster
The PG-Strom Project
GPU版k-means (1/3) – 全データによるクラスタリング
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics37
$ wget -O map.png "`psql traffic -At -f ~/traffic.sql`"
バイパス道路?
市街地中心部へ
向かう道路?
環状道路?
The PG-Strom Project
GPU版k-means (2/3) – 日中と夜間
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics38
日中 (8-17) 夜間 (18-7)
The PG-Strom Project
GPU版k-means (3/3) – 平日と週末
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics39
平日 週末
The PG-Strom Project
GPU版k-means関数の呼出し
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics40
SELECT report_id, k, c
FROM (SELECT report_id, k, c,
row_number() OVER (PARTITION BY report_id
ORDER BY c DESC) rank
FROM (SELECT report_id, k, count(*) c
FROM matrix_unnest(
(SELECT gpu_kmeans ( array_matrix(
int4_as_float4(report_id),
avg_measured_time,
avg_speed,
vehicle_count),
5)
FROM tr_rawdata
WHERE extract('hour' from timestamp)
between 7 and 17
)
) R(report_id int, k int)
GROUP BY report_id, k
) __summary_1
) __summary_2
WHERE rank = 1;
実は条件句を追加しただけ。
(これがSQLの柔軟性!)
The PG-Strom Project
パフォーマンス (1/3)
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics41
CPUによるk-meansの代表的実装として、
MADLib版 kemans_random() 関数を使用
The PG-Strom Project
パフォーマンス (2/3) – MADLib版k-meansクラスタリングの呼出し
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics42
SELECT report_id, k, c
FROM (SELECT report_id, k, c,
row_number() OVER (PARTITION BY report_id
ORDER BY c DESC) rank
FROM (SELECT t.report_id,
(madlib.closest_column(centroids,
t.attrs)).column_id as k,
count(*) c
FROM tr_rawdata_madlib_s t,
(SELECT centroids
FROM madlib.kmeans_random('tr_rawdata_madlib',
'attrs',
5)
) km;
GROUP BY t.report_id, k
) __summary_1
) __summary_2
WHERE rank = 1;
クラスタ中心点の導出
最近傍クラスタの選択
The PG-Strom Project
パフォーマンス (3/3) – GPU版 vs CPU版実装
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics43
 測定環境
 HW) CPU: Xeon E5-2670v3, GPU: GTX1080, RAM: 384GB
 SW) CentOS7, CUDA8.0, PostgreSQL v9.5 + PG-Strom v1.0, MADLib 1.9
 CPU版は、同等のロジックをC言語によるバイナリ版で実装して比較計測
1.41 12.44
126.59
1668.49
0.21 0.29 0.94 8.41
0
200
400
600
800
1000
1200
1400
1600
1800
10,000 100,000 1,000,000 13,577,132
QueryResponseTime[sec]
(※Lowerisbetter)
Number of Items that were clustered based on the k-means algorithm
Performance comparison of in-database k-means clustering
MADLib PL/CUDA
x200倍高速化
The PG-Strom ProjectPGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics44
まとめ
The PG-Strom Project
まとめ (1/3) – おさらい
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics45
▌PL/CUDAとは?
 PG-Stromのオリジナルのコンセプトは自動最適化/自動コード生成
 手動最適化と引換えに、PL/CUDAはGPU性能を最大限引き出すための手段。
たぶん、高度なアルゴリズムをSQLで書いている人はいないので正しい選択
▌利点
 TFLOPS級の計算エンジンをIn-Database Analyticsで使用できる。
 外部アプリケーションを使用する場合と異なり、データセット全体を
DBからエクスポートする必要がなくなる。
 取り出す必要があるのは “処理結果” だけ
 解析アルゴリズムの前処理/後処理で、SQLによる柔軟なデータ操作が可能
 JOIN、GROUP BY、Window関数、etc...
The PG-Strom Project
まとめ (2/3) – 適用領域
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics46
▌実証実験① – 創薬領域における類似化合物検索
 化合物の特徴を fingerprint (= 特徴ベクトル)として表現。
GPUで類似度スコアを計算しスコア上位の組合せを抽出。
▌実証実験② – センサデータを用いた教師なし学習
 センサが生成した情報を用いてGPUで要素間距離を計算。
道路の特徴を抽出して数個のカテゴリへと自動分類。
▌考えられる適用領域
 化合物探索 ... 医薬、化学品、素材系
 レコメンデーションエンジン ... e-コマース領域
 アノマリー検知 ... セキュリティ分野
 データマイニング ... マーケティング
 ...など...
The PG-Strom Project
まとめ (3/3) – 課題と展望
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics47
▌技術面
 1GBを越えるサイズのArray-Matrixの取り扱い
 PostgreSQL可変長データ型の制約により、SQL関数の個々の引数が
1GBより大きなサイズを持つ事ができない。
 (↑12/1のdeveloper meetingでも議論する)
 繰り返し何度も同じArray-Matrixを使用する場合の処理コスト
 GPU側に静的なArray-Matrixを置いたままにできれば嬉しいかも。
▌運用面
 SQLとCUDAを両方書ける人はなかなか多くない。
 “定番の” アルゴリズムをパッケージ化
 専門エンジニアによるコンサルティング、構築サービス
実証実験のお誘い、お待ちしております。
The PG-Strom Project
リソース
PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics48
▌リポジトリ
https://github.com/pg-strom/devel
▌本日のスライド
http://www.slideshare.net/kaigai/pgconfasia2016-plcuda
▌コンタクト
 e-mail: kaigai@ak.jp.nec.com
 Tw: @kkaigai
一緒に開発しようぜ!って人もお待ちしております。
Question?

Más contenido relacionado

La actualidad más candente

20210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.020210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.0Kohei KaiGai
 
20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCacheKohei KaiGai
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャKohei KaiGai
 
20200828_OSCKyoto_Online
20200828_OSCKyoto_Online20200828_OSCKyoto_Online
20200828_OSCKyoto_OnlineKohei KaiGai
 
[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 株式会社...Insight Technology, Inc.
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsKohei KaiGai
 
20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrowKohei KaiGai
 
20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdwKohei KaiGai
 
20170726 py data.tokyo
20170726 py data.tokyo20170726 py data.tokyo
20170726 py data.tokyoManaMurakami1
 
20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdw20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdwKohei KaiGai
 
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]Kohei KaiGai
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstromKohei KaiGai
 
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】Kohei KaiGai
 
20191115-PGconf.Japan
20191115-PGconf.Japan20191115-PGconf.Japan
20191115-PGconf.JapanKohei KaiGai
 
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 BigDataKohei KaiGai
 
20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDB20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDBKohei KaiGai
 
NVIDIA TESLA V100・CUDA 9 のご紹介
NVIDIA TESLA V100・CUDA 9 のご紹介NVIDIA TESLA V100・CUDA 9 のご紹介
NVIDIA TESLA V100・CUDA 9 のご紹介NVIDIA Japan
 
20180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #1020180217 FPGA Extreme Computing #10
20180217 FPGA Extreme Computing #10Kohei KaiGai
 
Maxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングMaxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングNVIDIA Japan
 

La actualidad más candente (20)

20210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.020210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.0
 
20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ
 
20200828_OSCKyoto_Online
20200828_OSCKyoto_Online20200828_OSCKyoto_Online
20200828_OSCKyoto_Online
 
[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 株式会社...
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
 
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
 
20170726 py data.tokyo
20170726 py data.tokyo20170726 py data.tokyo
20170726 py data.tokyo
 
20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdw20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdw
 
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]
 
20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom20171220_hbstudy80_pgstrom
20171220_hbstudy80_pgstrom
 
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
SSDとGPUがPostgreSQLを加速する【OSC.Enterprise】
 
20191115-PGconf.Japan
20191115-PGconf.Japan20191115-PGconf.Japan
20191115-PGconf.Japan
 
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
 
20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDB20171212_GTCJapan_InceptionSummt_HeteroDB
20171212_GTCJapan_InceptionSummt_HeteroDB
 
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プログラミング
 
Cuda
CudaCuda
Cuda
 

Destacado

PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介Masahiko Sawada
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
pgconfasia2016 plcuda en
pgconfasia2016 plcuda enpgconfasia2016 plcuda en
pgconfasia2016 plcuda enKohei KaiGai
 
Migr8.rb チュートリアル
Migr8.rb チュートリアルMigr8.rb チュートリアル
Migr8.rb チュートリアルkwatch
 
今すぐ使えるクラウドとPostgreSQL
今すぐ使えるクラウドとPostgreSQL今すぐ使えるクラウドとPostgreSQL
今すぐ使えるクラウドとPostgreSQLSoudai Sone
 
HAWQをCDHで動かしてみた
HAWQをCDHで動かしてみたHAWQをCDHで動かしてみた
HAWQをCDHで動かしてみたadachij2002
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeToshi Harada
 
Ivsctonightandday2016winter moringsession awsreinvent2016recap
Ivsctonightandday2016winter moringsession awsreinvent2016recapIvsctonightandday2016winter moringsession awsreinvent2016recap
Ivsctonightandday2016winter moringsession awsreinvent2016recapTadashi Okazaki
 
初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜
初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜
初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜Takeshi Wakamatsu
 
レシピブログのサービス設計と今後の展望
レシピブログのサービス設計と今後の展望レシピブログのサービス設計と今後の展望
レシピブログのサービス設計と今後の展望Masaki Nakagawa
 
【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループ
【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループ【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループ
【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループAPCommunications-recruit
 
[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo Nagata
[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo Nagata[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo Nagata
[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo NagataInsight Technology, Inc.
 
最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介
最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介
最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介IBM Analytics Japan
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016Takayuki Shimizukawa
 
サーバーワークス re:invent_2016~新サービス・アップデート紹介~
サーバーワークス re:invent_2016~新サービス・アップデート紹介~サーバーワークス re:invent_2016~新サービス・アップデート紹介~
サーバーワークス re:invent_2016~新サービス・アップデート紹介~Serverworks Co.,Ltd.
 
35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだことShinnosuke Akita
 
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...Insight Technology, Inc.
 
地方エンジニアがPostgreSQLを通じて成長した話
地方エンジニアがPostgreSQLを通じて成長した話地方エンジニアがPostgreSQLを通じて成長した話
地方エンジニアがPostgreSQLを通じて成長した話Soudai Sone
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫Insight Technology, Inc.
 

Destacado (20)

PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
pgconfasia2016 plcuda en
pgconfasia2016 plcuda enpgconfasia2016 plcuda en
pgconfasia2016 plcuda en
 
Migr8.rb チュートリアル
Migr8.rb チュートリアルMigr8.rb チュートリアル
Migr8.rb チュートリアル
 
今すぐ使えるクラウドとPostgreSQL
今すぐ使えるクラウドとPostgreSQL今すぐ使えるクラウドとPostgreSQL
今すぐ使えるクラウドとPostgreSQL
 
HAWQをCDHで動かしてみた
HAWQをCDHで動かしてみたHAWQをCDHで動かしてみた
HAWQをCDHで動かしてみた
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatype
 
Ivsctonightandday2016winter moringsession awsreinvent2016recap
Ivsctonightandday2016winter moringsession awsreinvent2016recapIvsctonightandday2016winter moringsession awsreinvent2016recap
Ivsctonightandday2016winter moringsession awsreinvent2016recap
 
初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜
初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜
初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜
 
レシピブログのサービス設計と今後の展望
レシピブログのサービス設計と今後の展望レシピブログのサービス設計と今後の展望
レシピブログのサービス設計と今後の展望
 
【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループ
【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループ【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループ
【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループ
 
[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo Nagata
[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo Nagata[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo Nagata
[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo Nagata
 
最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介
最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介
最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
 
サーバーワークス re:invent_2016~新サービス・アップデート紹介~
サーバーワークス re:invent_2016~新サービス・アップデート紹介~サーバーワークス re:invent_2016~新サービス・アップデート紹介~
サーバーワークス re:invent_2016~新サービス・アップデート紹介~
 
35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと35歳でDBAになった私がデータベースを壊して学んだこと
35歳でDBAになった私がデータベースを壊して学んだこと
 
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
 
地方エンジニアがPostgreSQLを通じて成長した話
地方エンジニアがPostgreSQLを通じて成長した話地方エンジニアがPostgreSQLを通じて成長した話
地方エンジニアがPostgreSQLを通じて成長した話
 
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
 

Similar a PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics

20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei KaiGai
 
20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JPKohei KaiGai
 
20170421 tensor flowusergroup
20170421 tensor flowusergroup20170421 tensor flowusergroup
20170421 tensor flowusergroupManaMurakami1
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_TokyoKohei KaiGai
 
1070: CUDA プログラミング入門
1070: CUDA プログラミング入門1070: CUDA プログラミング入門
1070: CUDA プログラミング入門NVIDIA Japan
 
機械学習とこれを支える並列計算: ディープラーニング・スーパーコンピューターの応用について
機械学習とこれを支える並列計算: ディープラーニング・スーパーコンピューターの応用について機械学習とこれを支える並列計算: ディープラーニング・スーパーコンピューターの応用について
機械学習とこれを支える並列計算: ディープラーニング・スーパーコンピューターの応用についてハイシンク創研 / Laboratory of Hi-Think Corporation
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfaceKohei KaiGai
 
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)Ryuuta Tsunashima
 
20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGIS20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGISKohei KaiGai
 
200625material naruse
200625material naruse200625material naruse
200625material naruseRCCSRENKEI
 
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜griddb
 
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境智啓 出川
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門NVIDIA Japan
 
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 TezGw Liu
 
Kubernetes on Alibaba Cloud
Kubernetes on Alibaba CloudKubernetes on Alibaba Cloud
Kubernetes on Alibaba Cloud真吾 吉田
 
GPU-FPGA協調プログラミングを実現するコンパイラの開発
GPU-FPGA協調プログラミングを実現するコンパイラの開発GPU-FPGA協調プログラミングを実現するコンパイラの開発
GPU-FPGA協調プログラミングを実現するコンパイラの開発Ryuuta Tsunashima
 
【A-1】AIを支えるGPUコンピューティングの今
【A-1】AIを支えるGPUコンピューティングの今【A-1】AIを支えるGPUコンピューティングの今
【A-1】AIを支えるGPUコンピューティングの今Developers Summit
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Fixstars Corporation
 

Similar a PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics (20)

20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP20180920_DBTS_PGStrom_JP
20180920_DBTS_PGStrom_JP
 
20170421 tensor flowusergroup
20170421 tensor flowusergroup20170421 tensor flowusergroup
20170421 tensor flowusergroup
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo
 
1070: CUDA プログラミング入門
1070: CUDA プログラミング入門1070: CUDA プログラミング入門
1070: CUDA プログラミング入門
 
機械学習とこれを支える並列計算: ディープラーニング・スーパーコンピューターの応用について
機械学習とこれを支える並列計算: ディープラーニング・スーパーコンピューターの応用について機械学習とこれを支える並列計算: ディープラーニング・スーパーコンピューターの応用について
機械学習とこれを支える並列計算: ディープラーニング・スーパーコンピューターの応用について
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
 
20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGIS20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGIS
 
200625material naruse
200625material naruse200625material naruse
200625material naruse
 
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
 
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
2015年度GPGPU実践基礎工学 第14回 GPGPU組込開発環境
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門
 
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
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
Kubernetes on Alibaba Cloud
Kubernetes on Alibaba CloudKubernetes on Alibaba Cloud
Kubernetes on Alibaba Cloud
 
GPU-FPGA協調プログラミングを実現するコンパイラの開発
GPU-FPGA協調プログラミングを実現するコンパイラの開発GPU-FPGA協調プログラミングを実現するコンパイラの開発
GPU-FPGA協調プログラミングを実現するコンパイラの開発
 
【A-1】AIを支えるGPUコンピューティングの今
【A-1】AIを支えるGPUコンピューティングの今【A-1】AIを支えるGPUコンピューティングの今
【A-1】AIを支えるGPUコンピューティングの今
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 

Más de Kohei KaiGai

20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_HistoryKohei KaiGai
 
20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_APIKohei KaiGai
 
20210928_pgunconf_hll_count
20210928_pgunconf_hll_count20210928_pgunconf_hll_count
20210928_pgunconf_hll_countKohei KaiGai
 
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_IndexKohei KaiGai
 
20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGISKohei KaiGai
 
20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_ProcessingKohei KaiGai
 
20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_FdwKohei KaiGai
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_BetaKohei KaiGai
 
20190925_DBTS_PGStrom
20190925_DBTS_PGStrom20190925_DBTS_PGStrom
20190925_DBTS_PGStromKohei KaiGai
 
20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGaiKohei KaiGai
 
20190516_DLC10_PGStrom
20190516_DLC10_PGStrom20190516_DLC10_PGStrom
20190516_DLC10_PGStromKohei KaiGai
 
20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_FdwKohei KaiGai
 
20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - English20181212 - PGconfASIA - LT - English
20181212 - PGconfASIA - LT - EnglishKohei KaiGai
 
20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA Unconference20181210 - PGconf.ASIA Unconference
20181210 - PGconf.ASIA UnconferenceKohei KaiGai
 
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 PostgreSQLKohei KaiGai
 
20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multi20181016_pgconfeu_ssd2gpu_multi
20181016_pgconfeu_ssd2gpu_multiKohei KaiGai
 
20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdw20181025_pgconfeu_lt_gstorefdw
20181025_pgconfeu_lt_gstorefdwKohei KaiGai
 
20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_EN20180920_DBTS_PGStrom_EN
20180920_DBTS_PGStrom_ENKohei KaiGai
 

Más de Kohei KaiGai (18)

20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History
 
20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API
 
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
 
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
 

Último

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 

Último (10)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 

PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics

  • 1. PL/CUDA ~Fusion of HPC Grade Power with In-Database Analytics~ The PG-Strom Project / NEC OSS Promotion Center KaiGai Kohei <kaigai@ak.jp.nec.com> http://www.slideshare.net/kaigai/pgconfasia2016-plcuda
  • 2. The PG-Strom Project 自己紹介 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics2 ▌KaiGai Kohei  tw: @kkaigai  https://github.com/kaigai ▌PostgreSQL  SELinux, FDW, CustomScan, ... ▌PG-Strom  GPUを用いたPostgreSQL向け 高速化モジュールの作者 ▌お仕事  NEC OSS推進センタ  SW開発/ビジネス開拓
  • 3. The PG-Strom Project PG-Strom概要 (1/2) – アーキテクチャ PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics3 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 (Graphic Processor Unit) の特徴 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics4 GPU CPU Model NVIDIA Tesla P100 Intel Xeon E5-2699v4 Architecture Pascal Broadwell Launch Q2-2016 Q1-2016 # of transistors 15billion 7.2billion # of cores 3584 (simple) 22 (functional) core clock 1.126GHz ~1.303GHz 2.20GHz ~3.60GHz Perk FFLOPS (FP32) 9.3 TFLOPS 1.2 TFLOPS (with AVX2) DRAM Size 16GB (HBM2) max 1.5TB (DDR4) Memory Band 732GB/s 76.8GB/s Power Consumption 250W 145W
  • 5. The PG-Strom Project PG-Strom概要 (2/2) – GPUバイナリの自動生成 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics QUERY: SELECT cat, count(*), avg(x) FROM t0 WHERE x between y and y + 20.0 GROUP BY cat; : STATIC_FUNCTION(bool) gpupreagg_qual_eval(kern_context *kcxt, kern_data_store *kds, size_t kds_index) { pg_float8_t KPARAM_1 = pg_float8_param(kcxt,1); pg_float8_t KVAR_3 = pg_float8_vref(kds,kcxt,2,kds_index); pg_float8_t KVAR_4 = pg_float8_vref(kds,kcxt,3,kds_index); return EVAL((pgfn_float8ge(kcxt, KVAR_3, KVAR_4) && pgfn_float8le(kcxt, KVAR_3, pgfn_float8pl(kcxt, KVAR_4, KPARAM_1)))); } : 例) WHERE句での計算式を CUDAプログラムに変換。 Reference to input data SQL expression in CUDA source code Run-time Compiler (nvrtc) Just-in-time Compile Parallel Execution 5
  • 6. The PG-Strom Project GPUによるSQL実行高速化の一例 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics6 ▌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
  • 7. The PG-Strom Project v1.0開発過程におけるユーザからのフィードバック PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics7 Application Storage Query Optimizer Query Executor PG-Strom Extension SQL Parser Storage Manager GPU 計算集約的ワークロード • In-database Analytics • 科学技術計算、マーケティング  by PL/CUDA + Matrix-Array I/O集約的ワークロード • 汎用の大規模OLAP • ETL、レポーティング  by SSD-to-GPU P2P DMA
  • 8. The PG-Strom ProjectPGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics8 Introduction of PL/CUDA
  • 9. The PG-Strom Project 失敗から学ぶ (1/3) – アルゴリズムをSQLで記述する PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics9 Apr-2016
  • 10. The PG-Strom Project 失敗から学ぶ (2/3) – 性能上のアドバンテージ (?) PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics10 Apr-2016
  • 11. The PG-Strom Project 失敗から学ぶ (3/3) – 問題点 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics11 ▌問題① – SQLでアルゴリズムを記述する人なんていない。  そもそも、アルゴリズムの大半は手続き型言語を前提として開発されている。  ユーザがCUDAでアルゴリズムの核を記述する必要がないとしても、 これは権局、SQLのパズルを考えながらアルゴリズムのロジックを記述 しているのと同じ事。 ▌問題② – 性能上のメリットは本当にあった?  Min-Max法の距離計算において、確かにPG-Stromの実行性能は PostgreSQLを遥かに上回っているが、そもそも、この種の計算を PostgreSQLで行っている人っていないんじゃないの?  GpuProjectionの性能は、このアルゴリズムを処理するために設計された CPU版の外部アプリの性能と概ね同等だった。なぜ?  SQL互換性に由来する非効率性  PostgreSQLの行フォーマットに由来する非効率性
  • 12. The PG-Strom Project 解決策 – PL/CUDA + Array-Matrix PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics12 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次元配列を“行列”と解釈
  • 13. The PG-Strom Project PL/CUDA関数定義の例 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics13 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
  • 14. The PG-Strom Project どのようにGPUカーネルを起動するか PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics14 CREATE OR REPLACE FUNCTION my_cuda_func(float[]) RETURNS int[] $$ #plcuda_sanity_check func_sc #plcuda_begin #plcuda_end #plcuda_working_bufsz func_wb $$ LANGUAGE ‘plcuda’; ユーザ定義のCUDAコードブロック bool func_sc(float[]) 引数チェックのためのヘルパー関数 bigint func_wb(float[]) バッファサイズ推定のためのヘルパー関数 GPU バイナリ GPU カーネル 作業用 バッファ PL/CUDA 関数の引数 ランタイム コンパイラ SQLデータの 入出力 ユーザ定義の CUDAコードブロック 共通の GPUライブラリ GPUカーネルの ソースコード GPU側へ 引数をロード
  • 15. The PG-Strom Project 自動生成のGPUコードがベスト性能を出せない理由 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics15  各変数を参照するたびにNULLチェックが必要  個々の四則演算の度にオーバフローチェックが必要  プリミティブな演算を関数呼び出しで実現せざるを得ない STATIC_FUNCTION(pg_float4_t) pgfn_float4mul(kern_context *kcxt, pg_float4_t arg1, pg_float4_t arg2) { pg_float4_t result; result.isnull = arg1.isnull | arg2.isnull; if (!result.isnull) { result.value = arg1.value * arg2.value; CHECKFLOATVAL(&kcxt->e, result, isinf(arg1.value) || isinf(arg2.value), arg1.value == 0.0 || arg2.value == 0.0); } return result; } select x*y from c_test;
  • 16. The PG-Strom Project データ形式に起因する非効率さ (1/2) PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics16 ▌行形式(Row-oriented)データ × 参照されない値も含む × データアクセスに複数回のメモリ参照 〇 PostgreSQLにおける標準のデータ構造 ▌列形式(Column-oriented)データ 〇 参照される列のみをロードできる 〇 O(1)でデータを参照できる × データ形式の変換が必要 GPU core GPU core GPU core a c d feb a c d feb a d feb a c d feb GPU core eb GPU core GPU core GPU core GPU core b b b b b GPU core GPU core e e e e e  通常のSQLワークロード程度の負荷では、さすがにデータ形式変換のコストを 正当化できないが、高度なアルゴリズム処理となると話は変わってくる。
  • 17. The PG-Strom Project データ形式に起因する非効率さ (2/2) PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics17 ▌ランダムメモリアクセス (random memory access)  メモリトランザクション回数が増える一方、メモリバスの使用率は決して高くない。 ▌コアレスメモリアクセス (coalesced memory access)  最小限のメモリトランザクションで、メモリバスの使用率を最大化する事ができる。 32bit メモリトランザクション幅: 256bit 32bit 32bit32bit 32bit 32bit 32bit 32bit 32bit 32bit 32bit 32bit 32bit 32bit メモリトランザクション幅: 256bit 32bit x 8 = 256bit: 256bit幅の メモリトランザクションのうち、 256bit全てが有効なデータ (バス使用率: 100%) 32bit x 1 = 32bit: 256bit幅の メモリトランザクションのうち、 32bitだけが有効なデータ (バス使用率: 12.5%) GPU cores GPU cores
  • 18. The PG-Strom Project 行列表現としての二次元配列 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics18 ▌datatype[] array_matrix(variadic datatype[])  入力データを蓄積し二次元配列として出力する集約関数  datatypeはint2, int4, int8, float4 および float8 のどれか。  この二次元配列はNULLを含んでいてはならない。 ▌SETOF record matrix_unnest(datatype[])  m列n行の二次元配列を、m列から成るn個のレコードへと展開する関数。 ▌課題  可変長データを扱う事ができない。  PostgreSQLの可変長データの制約により、最大でも1GBになってしまう。 ArrayType header a1 a2 aN… b1 b2 bN… c1 c2 cN… d1 d2 dN… 𝑎1 ⋯ 𝑑1 ⋮ ⋱ ⋮ 𝑎 𝑁 ⋯ 𝑑 𝑁 4列N行行列 Array-Matrix 非NULL固定長の二次元配列を “行列” と見なす
  • 19. The PG-Strom Project PL/CUDA関数の呼び出し例 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics19 SELECT row_number() OVER (), float4_as_int4(R.key_id) key_id, R.score FROM matrix_unnest( (SELECT my_plcuda_function(A.matrix, B.matrix) FROM (SELECT cbind(array_matrix(id), array_matrix(x, y, z)) matrix FROM normal_table WHERE tag LIKE ‘%abc%’) A, (SELECT matrix FROM matrix_table) B ) ) AS R(key_id real, score real) ORDER BY score DESC LIMIT 1000; 2つのMatrix-like Arrayを 引数に持つ PL/CUDA関数の呼出し Matrix-like Arrayの生成、 または構築済みのものをロード Matrix-like Arrayを N個のレコードに再展開 SQLによる後処理 (JOIN, Window関数)
  • 20. The PG-Strom ProjectPGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics20 Case Study 創薬における類似度サーチ
  • 21. The PG-Strom Project 背景 – 病気と候補化合物の関係 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics21 ターゲットの病気 関連するたんぱく質 化合物 (= 医薬品の候補) ターゲットたんぱく質に “active” である化合物の探索 inactive active active (毒性あり) 学術論文
  • 22. The PG-Strom Project k-NN法による類似化合物サーチ (1/2) PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics22 データベース化合物群 (D; ~1000万件程度) クエリ化合物群 (Q; ~1000件程度) 類似度による サーチ ターゲットたんぱく質 “似た特性の化合物”は “active”である可能性も高いはず。 学術論文等から ターゲットたんぱく質に “active” である化合物 をピックアップ
  • 23. The PG-Strom Project k-NN法による類似化合物サーチ (2/2) PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics23 類似度 = 距離の定義 ID NAME Fingerprint (1024bit) 1 CHEMBL153534 000000000001000000100000000000000100000000000001000000... 2 CHEMBL405398 000000000000000100100000000000000000000000000000100000... 3 CHEMBL503634 000001000000000000000000001000000100000000000000000000... : : : 化合物のデータ構造 Tanimoto Indexによる類似度の定義: 𝑆𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦 𝐴, 𝐵 = 𝐴 𝐹𝑃 ∩ 𝐵 𝐹𝑃 𝐴 𝐹𝑃 ∪ 𝐵 𝐹𝑃
  • 24. The PG-Strom Project 必要な計算量 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics24 データベース化合物群 (D; 10M件程度) Q: クエリ化合物群 (~1000件程度) 上位3件の平均 𝑑𝑖 ∈ 𝐷 d 𝑄, 𝑑𝑖 : Q~di間の距離 𝑑𝑗 ∈ 𝐷 上位3件の平均 計算量の目安: 𝑂 𝑄 × 𝐷 + 𝑂 𝐷 × 𝑄𝑙𝑜𝑔𝑄 (距離計算) (ソート+平均値) d 𝑄, 𝑑𝑗 : Q~dj間の距離
  • 25. The PG-Strom Project PL/CUDA関数の実装 (1/3) PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics25 Step-1 全てのQ×Dの論理的な組み合わせを、 複数のパーティションに分割。これらを GPUの実行ユニットであるSMMに割り当て。 Step-2 各GPUコアがQ化合物群とd化合物間の 類似度スコアを算出。 L1キャッシュと同等のレイテンシでアクセス 可能な “共有メモリ” にこれを格納
  • 26. The PG-Strom Project PL/CUDA関数の実装 (2/3) PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics26 Step-3 類似度スコアによる Bitonic-Sorting を実行。 ある d 化合物に対する q 化合物が、類似度 の順に並ぶことになる。 Step-5 類似度上位k件による平均値を 算出し、結果バッファに格納。 Step-4 Q化合物群のサイズが共有メモリよりも巨大な場合、 Step-2以降を繰り返し。
  • 27. The PG-Strom Project PL/CUDA関数の実装 (3/3) PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics27 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)
  • 28. The PG-Strom Project PL/CUDA関数の呼出し PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics28 PREPARE knn_sim_rand_10m_gpu_v2(int) -- arg1:@k-value AS SELECT row_number() OVER (), fp.name, similarity FROM (SELECT float4_as_int4(key_id) key_id, similarity FROM matrix_unnest( (SELECT rbind( knn_gpu_similarity($1,Q.matrix, D.matrix)) FROM (SELECT cbind(array_matrix(id), array_matrix(bitmap)) matrix FROM finger_print_query) Q, (SELECT matrix FROM finger_print_10m_matrix) D ) ) AS sim(key_id real, similarity real) ORDER BY similarity DESC) sim, finger_print_10m fp WHERE fp.id = sim.key_id LIMIT 1000; SQLによる後処理 • 他のテーブルとJOINして化合物ID化合物名を変換 • window関数による類似度順位の計算 Q行列/D行列を引数にとる PL/CUDA関数の呼出し。 テーブルから読み出したレコードを Array-Matrixに変換 (または、事前にビルド) PL/CUDA関数の返り値である 3xNのArray-Matrixを展開し、 通常の3列N行のレコードへ変換
  • 29. The PG-Strom Project パフォーマンス PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics29  CPU版は、同等のロジックをC言語によるバイナリ版で実装して比較計測  D化合物群の数は1000万レコード、Q化合物群の数は10,50,100,500,1000個の5通り  最大で100億通りの組合せを計算。これは実際の創薬ワークロードの規模と同等。  HW) CPU: Xeon E5-2670v3, GPU: GTX980 / GTX1080, RAM:384GB  SW) CentOS7, CUDA8.0, PostgreSQL v9.5 + PG-Strom v1.0 30.25 145.29 295.95 1503.31 3034.94 12.97 13.46 13.90 18.16 24.6513.00 13.23 13.59 16.01 19.13 0 500 1000 1500 2000 2500 3000 3500 10 50 100 500 1000 QueryResponseTime[sec] (*Lowerisbetter) クエリ化合物群の数[Q] k-NN法による類似化合物サーチ応答時間 (k=3, D=10M) CPU(E5-2670v3) GTX980 GTX1080 x150 times faster!
  • 30. The PG-Strom ProjectPGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics30 Another Usage In-databaseでk-meansクラスタリング
  • 31. The PG-Strom Project クラスター分析 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics31
  • 32. The PG-Strom Project k-meansクラスタリング アルゴリズム PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics32 1. ランダムで初期クラスタ を割り当て。 2. 各クラスタ毎に クラスタ中心点を計算 3. 各要素から最も近傍の クラスタ中心点を選択。 クラスタ割当てを更新。
  • 33. The PG-Strom Project k-meansクラスタリング アルゴリズム PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics33 1. ランダムで初期クラスタ を割り当て。 5. 新しいクラスタ割当てに 基づいて、クラスタ中心 点を再計算 6. クラスタ中心点が変動 しなくなったので計算終了 4. 収束するか、一定回数に 達するまで繰り返し
  • 34. The PG-Strom Project PL/CUDAによるk-meansクラスタリングの実装 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics34 CREATE OR REPLACE FUNCTION gpu_kmeans(real[], -- ID + Data Matrix int, -- k-value (number of clusters) int = 10, -- max number of iteration int = 1) -- seed of initial randomness RETURNS int[] AS $$ #plcuda_decl : KERNEL_FUNCTION_MAXTHREADS(void) update_centroid(MatrixType *D, MatrixType *R, MatrixType *C) { : /* accumulate the local centroid */ for (did = get_global_id(); did < nitems; did += get_global_size()) { /* pick up the target cluster */ cid = r_values[nitems + did]; atomicAdd(&l_cent[cid], 1.0); for (index=1; index < width; index++) atomicAdd(&l_cent[index * k_value + cid], d_values[index * nitems + did]); } __syncthreads(); /* write back to the global C-matrix */ for (index = get_local_id(); index < width * k_value; index += get_local_size()) atomicAdd(&c_values[index], l_cent[index]); } : #plcuda_begin : status = pgstromLaunchDynamicKernel4((void *) setup_initial_cluster, (kern_arg_t)(D), (kern_arg_t)(R), (kern_arg_t)(C), (kern_arg_t)(r_seed), nitems, 0, 0); if (status != cudaSuccess) PLCUDA_RUNTIME_ERROR_RETURN(status); for (loop=0; loop < nloops; loop++) { : status = pgstromLaunchDynamicKernelMaxThreads3( (void *)kmeans_update_cluster, (kern_arg_t)(D), (kern_arg_t)(R), (kern_arg_t)(C), (kern_arg_t)k_value, nitems, 0, sizeof(cl_int) + sizeof(cl_float)); if (status != cudaSuccess) PLCUDA_RUNTIME_ERROR_RETURN(status); : } #plcuda_sanity_check gpu_kmeans_sanity_check #plcuda_working_bufsz gpu_kmeans_working_bufsz #plcuda_results_bufsz gpu_kmeans_results_bufsz #plcuda_end $$ LANGUAGE 'plcuda';
  • 35. The PG-Strom Project k-meansクラスタリングの検証に使用したデータ PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics35 ▌データセットの概要  測定区間毎に収集された自動車通行量の パブリックデータ  デンマーク・オーフス市(Arhus, Denmark)における 449観測点ののデータ。  データ件数: 1350万件 (2014年2月~6月) ▌データに含まれるもの  平均速度  平均観測時間  自動車台数  測定区間(始点、終点)lの緯度・経  など... ▌やった事  平均速度や自動車台数によって測定区間を 5つのカテゴリに分割する。
  • 36. The PG-Strom Project GPU版k-means関数の呼出し PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics36 SELECT report_id, k, c FROM (SELECT report_id, k, c, row_number() OVER (PARTITION BY report_id ORDER BY c DESC) rank FROM (SELECT report_id, k, count(*) c FROM matrix_unnest( (SELECT gpu_kmeans ( array_matrix( int4_as_float4(report_id), avg_measured_time, avg_speed, vehicle_count), 5) FROM tr_rawdata) ) R(report_id int, k int) GROUP BY report_id, k ) __summary_1 ) __summary_2 WHERE rank = 1; Make a matrix from the raw-data Run k-means clustering logic Pick-up most frequent cluster
  • 37. The PG-Strom Project GPU版k-means (1/3) – 全データによるクラスタリング PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics37 $ wget -O map.png "`psql traffic -At -f ~/traffic.sql`" バイパス道路? 市街地中心部へ 向かう道路? 環状道路?
  • 38. The PG-Strom Project GPU版k-means (2/3) – 日中と夜間 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics38 日中 (8-17) 夜間 (18-7)
  • 39. The PG-Strom Project GPU版k-means (3/3) – 平日と週末 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics39 平日 週末
  • 40. The PG-Strom Project GPU版k-means関数の呼出し PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics40 SELECT report_id, k, c FROM (SELECT report_id, k, c, row_number() OVER (PARTITION BY report_id ORDER BY c DESC) rank FROM (SELECT report_id, k, count(*) c FROM matrix_unnest( (SELECT gpu_kmeans ( array_matrix( int4_as_float4(report_id), avg_measured_time, avg_speed, vehicle_count), 5) FROM tr_rawdata WHERE extract('hour' from timestamp) between 7 and 17 ) ) R(report_id int, k int) GROUP BY report_id, k ) __summary_1 ) __summary_2 WHERE rank = 1; 実は条件句を追加しただけ。 (これがSQLの柔軟性!)
  • 41. The PG-Strom Project パフォーマンス (1/3) PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics41 CPUによるk-meansの代表的実装として、 MADLib版 kemans_random() 関数を使用
  • 42. The PG-Strom Project パフォーマンス (2/3) – MADLib版k-meansクラスタリングの呼出し PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics42 SELECT report_id, k, c FROM (SELECT report_id, k, c, row_number() OVER (PARTITION BY report_id ORDER BY c DESC) rank FROM (SELECT t.report_id, (madlib.closest_column(centroids, t.attrs)).column_id as k, count(*) c FROM tr_rawdata_madlib_s t, (SELECT centroids FROM madlib.kmeans_random('tr_rawdata_madlib', 'attrs', 5) ) km; GROUP BY t.report_id, k ) __summary_1 ) __summary_2 WHERE rank = 1; クラスタ中心点の導出 最近傍クラスタの選択
  • 43. The PG-Strom Project パフォーマンス (3/3) – GPU版 vs CPU版実装 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics43  測定環境  HW) CPU: Xeon E5-2670v3, GPU: GTX1080, RAM: 384GB  SW) CentOS7, CUDA8.0, PostgreSQL v9.5 + PG-Strom v1.0, MADLib 1.9  CPU版は、同等のロジックをC言語によるバイナリ版で実装して比較計測 1.41 12.44 126.59 1668.49 0.21 0.29 0.94 8.41 0 200 400 600 800 1000 1200 1400 1600 1800 10,000 100,000 1,000,000 13,577,132 QueryResponseTime[sec] (※Lowerisbetter) Number of Items that were clustered based on the k-means algorithm Performance comparison of in-database k-means clustering MADLib PL/CUDA x200倍高速化
  • 44. The PG-Strom ProjectPGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics44 まとめ
  • 45. The PG-Strom Project まとめ (1/3) – おさらい PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics45 ▌PL/CUDAとは?  PG-Stromのオリジナルのコンセプトは自動最適化/自動コード生成  手動最適化と引換えに、PL/CUDAはGPU性能を最大限引き出すための手段。 たぶん、高度なアルゴリズムをSQLで書いている人はいないので正しい選択 ▌利点  TFLOPS級の計算エンジンをIn-Database Analyticsで使用できる。  外部アプリケーションを使用する場合と異なり、データセット全体を DBからエクスポートする必要がなくなる。  取り出す必要があるのは “処理結果” だけ  解析アルゴリズムの前処理/後処理で、SQLによる柔軟なデータ操作が可能  JOIN、GROUP BY、Window関数、etc...
  • 46. The PG-Strom Project まとめ (2/3) – 適用領域 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics46 ▌実証実験① – 創薬領域における類似化合物検索  化合物の特徴を fingerprint (= 特徴ベクトル)として表現。 GPUで類似度スコアを計算しスコア上位の組合せを抽出。 ▌実証実験② – センサデータを用いた教師なし学習  センサが生成した情報を用いてGPUで要素間距離を計算。 道路の特徴を抽出して数個のカテゴリへと自動分類。 ▌考えられる適用領域  化合物探索 ... 医薬、化学品、素材系  レコメンデーションエンジン ... e-コマース領域  アノマリー検知 ... セキュリティ分野  データマイニング ... マーケティング  ...など...
  • 47. The PG-Strom Project まとめ (3/3) – 課題と展望 PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics47 ▌技術面  1GBを越えるサイズのArray-Matrixの取り扱い  PostgreSQL可変長データ型の制約により、SQL関数の個々の引数が 1GBより大きなサイズを持つ事ができない。  (↑12/1のdeveloper meetingでも議論する)  繰り返し何度も同じArray-Matrixを使用する場合の処理コスト  GPU側に静的なArray-Matrixを置いたままにできれば嬉しいかも。 ▌運用面  SQLとCUDAを両方書ける人はなかなか多くない。  “定番の” アルゴリズムをパッケージ化  専門エンジニアによるコンサルティング、構築サービス 実証実験のお誘い、お待ちしております。
  • 48. The PG-Strom Project リソース PGconf.ASIA - PL/CUDA / Fusion of HPC Grade Power with In-Database Analytics48 ▌リポジトリ https://github.com/pg-strom/devel ▌本日のスライド http://www.slideshare.net/kaigai/pgconfasia2016-plcuda ▌コンタクト  e-mail: kaigai@ak.jp.nec.com  Tw: @kkaigai 一緒に開発しようぜ!って人もお待ちしております。