しかつきかふぇ

ちょっとした休憩時間に

openSUSE で PG-Strom を動かしてみた【総括編】

気がつけばクリスマスイブとか

鹿野です。
あっという間にクリスマスって感じで、はみゅって感じです。

そう言えば最近この3つが同時発売になるケース多いんですよね(そしてまた脈略のない話)
ちなみにおすすめは『カッコウの許嫁』。
エリカちゃんのさりげないクズ女っぷり(?)も滅茶苦茶に好きですが(注:褒め言葉です)、幸ちゃんも好きです。
だってホテル王の娘と有名神社の娘の間に挟まれながらも健闘するごく普通の女子中学生って、それはそれですごい話だと思いません?(そっちかよ!!)

・・・はい。話を本題に戻して、今日は openSUSE Advent Calendar 2023 の 23日目の記事です。
前回に引き続き、openSUSE で PG-Strom を動かしていきます。

cafe.shikanotsuki.me

一応完結編です。(たぶんね)

PG-Strom はやはり動いていた・・・?

前回息巻いて『週末は PG-Strom を動かすぞ』とは書いてみたものの、結局のところ元記事である酒井さんのアレのようにはできませんでした。

sakaik.hateblo.jp

ただし、動いていなかったのは PG-Strom ではなくて、PostGIS だったようです。。。
というのもやはり状況的に PG-Strom が動いているのは間違えなさそうです。それは下記のコマンドからも確認済み。

sudo journalctl -xeu postgresql.service


12月 24 05:52:53 kaede systemd[1]: Starting PostgreSQL database server...
 Subject: A start job for unit postgresql.service has begun execution
 Defined-By: systemd
 Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
 
 A start job for unit postgresql.service has begun execution.
 
 The job identifier is 240.
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.795 JST   [2389]LOG:  HeteroDB Extra module is not available
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.796 JST   [2389]LOG:  PG-Strom version 5.0.1 built for PostgreSQL 15 (githash: )
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.860 JST   [2389]LOG:  PG-Strom binary built for CUDA 12.3 (CUDA runtime 12.3, nvidia kmod: 545.29.6)
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.860 JST   [2389]LOG:  PG-Strom: GPU0 NVIDIA RTX A5000 (64 SMs; 1695MHz, L2 6144kB), RAM 23.67GB (384bits, 7.63GHz), PCI-E Bar1 0MB, CC 8.6
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.874 JST   [2389]LOG:  [0000:20:00.0]
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.874 JST   [2389]LOG:   - [0000:20:03.0]
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.874 JST   [2389]LOG:     - [0000:24:00.0] ... nvme0 (SAMSUNG MZVLB1T0HALR-000H1 --> GPU0 [dist=9])
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.874 JST   [2389]LOG:  [0000:2c:00.0]
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.874 JST   [2389]LOG:   - [0000:2c:00.0]
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.874 JST   [2389]LOG:     - [0000:2d:00.0] ... GPU0 (NVIDIA RTX A5000)
12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.902 JST   [2389]LOG:  ログ出力をログ収集プロセスにリダイレクトしています12月 24 05:52:53 kaede postgresql-script[2389]: 2023-12-24 05:52:53.902 JST   [2389]ヒント:  ここからのログ出力はディレクトリ"log"に現れます。12月 24 05:52:53 kaede systemd[1]: Started PostgreSQL database server.
 Subject: A start job for unit postgresql.service has finished successfully
 Defined-By: systemd
 Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
 
 A start job for unit postgresql.service has finished successfully.
 
 The job identifier is 240.

ちなみに PostgreSQL から GPU が見えていないとこの時点でエラーとなり、GPU 名も表示されないようです。
というのも PostgreSQL のユーザーが GPU を見えていないこともあるらしく、その場合 sudo gpasswd -a postgres video とすることで回避しています。

だとすると残すところの問題は、PostGIS のはずなのですが。。。

PostGIS をセルフビルドしてみよう

前回の記事でどうもこれが犯人っぽいと疑われた PostGIS ですが、だったらセルフビルドしてみようってことでやってみました。
公式リリース版のソースコードはこちらにあります。

Source Code | PostGIS

てゆか GitHub じゃないんですね・・・。

ソースコードをダウンロードしたら下記のコマンドでビルドしていきます。

./configure
make

sudo make install

最近は cmake が増えたからどこか懐かしい感じもする、昔ながらのビルド方法ですね。
いくつか依存ライブラリがありましたが、いずれも zypper で見つけられるライブラリでした(すみません全部メモってません)

で、これをインストールして同じように試してみたわけです。。。

まずは GPU を使わない場合から。←フラグ

pgstest=# explain SELECT ST_Distance(ST_MakePoint(137.0, 44.0), ST_MakePoint(x,y)) FROM points1000man
    WHERE ST_Distance(ST_MakePoint(137.0, 44.0), ST_MakePoint(x,y))<0.5;
                                                             QUERY PLAN                                                              
-------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=1000.00..140044399.75 rows=3333360 width=8)
   Workers Planned: 2
   ->  Parallel Seq Scan on points1000man  (cost=0.00..139710063.75 rows=1388900 width=8)
         Filter: (st_distance('010100000000000000002061400000000000004640'::geometry, st_makepoint(x, y)) < '0.5'::double precision)
 JIT:
   Functions: 4
   Options: Inlining true, Optimization true, Expressions true, Deforming true
(7 行)

今度こそ例のクエリでエラーも出ずに表示されましたね。(つまり openSUSE の Application:Geo のアレがアレだったと?)
実際に explain をつけないで投入すると、 SELECT 文も成功して、検索結果がしっかり表示されます。

続けて GPU を使う場合。

pgstest=# SET pg_strom.enabled=true;
SET

pgstest=# explain SELECT ST_Distance(ST_MakePoint(137.0, 44.0), ST_MakePoint(x,y)) FROM points1000man
    WHERE ST_Distance(ST_MakePoint(137.0, 44.0), ST_MakePoint(x,y))<0.5;
ERROR:  unknown alignment

・・・・・おいっ。。。
(というわけで頭抱えて昨晩はそのまま寝てしまったというわけです)

前回も書いたとおり、普通に SELECT 文を投入する場合は GPU も見えています。

pgstest=# explain SELECT count(*) FROM points1000man where category=12;
                                               QUERY PLAN                                                
---------------------------------------------------------------------------------------------------------
 Aggregate  (cost=32044.29..32044.30 rows=1 width=8)
   ->  Gather  (cost=32044.08..32044.29 rows=2 width=8)
         Workers Planned: 2
         ->  Parallel Custom Scan (GpuPreAgg) on points1000man  (cost=31044.08..31044.09 rows=1 width=8)
               GPU Projection: pgstrom.nrows()
               GPU Scan Quals: (category = 12) [rows: 10000080 -> 225974]
(6 行)

で、実際に数を数える程度なら CPU で動かしたほうが速いと。(そりゃそうだ・・・)
なので、PG-Strom と PostGIS の連携がうまくいっていないのかなと思われます。

その他試してみたこと1:バージョンを確認する

前回の記事で最後にバージョンについても確認しました。
が、結論から言うと、PostgreSQL のバージョンに関しては、 PG-Strom はあまり影響ないのではという気がしています。

PostGIS の方はバージョン依存がかなりありそうですが・・・。

PG-Strom の v5 系の動作環境

PG-Strom v5.0 - PG-Strom Manual

注意点を挙げるなら、CUDA のバージョンだと思います。 CUDA Toolkit 12.2 は結構新しい方で、 NVIDIA のドライバも割と最新にしていないと恐らく動いてくれないだろうと。
CUDA 自体はライブラリツールみたいな感じなんでどうにかなってしまうのですが、NVIDIAのドライバだけはなるべく最新にしておきたいところ。
それはそれで大変なんですけどね(ぇ)

その他試してみたこと2:Dockerを使ってみる

これだけのものだと誰かが Docker ビルドしてないかな〜と思って確認してみたんです。
フツーにあった。

tech.virtualtech.jp

あ〜、ね。(それはそれでいつも大変お世話になっております) 遠山さんの Dockerfile もあるようです。

github.com

で、この Docker で動けばこれで記事にしてしまえと考え、 NVIDIA-Docker もフツーに動いて docker run もできたわけですが、PostgreSQL 起動時に GPU の認識がコケてました。(ホストが openSUSEだから?)
と、 Dockerfile も Rocky Linux ベースだし、ネタとしては微妙だからというのでその場で諦めています。。。(コラ

興味のある方はこちらもチャレンジしてみてはいかがでしょう??

まとめ

というわけで結局モヤっとしてしまった今回の結論でしたが、もう少し余裕ができたら詳しく追ってみようと思います。
とりあえず今回は新調した(中古の)サーバーを構築できてそのついで(?)だったので。。。

・・・あ、その中古のサーバー、 RTX A5000 が入ってます。。。

これで生成系AIでいろいろ遊べそうですね!(何をする気だ!?)