インストール
本章ではPG-Stromのインストール手順について説明します。
チェックリスト
- ハードウェア
- CUDA ToolkitのサポートするLinuxオペレーティングシステムを動作可能な x86_64 アーキテクチャのハードウェアが必要です。
- CPU、ストレージ、およびネットワークデバイスには特別な要件はありませんが、note002:HW Validation Listはハードウェア選定の上で参考になるかもしれません。
- GPUダイレクトSQL実行を利用するにはNVME規格に対応したSSD、またはRoCEに対応した高速NICが必要で、GPUと同一のPCIe Root Complex配下に接続されている必要があります。
- GPUデバイス
- PG-Stromを実行するには少なくとも一個のGPUデバイスがシステム上に必要です。これらはCUDA Toolkitでサポートされており、computing capability が6.0以降のモデル(Pascal世代以降)である必要があります。
- 002: HW Validation List - List of supported GPU modelsを参考にGPUを選定してください。
- Operating System
- PG-Stromの実行には、CUDA Toolkitによりサポートされているx86_64アーキテクチャ向けのLinux OSが必要です。推奨環境はRed Hat Enterprise LinuxまたはRocky Linuxバージョン 9.x、または8.xです。
- GPUダイレクトSQL(cuFileドライバ)を利用するには、CUDA Toolkitに含まれるnvidia-fsドライバと、Mellanox OFED (OpenFabrics Enterprise Distribution) ドライバのインストールが必要です。
- PostgreSQL
- PG-Strom v5.0の実行にはPostgreSQLバージョン15以降が必要です。
- PG-Stromが内部的に利用しているAPIの中には、これ以前のバージョンでは提供されていないものが含まれています。
- CUDA Toolkit
- PG-Stromの実行にはCUDA Toolkit バージョン12.2update1以降が必要です。
- PG-Stromが内部的に利用しているAPIの中には、これ以前のバージョンでは提供されていないものが含まれています。
インストール手順
一連のインストール手順は以下の通りとなります。
- H/Wの初期設定
- OSのインストール
- MOFEDドライバのインストール
- CUDA Toolkit のインストール
- HeteroDB拡張モジュールのインストール
- PostgreSQLのインストール
- PG-Stromのインストール
- PostgreSQL拡張モジュールのインストール(必要に応じて)
- PostGIS
- contrib/cube
OSのインストール
CUDA ToolkitのサポートするLinuxディストリビューションを選択し、個々のディストリビューションのインストールプロセスに従ってインストール作業を行ってください。 CUDA ToolkitのサポートするLinuxディストリビューションは、NVIDIA DEVELOPER ZONEにおいて紹介されています。
Red Hat Enterprise Linux 8.x系列(Rocky Linux 8.x系列を含む)の場合、ソフトウェア構成は、ベース環境として「最小限のインストール」を選択し、さらに追加のソフトウェアとして「開発ツール」を選択してください。
Red Hat Enterprise Linux 9.x系列(Rocky Linux 9.x系列を含む)の場合、ソフトウェア構成は、ベース環境として「最小限のインストール」を選択し、さらに追加のソフトウェアとして「標準」「開発ツール」を選択してください。
サーバーへのOSインストール後、サードパーティーのパッケージをインストールするために、パッケージリポジトリの設定を行います。
なお、インストーラで「開発ツール」を選択しなかった場合、以下のコマンドでOSインストール後に追加インストールする事が可能です。
# dnf groupinstall 'Development Tools'
Tip
サーバに搭載されているGPUが新しすぎる場合、OS起動中にクラッシュ等の問題が発生する場合があります。
その場合、カーネル起動オプションにnouveau.modeset=0
を追加して標準のグラフィックスドライバを無効化する事で
問題を回避できるかもしれません。
nouveauドライバの無効化
NVIDIA製GPU向けオープンソースの互換ドライバであるnouveauドライバがロードされている場合、nvidiaドライバをロードする事ができません。 この場合は、nouveauドライバの無効化設定を行った上でシステムを一度再起動してください。
nouveauドライバを無効化するには、以下の設定を/etc/modprobe.d/disable-nouveau.conf
という名前で保存し、dracut
コマンドを実行してLinux kernelのブートイメージに反映します。
その後、システムを一度再起動してください。
# cat > /etc/modprobe.d/disable-nouveau.conf <<EOF
blacklist nouveau
options nouveau modeset=0
EOF
# dracut -f
# shutdown -r now
IOMMUの無効化
GPU-Direct SQLはCUDAのGPUDirect Storage (cuFile)というAPIを使用しています。
GPUDirect Storageの利用に先立って、OS側でIOMMUの設定を無効化する必要があります。
NVIDIA GPUDirect Storage Installation and Troubleshooting Guideの記述を参考に、カーネル起動オプションの設定を行ってください。
IOMMUを無効化するには、カーネル起動オプションにamd_iommu=off
(AMD製CPUの場合)または、intel_iommu=off
(Intel製CPUの場合)の設定を付加します。
RHEL9における設定
以下のコマンドを実行し、カーネル起動オプションを追加してください。
# grubby --update-kernel=ALL --args="amd_iommu=off"
RHEL8における設定
エディタで/etc/default/grub
を編集し、GRUB_CMDLINE_LINUX_DEFAULT=
行に上記のオプションを付加してください。
例えば、以下のような設定となるはずです。
:
GRUB_CMDLINE_LINUX="rhgb quiet amd_iommu=off"
:
以下のコマンドを実行し、この設定をカーネル起動オプションに反映します。
-- for BIOS based system
# grub2-mkconfig -o /boot/grub2/grub.cfg
# shutdown -r now
-- for UEFI based system
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
# shutdown -r now
追加リポジトリの有効化
EPEL(Extra Packages for Enterprise Linux)
PG-Stromの実行に必要なソフトウェアモジュールのいくつかは、EPEL(Extra Packages for Enterprise Linux)の一部として配布されています。 これらのソフトウェアを入手するためにEPELパッケージ群のリポジトリ定義をyumシステムに追加する必要があります。
EPELリポジトリから入手するパッケージの一つがDKMS(Dynamic Kernel Module Support)です。これは動作中のLinuxカーネルに適合したLinuxカーネルモジュールをオンデマンドでビルドするためのフレームワークで、NVIDIAのGPUデバイスドライバなど関連するカーネルモジュールが使用しています。 Linuxカーネルモジュールは、Linuxカーネルのバージョンアップに追従して再ビルドが必要であるため、DKMSなしでのシステム運用は現実的ではありません。
EPELリポジトリの定義は epel-release
パッケージにより提供され、Fedora Projectのサイトから入手する事ができます。
-- For RHEL9
# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
-- For RHEL8
# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
-- For Rocky8/Rocky9
# dnf install epel-release
Red Hat CodeReady Linux Builder
MOFED(Mellanox OpenFabrics Enterprise Distribution)ドライバのインストールには、Red Hat Enterprise Linux 8.xの標準インストール構成では無効化されている Red Hat CodeReady Linux Builder リポジトリを有効化する必要があります。Rokey Linuxにおいては、このリポジトリは PowerTools と呼ばれています。
このリポジトリを有効化するには、以下のコマンドを実行します。
-- For RHEL9
# subscription-manager repos --enable codeready-builder-for-rhel-9-x86_64-rpms
-- For Rocky9
# dnf config-manager --set-enabled crb
-- For RHEL8
# subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms
-- For Rocky8
# dnf config-manager --set-enabled powertools
MOFEDドライバのインストール
MOFEDドライバは、こちらからダウンロードする事ができます。 本節では、MOFEDドライババージョン23.10のtgzアーカイブからのインストール例を紹介します。
MOFEDドライバのインストーラを実行するために、最低限createrepo
およびperl
パッケージのインストールが必要です。
次にtgzアーカイブを展開し、mlnxofedinstall
スクリプトを実行します。この時、GPUDirect Storageのサポートを有効化するオプションを付加するのを忘れないでください。
# dnf install -y perl createrepo
# tar zxvf MLNX_OFED_LINUX-23.10-2.1.3.1-rhel9.3-x86_64.tgz
# cd MLNX_OFED_LINUX-23.10-2.1.3.1-rhel9.3-x86_64
# ./mlnxofedinstall --with-nvmf --with-nfsrdma --add-kernel-support
# dracut -f
MOFEDドライバのビルドおよびインストール中、不足パッケージのインストールを要求される事があります。 その場合、エラーメッセージを確認して要求されたパッケージの追加インストールを行ってください。
Error: One or more required packages for installing OFED-internal are missing.
Please install the missing packages using your Linux distribution Package Management tool.
Run:
yum install kernel-rpm-macros
Failed to build MLNX_OFED_LINUX for 5.14.0-362.8.1.el9_3.x86_64
MOFEDドライバのインストールが完了すると、nvmeドライバなど、OS標準のものが置き換えられているはずです。
例えば以下の例では、OS標準のnvme-rdma
ドライバ(/lib/modules/<KERNEL_VERSION>/kernel/drivers/nvme/host/nvme-rdma.ko.xz
)ではなく、追加インストールされた/lib/modules/<KERNEL_VERSION>/extra/mlnx-nvme/host/nvme-rdma.ko
が優先して使用されています。
$ modinfo nvme-rdma
filename: /lib/modules/5.14.0-427.18.1.el9_4.x86_64/extra/mlnx-nvme/host/nvme-rdma.ko
license: GPL v2
rhelversion: 9.4
srcversion: 16C0049F26768D6EA12771B
depends: nvme-core,rdma_cm,ib_core,nvme-fabrics,mlx_compat
retpoline: Y
name: nvme_rdma
vermagic: 5.14.0-427.18.1.el9_4.x86_64 SMP preempt mod_unload modversions
parm: register_always:Use memory registration even for contiguous memory regions (bool)
既にロードされているカーネルモジュール(例: nvme
)を置き換えるため、ここで一度システムのシャットダウンと再起動を行います。
mlnxofedinstall
スクリプトの完了後に、dracut -f
を実行するのを忘れないでください。
Tips
Linux kernelのバージョンアップとMOFEDドライバ
RHEL系列のディストリビューションにおいて、MODEDドライバはDKMS(Dynamic Kernel Module Support)を使用しません。 そのため、Linux kernelをバージョンアップした場合には、上記の手順を再度実行し、新しいLinux kernelに対応したMOFEDドライバを再インストールする必要があります。
後述のCUDA Toolkitのインストールなど、パッケージ更新のタイミングでLinux kernelがアップデートされる事もありますが、その場合でも同様です。
heterodb-swdcのインストール
PG-Stromほか関連パッケージはHeteroDB Software Distribution Centerから配布されています。 これらのソフトウェアを入手するために、HeteroDB-SWDCのリポジトリ定義をyumシステムに追加する必要があります。
HeteroDB-SWDCリポジトリの定義はheterodb-swdcパッケージにより提供されます。
WebブラウザなどでHeteroDB Software Distribution Centerへアクセスし、ページの先頭にリンクの記載されているheterodb-swdc-1.3-1.el9.noarch.rpm
をダウンロードしてインストールしてください。(RHEL8の場合はheterodb-swdc-1.3-1.el8.noarch.rpm
)
heterodb-swdcパッケージがインストールされると、HeteroDB-SWDCからソフトウェアを入手するためのyumシステムへの設定が追加されます。
以下のようにheterodb-swdcパッケージをインストールします。
# dnf install https://heterodb.github.io/swdc/yum/rhel8-noarch/heterodb-swdc-1.2-1.el8.noarch.rpm
CUDA Toolkitのインストール
本節ではCUDA Toolkitのインストールについて説明します。 既に最新のCUDA Toolkitをインストール済みである場合、本節の初期設定と合致しているかどうか確認してください。
NVIDIAはCUDA Toolkitのインストールに2通りの方法を提供しています。一つは自己実行型アーカイブ(runfile)によるもの。もう一つはRPMパッケージによるもので、PG-StromのセットアップにはRPMパッケージによるインストールを推奨します。
CUDA Toolkitのインストール用パッケージはNVIDIA DEVELOPER ZONEからダウンロードする事ができます。 適切なOS、アーキテクチャ、ディストリビューション、バージョンを指定し、『rpm(network)』版を選択してください。
『rpm(network)』を選択すると、リポジトリを登録し、ネットワーク経由でパッケージをインストールするためのシェルコマンドが表示されます。ガイダンス通りにインストールを進めてください。
# dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
# dnf clean all
# dnf install cuda-toolkit-12-5
CUDA Toolkitのインストールに続いて、ドライバをインストールのためのコマンドが2種類表示されています。 ここではオープンソース版のnvidia-driverを使用してください。オープンソース版のみがGPUDirect Storage機能をサポートしており、PG-StromのGPU-Direct SQLは本機能を利用しています。
Tips
Volta以前のGPUの利用について
オープンソース版nvidiaドライバは、Volta世代以前のGPUには対応していません。 したがって、VoltaまたはPascal世代のGPUでPG-Stromを利用する場合は、プロプラエタリ版のドライバであってもGPUDirect Storageに対応しているCUDA 12.2 Update 1を利用する必要があります。 CUDA 12.2 Update 1のパッケージはこちらから入手する事ができます。
続いて、GPU-Direct Storage(GDS)を利用するためのドライバモジュールnvidia-gds
をインストールします。
パッケージ名に続いてCUDA Toolkitのバージョンと同一のバージョン名を指定してください。
# dnf module install nvidia-driver:open-dkms
# dnf install nvidia-gds-12-5
正常にインストールが完了すると、/usr/local/cuda
配下にCUDA Toolkitが導入されています。
$ ls /usr/local/cuda/
bin/ gds/ nsightee_plugins/ targets/
compute-sanitizer/ include@ nvml/ tools/
CUDA_Toolkit_Release_Notes.txt lib64@ nvvm/ version.json
DOCS libnvvp/ README
EULA.txt LICENSE share/
extras/ man/ src/
インストールが完了したら、GPUが正しく認識されている事を確認してください。nvidia-smi
コマンドを実行すると、以下の出力例のように、システムに搭載されているGPUの情報が表示されます。
$ nvidia-smi
Mon Jun 3 09:56:41 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 555.42.02 Driver Version: 555.42.02 CUDA Version: 12.5 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA A100-PCIE-40GB Off | 00000000:41:00.0 Off | 0 |
| N/A 58C P0 66W / 250W | 1MiB / 40960MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
GPUDirect Storageの確認
上記の手順でCUDA Toolkitのインストールが完了すると、GPUDirect Storageが利用可能な状態となっているはずです。
以下の通り、gdscheck
ツールを用いてストレージデバイス毎のコンフィグを確認してください。
(この例では、nvme
だけでなく、nvme-rdma
やrpcrdma
カーネルモジュールもロードしているため、関連する機能がSupported
となっています)
# /usr/local/cuda/gds/tools/gdscheck -p
GDS release version: 1.10.0.4
nvidia_fs version: 2.20 libcufile version: 2.12
Platform: x86_64
============
ENVIRONMENT:
============
=====================
DRIVER CONFIGURATION:
=====================
NVMe : Supported
NVMeOF : Supported
SCSI : Unsupported
ScaleFlux CSD : Unsupported
NVMesh : Unsupported
DDN EXAScaler : Unsupported
IBM Spectrum Scale : Unsupported
NFS : Supported
BeeGFS : Unsupported
WekaFS : Unsupported
Userspace RDMA : Unsupported
--Mellanox PeerDirect : Disabled
--rdma library : Not Loaded (libcufile_rdma.so)
--rdma devices : Not configured
--rdma_device_status : Up: 0 Down: 0
=====================
CUFILE CONFIGURATION:
=====================
properties.use_compat_mode : true
properties.force_compat_mode : false
properties.gds_rdma_write_support : true
properties.use_poll_mode : false
properties.poll_mode_max_size_kb : 4
properties.max_batch_io_size : 128
properties.max_batch_io_timeout_msecs : 5
properties.max_direct_io_size_kb : 16384
properties.max_device_cache_size_kb : 131072
properties.max_device_pinned_mem_size_kb : 33554432
properties.posix_pool_slab_size_kb : 4 1024 16384
properties.posix_pool_slab_count : 128 64 32
properties.rdma_peer_affinity_policy : RoundRobin
properties.rdma_dynamic_routing : 0
fs.generic.posix_unaligned_writes : false
fs.lustre.posix_gds_min_kb: 0
fs.beegfs.posix_gds_min_kb: 0
fs.weka.rdma_write_support: false
fs.gpfs.gds_write_support: false
profile.nvtx : false
profile.cufile_stats : 0
miscellaneous.api_check_aggressive : false
execution.max_io_threads : 4
execution.max_io_queue_depth : 128
execution.parallel_io : true
execution.min_io_threshold_size_kb : 8192
execution.max_request_parallelism : 4
properties.force_odirect_mode : false
properties.prefer_iouring : false
=========
GPU INFO:
=========
GPU index 0 NVIDIA A100-PCIE-40GB bar:1 bar size (MiB):65536 supports GDS, IOMMU State: Disabled
==============
PLATFORM INFO:
==============
IOMMU: disabled
Nvidia Driver Info Status: Supported(Nvidia Open Driver Installed)
Cuda Driver Version Installed: 12050
Platform: AS -2014CS-TR, Arch: x86_64(Linux 5.14.0-427.18.1.el9_4.x86_64)
Platform verification succeeded
Tips
RAIDを使用する場合の追加設定
GPUDirect Storageを利用してSoftware RAID (md-raid0) 区画からデータを読み出す場合、
以下の一行を/lib/udev/rules.d/63-md-raid-arrays.rules
設定に追加する必要があります。
IMPORT{program}="/usr/sbin/mdadm --detail --export $devnode"
その後、設定を反映させるためにシステムを再起動してください。 詳しくはNVIDIA GPUDirect Storage Installation and Troubleshooting Guideを参照してください。
PCI Bar1メモリの設定
GPU-Direct SQLは、GPUデバイスメモリをホストシステム上のPCI BAR1領域(物理アドレス空間)にマップし、そこをDestinationとするP2P-RDMA要求をNVME機器に対して行う事で、ロスのない高速なデータ読出しを実現します。
十分な多重度を持ったP2P-RDMAを行うには、GPUがバッファをマップするのに十分なPCI BAR1領域を有している必要があります。大半のGPUではPCI BAR1領域の大きさは固定で、PG-Stromにおいては、それがGPUデバイスメモリのサイズを上回っている製品を推奨しています。
しかし、一部のGPU製品においては『動作モード』を切り替える事でPCI BAR1領域のサイズを切り替える事ができるものが存在します。お使いのGPUがそれに該当する場合は、NVIDIA Display Mode Selector Toolを参照の上、PCI BAR1領域のサイズを最大化するモードへと切り替えてください。
2023年12月時点では、以下のGPUの場合にNVIDIA Display Mode Selector Toolを利用して*Display Offモードへと切り替える必要があります。
- NVIDIA L40S
- NVIDIA L40
- NVIDIA A40
- NVIDIA RTX 6000 Ada
- NVIDIA RTX A6000
- NVIDIA RTX A5500
- NVIDIA RTX A5000
システムに搭載されているGPUのメモリサイズやPCI BAR1サイズを確認するには、nvidia-smi -q
コマンドを利用します。以下のように、メモリ関連の状態が表示されます。
$ nvidia-smi -q
:
FB Memory Usage
Total : 46068 MiB
Reserved : 685 MiB
Used : 4 MiB
Free : 45377 MiB
BAR1 Memory Usage
Total : 65536 MiB
Used : 1 MiB
Free : 65535 MiB
:
HeteroDB 拡張モジュール
heterodb-extra
モジュールは、PG-Stromに以下の機能を追加します。
- マルチGPUの対応
- GPUダイレクトSQL
- GiSTインデックス対応
- ライセンス管理機能
これらの機能を使用せず、オープンソース版の機能のみを使用する場合は heterodb-extra
モジュールのインストールは不要です。
本節の内容は読み飛ばして構いません。
以下のように、SWDCからheterodb-extra
パッケージをインストールしてください。
# dnf install heterodb-extra
ライセンスの有効化
heterodb-extra
モジュールの全ての機能を利用するには、HeteroDB社が提供するライセンスの有効化が必要です。ライセンスなしで運用する事も可能ですが、その場合、下記の機能が制限を受けます。
- マルチGPUの利用
- GPUダイレクトSQLにおける複数NVME-SSDによるストライピング(md-raid0)
- GPUダイレクトSQLにおけるNVME-oFデバイスの利用
- GPU版PostGISにおけるGiSTインデックスの利用
ライセンスファイルは以下のような形式でHeteroDB社から入手する事ができます。
IAgIVdKxhe+BSer3Y67jQW0+uTzYh00K6WOSH7xQ26Qcw8aeUNYqJB9YcKJTJb+QQhjmUeQpUnboNxVwLCd3HFuLXeBWMKp11/BgG0FSrkUWu/ZCtDtw0F1hEIUY7m767zAGV8y+i7BuNXGJFvRlAkxdVO3/K47ocIgoVkuzBfLvN/h9LffOydUnHPzrFHfLc0r3nNNgtyTrfvoZiXegkGM9GBTAKyq8uWu/OGonh9ybzVKOgofhDLk0rVbLohOXDhMlwDl2oMGIr83tIpCWG+BGE+TDwsJ4n71Sv6n4bi/ZBXBS498qShNHDGrbz6cNcDVBa+EuZc6HzZoF6UrljEcl=
----
VERSION:2
SERIAL_NR:HDB-TRIAL
ISSUED_AT:2019-05-09
EXPIRED_AT:2019-06-08
GPU_UUID:GPU-a137b1df-53c9-197f-2801-f2dccaf9d42f
これを /etc/heterodb.license
にコピーし、PostgreSQLを再起動します。
以下のようにPostgreSQLの起動ログにライセンス情報が出力され、ライセンスの有効化が行われた事が分かります。
:
LOG: HeteroDB Extra module loaded [api_version=20231105,cufile=on,nvme_strom=off,githash=9ca2fe4d2fbb795ad2d741dcfcb9f2fe499a5bdf]
LOG: HeteroDB License: { "version" : 2, "serial_nr" : "HDB-TRIAL", "issued_at" : "2022-11-19", "expired_at" : "2099-12-31", "nr_gpus" : 1, "gpus" : [ { "uuid" : "GPU-13943bfd-5b30-38f5-0473-78979c134606" } ]}
LOG: PG-Strom version 5.0.1 built for PostgreSQL 15 (githash: 972441dbafed6679af86af40bc8613be2d73c4fd)
:
PostgreSQLのインストール
本節ではRPMによるPostgreSQLのインストールについて紹介します。
ソースからのインストールに関しては既にドキュメントが数多く存在し、./configure
スクリプトのオプションが多岐にわたる事から、ここでは紹介しません。
Linuxディストリビューションの配布するパッケージにもPostgreSQLは含まれていますが、必ずしも最新ではなく、PG-Stromの対応バージョンよりも古いものである事が多々あります。例えば、Red Hat Enterprise Linux 7.xで配布されているPostgreSQLはv9.2.xですが、これはPostgreSQLコミュニティとして既にEOLとなっているバージョンです。
PostgreSQL Global Development Groupは、最新のPostgreSQLおよび関連ソフトウェアの配布のためにyumリポジトリを提供しています。 EPELの設定のように、yumリポジトリの設定を行うだけの小さなパッケージをインストールし、その後、PostgreSQLやその他のソフトウェアをインストールします。
yumリポジトリ定義の一覧は http://yum.postgresql.org/repopackages.php です。
PostgreSQLメジャーバージョンとLinuxディストリビューションごとに多くのリポジトリ定義がありますが、あなたのLinuxディストリビューション向けのPostgreSQL 15以降のものを選択する必要があります。
以下のステップで PostgreSQL のインストールを行います。
- yumリポジトリの定義をインストール
- OS標準のPostgreSQLモジュールの無効化
- PostgreSQLパッケージのインストール
例えばPostgreSQL v16を使用する場合、PG-Stromのインストールには postgresql16-server
およびpostgresql16-devel
パッケージが必要です。
以下は、RHEL9においてPostgreSQL v16をインストールする手順の例です。
# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# dnf -y module disable postgresql
# dnf install -y postgresql16-devel postgresql16-server
Note
Red Hat Enterprise Linuxの場合、パッケージ名postgresql
がディストリビューション標準のものと競合してしまい、PGDG提供のパッケージをインストールする事ができません。そのため、dnf -y module disable postgresql
コマンドを用いてディストリビューション標準のpostgresql
モジュールを無効化します。
PG-Stromのインストール
本節ではPG-Stromのインストール方法について説明します。 推奨はRPMによるインストールですが、開発者向けにソースコードからのビルド方法についても紹介します。
RPMによるインストール
PG-Stromおよび関連パッケージはHeteroDB Software Distribution Centerより配布されています。 既にyumシステムへリポジトリを追加済みであれば、それほど作業は多くありません。
基盤となるPostgreSQLのバージョンごとに別個のPG-StromのRPMパッケージが準備されており、PostgreSQL v15用であればpg_strom-PG15
パッケージを、PostgreSQL v16用であればpg_strom-PG16
パッケージをインストールします。
これは、PostgreSQL拡張モジュールのバイナリ互換性に伴う制約です。
# dnf install -y pg_strom-PG16
以上でパッケージのインストールは完了です。
ソースからのインストール
開発者向けに、ソースコードからPG-Stromをビルドする方法についても紹介します。
ソースコードの入手
RPMパッケージと同様に、ソースコードのtarballをHeteroDB Software Distribution Centerから入手する事ができます。
ただ、tarballのリリースにはある程度のタイムラグが生じてしまうため、最新の開発版を使いたい場合にはPG-StromのGitHubリポジトリのmaster
ブランチをチェックアウトする方法の方が好まれるかもしれません。
$ git clone https://github.com/heterodb/pg-strom.git
Cloning into 'pg-strom'...
remote: Counting objects: 13797, done.
remote: Compressing objects: 100% (215/215), done.
remote: Total 13797 (delta 208), reused 339 (delta 167), pack-reused 13400
Receiving objects: 100% (13797/13797), 11.81 MiB | 1.76 MiB/s, done.
Resolving deltas: 100% (10504/10504), done.
PG-Stromのビルド
PG-Stromをビルドする時のコンフィグは、インストール先のPostgreSQLと厳密に一致していなければいけません。例えば、同じ構造体がビルド時のコンフィグによりPostgreSQLとPG-Stromで異なったレイアウトを持ってしまったとすれば、非常に発見の難しいバグを生み出してしまうかもしれません。 したがって、(一貫性のない状態を避けるため)PG-Stromは独自にconfigureスクリプトを走らせたりはせず、pg_config
を使ってPostgreSQLのビルド時設定を参照します。
pg_config
にパスが通っており、それがインストール先のPostgreSQLのものであれば、そのままmake
、make install
を実行します。
直接パスが通っていない場合は、make
コマンドにPG_CONFIG=...
パラメータを与え、pg_config
のフルパスを渡します。
$ cd pg-strom/src
$ make PG_CONFIG=/usr/pgsql-16/bin/pg_config
$ sudo make install PG_CONFIG=/usr/pgsql-16/bin/pg_config
インストール後の設定
データベースクラスタの作成
データベースクラスタの作成が済んでいない場合は、initdb
コマンドを実行してPostgreSQLの初期データベースを作成します。
RPMインストールにおけるデフォルトのデータベースクラスタのパスは/var/lib/pgsql/<version number>/data
です。
postgresql-alternatives
パッケージをインストールしている場合は、PostgreSQLのバージョンに拠らず/var/lib/pgdata
で参照する事ができます。
# su - postgres
$ /usr/pgsql-16/bin/initdb -D /var/lib/pgdata/
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /var/lib/pgdata ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Tokyo
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
pg_ctl -D /var/lib/pgdata/ -l logfile start
postgresql.confの編集
続いて、PostgreSQLの設定ファイルである postgresql.conf
を編集します。
PG-Stromを動作させるためには、最低限、以下のパラメータの設定が必要です。 これ以外のパラメータについても、システムの用途や想定ワークロードを踏まえて検討してください。
- shared_preload_libraries
- PG-Stromモジュールは
shared_preload_libraries
パラメータによりpostmasterプロセスの起動時にロードされる必要があります。オンデマンドでの拡張モジュールのロードはサポート対象外です。したがって、以下の設定項目は必須です。 shared_preload_libraries = '$libdir/pg_strom'
- PG-Stromモジュールは
- max_worker_processes
- PG-Stromは数個のバックグラウンドワーカーを内部的に使用します。そのため、デフォルト値である 8 では、それ以外の処理に利用できるバックグラウンドワーカープロセス数があまりにも少なすぎてしまいます。
- 以下のように、ある程度の余裕を持った値を設定すべきです。
max_worker_processes = 100
- shared_buffers
- ワークロードによりますが、
shared_buffers
の初期設定は非常に小さいため、PG-Stromが有効に機能する水準のデータサイズに対しては、ストレージへの読み書きが律速要因となってしまい、GPUの並列計算機能を有効に利用できない可能性があります。 - 以下のように、ある程度の余裕を持った値を設定すべきです。
shared_buffers = 10GB
- 明らかにメモリサイズよりも大きなデータを処理する必要がある場合は、SSD-to-GPUダイレクトSQL実行の利用を検討してください。
- ワークロードによりますが、
- work_mem
- ワークロードによりますが、
work_mem
の初期設定は非常に小さいため、解析系クエリで最適なクエリ実行計画が選択されない可能性があります。 - 典型的な例は、ソート処理にオンメモリのクイックソートではなく、ディスクベースのマージソートを選択するといったものです。
- 以下のように、ある程度の余裕を持った値を設定すべきです。
work_mem = 1GB
- ワークロードによりますが、
OSのリソース制限の拡張
GPUダイレクトSQLを使用する場合は特に、同時に大量のファイルをオープンする事があるため、プロセスあたりファイルディスクリプタ数の上限を拡大しておく必要があります。
また、PostgreSQLのクラッシュ時に確実にコアダンプを生成できるよう、コアファイルのサイズ上限を制限しないことを推奨します。
PostgreSQLをsystemd経由で起動する場合、リソース制限に関する設定は/etc/systemd/system/postgresql-XX.service.d/pg_strom.conf
に記述します。
RPMによるインストールの場合、デフォルトで以下の内容が設定されます。
環境変数 CUDA_ENABLE_COREDUMP_ON_EXCEPTION
に関する設定がコメントアウトされています。これは開発者向けのオプションで、これを有効にして起動すると、GPU側でエラーが発生した場合にGPUのコアダンプを生成させる事ができます。詳しくはCUDA-GDB:GPU core dump supportをご覧ください。
[Service]
LimitNOFILE=65536
LimitCORE=infinity
#Environment=CUDA_ENABLE_COREDUMP_ON_EXCEPTION=1
PostgreSQLの起動
PostgreSQLを起動します。
正常にセットアップが完了していれば、ログにPG-StromがGPUを認識した事を示すメッセージが記録されているはずです。 以下の例では、NVIDIA A100 (PCIE版; 40GB) を認識しており、また、NVME-SSDごとに近傍のGPUがどちらであるのか出力されています。
# systemctl start postgresql-16
# journalctl -u postgresql-16
Jun 02 17:28:45 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:45.989 JST [20242] LOG: HeteroDB Extra module loaded [api_version=20240418,cufile=off,nvme_strom=off,githash=3ffc65428c07bb3c9d0e5c75a2973389f91dfcd4]
Jun 02 17:28:45 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:45.989 JST [20242] LOG: HeteroDB License: { "version" : 2, "serial_nr" : "HDB-TRIAL", "issued_at" : "2024-06-02", "expired_at" : "2099-12-31", "nr_gpus" : 1, "gpus" : [ { "uuid" : "GPU-13943bfd-5b30-38f5-0473-78979c134606" } ]}
Jun 02 17:28:45 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:45.989 JST [20242] LOG: PG-Strom version 5.12.el9 built for PostgreSQL 16 (githash: )
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.114 JST [20242] LOG: PG-Strom binary built for CUDA 12.4 (CUDA runtime 12.5)
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.114 JST [20242] WARNING: The CUDA version where this PG-Strom module binary was built for (12.4) is newer than the CUDA runtime version on this platform (12.5). It may lead unexpected behavior, and upgrade of CUDA toolkit is recommended.
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.114 JST [20242] LOG: PG-Strom: GPU0 NVIDIA A100-PCIE-40GB (108 SMs; 1410MHz, L2 40960kB), RAM 39.50GB (5120bits, 1.16GHz), PCI-E Bar1 64GB, CC 8.0
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.117 JST [20242] LOG: [0000:41:00:0] GPU0 (NVIDIA A100-PCIE-40GB; GPU-13943bfd-5b30-38f5-0473-78979c134606)
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.117 JST [20242] LOG: [0000:81:00:0] nvme6 (NGD-IN2500-080T4-C) --> GPU0 [dist=9]
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.117 JST [20242] LOG: [0000:82:00:0] nvme3 (INTEL SSDPF2KX038TZ) --> GPU0 [dist=9]
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.117 JST [20242] LOG: [0000:c2:00:0] nvme1 (INTEL SSDPF2KX038TZ) --> GPU0 [dist=9]
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.117 JST [20242] LOG: [0000:c6:00:0] nvme4 (Corsair MP600 CORE) --> GPU0 [dist=9]
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.117 JST [20242] LOG: [0000:c3:00:0] nvme5 (INTEL SSDPF2KX038TZ) --> GPU0 [dist=9]
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.117 JST [20242] LOG: [0000:c1:00:0] nvme0 (INTEL SSDPF2KX038TZ) --> GPU0 [dist=9]
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.117 JST [20242] LOG: [0000:c4:00:0] nvme2 (NGD-IN2500-080T4-C) --> GPU0 [dist=9]
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.217 JST [20242] LOG: redirecting log output to logging collector process
Jun 02 17:28:48 buri.heterodb.com postgres[20242]: 2024-06-02 17:28:48.217 JST [20242] HINT: Future log output will appear in directory "log".
Jun 02 17:28:48 buri.heterodb.com systemd[1]: Started PostgreSQL 16 database server.
PG-Stromエクステンションの作成
最後に、PG-Stromに関連するSQL関数などのDBオブジェクトを作成します。
この手順はPostgreSQLのEXTENSION機能を用いてパッケージ化されており、SQLコマンドラインでCREATE EXTENSION
コマンドを実行するだけです。
なお、この手順は新しいデータベースを作成するたびに必要になる事に注意してください。
新しいデータベースを作成した時点で既にPG-Strom関連オブジェクトが作成されていてほしい場合は、予めtemplate1
データベースでPG-Stromエクステンションを作成しておけば、CREATE DATABASE
コマンドの実行時に新しいデータベースへ設定がコピーされます。
$ psql -U postgres
psql (16.3)
Type "help" for help.
postgres=# CREATE EXTENSION pg_strom ;
CREATE EXTENSION
以上でインストール作業は完了です。
PostGISのインストール
PG-Stromは一部のPostGIS関数のGPU処理をサポートしています。 本節ではPostGISのインストール手順について説明を行いますが、必要に応じて読み飛ばしてください。
PostgreSQLと同様に、PostgreSQL Global Development GroupのyumリポジトリからPostGISモジュールをインストールする事ができます。 以下の例は、PostgreSQL v16向けにビルドされたPostGIS v3.4をインストールするものです。
# dnf install postgis34_16
データベースクラスタを作成してPostgreSQLサーバを起動し、SQLクライアントからCREATE EXTENSION
コマンドを実行してGeometryデータ型や地理情報分析のためのSQL関数を作成します。
これでPostGISのインストールは完了です。
postgres=# CREATE EXTENSION postgis;
CREATE EXTENSION
Ubuntu Linuxへのインストール
現在のところ、Ubuntu Linux向けのパッケージは提供されていませんが、ソースコードからPG-Stromをビルドして動作させることができます。
OSのインストール後、それぞれUbuntu Linux向けのMOFEDドライバ、CUDA Toolkit、およびPostgreSQLをインストールしてください。
続いて、heterodb-extra
パッケージをインストールします。
Ubuntu Linux 用の .deb
パッケージが提供されていますので、その時点の最新版をSWDCより入手してください。
$ wget https://heterodb.github.io/swdc/deb/heterodb-extra_5.4-1_amd64.deb
$ sudo dpkg -i heterodb-extra_5.4-1_amd64.deb
PG-Stromはソースコードをチェックアウトしてインストールします。
この時、ターゲットとするPostgreSQLのpg_config
を指定するのを忘れないようにしてください。
インストール後の設定は Red Hat Enterprise Linux や Rocky Linux の場合と同じです。
$ git clone https://github.com/heterodb/pg-strom.git
$ cd pg-strom/src
$ make PG_CONFIG=/path/to/pgsql/bin/pg_config -j 8
$ sudo make PG_CONFIG=/path/to/pgsql/bin/pg_config install