AWSでPG-Strom
PG-Stromを動かそうという時に、GPU自体は安価で手に入れやすい部品なのだけども、普段使いのLinuxサーバにそうそう都合よくGPUが挿さっている人はマジョリティではないかもしれない。
という事で、簡単にPG-Stromをお試しするために、AWSでのAMIイメージを作ってみました。
AMI-Idは ami-51231b50 で、GPUインスタンス(g2.x2large)を使えば簡単にトライアルできます。
以下に手順をご紹介しますが、デプロイ完了まで10分以下。こりゃ便利だわ・・・。
① Launch Instance を選択する
② キーワード「strom」で検索するか、上記のami-51231b50でAMIイメージを検索する。
AMIイメージはちょくちょく更新されるので、キーワード検索を使った方が間違いがないかも。
③ 続いてインスタンスタイプを選択。もちろんGPUインスタンス(g2.x2large)の一択です。
④ 確認画面。本当はEBSストレージなどアタッチするのだろうけども、とりあえず一発起動するだけなので、そのまま「Launch」を選択。
⑥ これでデプロイ完了。あとは1~2分ほど起動を待つ。
⑦ 初期化中。。。。
⑨ PG-Strom有効なPostgreSQLインスタンスが起動している
AWSのg2.x2largeタイプなので、GPUはNVIDIAのGRID K520。
こんな感じでデバイスのプロパティを参照することができる。
postgres=# SELECT * FROM pgstrom_opencl_device_info(); dnum | pnum | property | value ------+------+---------------------------------+---------------------------- 0 | 0 | platform index | 1 0 | 1 | platform profile | FULL_PROFILE 0 | 2 | platform version | OpenCL 1.1 CUDA 6.5.18 0 | 3 | platform name | NVIDIA CUDA 0 | 4 | platform vendor | NVIDIA Corporation : | : | : | :
テスト用のSQLが~/pg_strom/testdb.sqlに置いてあるので、これを使って2000万行のテーブルx1個、4万行のテーブルx4個を作ると、昨日のエントリで紹介したテストテーブルを作成できる。
[ec2-user@ip-10-126-51-20 ~]$ psql -U postgres -f testdb.sql postgres
昨日のエントリで使ったGPUはMaxwell世代のGTX980で、Kepler世代のGRID K520とは少し特性は異なるものの、まぁ、早くなってるから良いだろう。
PG-Stromありの場合
postgres=# EXPLAIN (ANALYZE, COSTS OFF) SELECT * FROM t0 NATURAL JOIN t1 NATURAL JOIN t2; QUERY PLAN ---------------------------------------------------------------------------------- Custom (GpuHashJoin) (actual time=97.992..5512.238 rows=20000000 loops=1) hash clause 1: (t0.bid = t2.bid) hash clause 2: (t0.aid = t1.aid) Bulkload: On -> Custom (GpuScan) on t0 (actual time=9.260..1220.530 rows=20000000 loops=1) -> Custom (MultiHash) (actual time=43.361..43.362 rows=80000 loops=1) hash keys: bid Buckets: 46000 Batches: 1 Memory Usage: 99.99% -> Seq Scan on t2 (actual time=0.009..9.551 rows=40000 loops=1) -> Custom (MultiHash) (actual time=21.681..21.681 rows=40000 loops=1) hash keys: aid Buckets: 46000 Batches: 1 Memory Usage: 49.99% -> Seq Scan on t1 (actual time=0.011..9.632 rows=40000 loops=1) Execution time: 9144.220 ms (14 rows)
PG-Stromなしの場合
postgres=# SET pg_strom.enabled = off; SET postgres=# EXPLAIN (ANALYZE, COSTS OFF) SELECT * FROM t0 NATURAL JOIN t1 NATURAL JOIN t2; QUERY PLAN --------------------------------------------------------------------------------- Hash Join (actual time=46.932..29132.386 rows=20000000 loops=1) Hash Cond: (t0.aid = t1.aid) -> Hash Join (actual time=23.504..17693.551 rows=20000000 loops=1) Hash Cond: (t0.bid = t2.bid) -> Seq Scan on t0 (actual time=0.004..4851.203 rows=20000000 loops=1) -> Hash (actual time=23.273..23.273 rows=40000 loops=1) Buckets: 65536 Batches: 1 Memory Usage: 2813kB -> Seq Scan on t2 (actual time=0.006..10.589 rows=40000 loops=1) -> Hash (actual time=23.256..23.256 rows=40000 loops=1) Buckets: 65536 Batches: 1 Memory Usage: 2813kB -> Seq Scan on t1 (actual time=0.007..10.555 rows=40000 loops=1) Execution time: 32513.584 ms (12 rows)