インストール

本章では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の中には、これ以前のバージョンでは提供されていないものが含まれています。

インストール手順

一連のインストール手順は以下の通りとなります。

  1. H/Wの初期設定
  2. OSのインストール
  3. MOFEDドライバのインストール
  4. CUDA Toolkit のインストール
  5. HeteroDB拡張モジュールのインストール
  6. PostgreSQLのインストール
  7. PG-Stromのインストール
  8. 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系列を含む)の場合、ソフトウェア構成は、ベース環境として「最小限のインストール」を選択し、さらに追加のソフトウェアとして「標準」「開発ツール」を選択してください。

RHEL9 Software Selection

サーバーへの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 Driver Selection

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)』版を選択してください。

CUDA Toolkit download

『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-rdmarpcrdmaカーネルモジュールもロードしているため、関連する機能が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のものであれば、そのままmakemake 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'
  • 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