以前の記事でSpyreを使ったLLMの起動方法について書きました。
この記事では、事前セットアップ情報まで記載していませんでした。
また、公式のドキュメントでは非rootユーザーでの使用を推奨しているので、ドキュメントに沿った方法を改めて記載します。
Spyreカードを使って、RHAII(Red Hat AI Inference)の vLLMコンテナを実行するための環境設定手順をまとめます。
Podman の rootless 構成を前提としており、root 作業と非 root 作業が分かれています。
前提環境
- サーバー: IBM Power(Spyre カード搭載)
- OS: RHEL9 または RHEL10
- コンテナランタイム: Podman(rootless)
- ホストメモリ: カード構成に合わせて 100GB〜200GB 以上推奨
必要な RHEL パッケージのインストール
まずは基本的なパッケージを入れておきます。
dnf -y install container-tools git git-lfs wget
container-tools には Podman が含まれています。
git-lfs は後で Hugging Face からモデルをクローンする際に必要になります。
servicereport のインストール
Spyreカードの設定を自動的に行う servicereport コマンドを使えるようにします。
IBM Power Systems Service Tools のインストール
下記の IBM サポートページから RPM を入手します。
Service and productivity tools
ページ内に ibm-power-repo パッケージのダウンロードリンクがあるので、そこから RPM ファイルを取得します。
RPM のインストールと初期設定
ダウンロードした RPM をインストールします。
rpm -ivh ibm-power-repo-latest.noarch.rpm
次に configure を実行します。ライセンス画面が表示されるので q → y → Enter で同意します。
/opt/ibm/lop/configure
servicereport と関連パッケージのインストール
OSバージョンに合わせてインストールコマンドを使い分けます。
RMC接続用のパッケージがOSのバージョンに対応しものが提供されています。
RHEL9 の場合:
dnf -y install ServiceReport ibm-power-managed-rhel9
RHEL10 の場合:
dnf -y install ServiceReport ibm-power-managed-rhel10
root ユーザーとして実行する手順
1. 非 root ユーザーの作成
Podman を rootless で動かすための専用ユーザーを作成します。
ここでは senuser という名前で作成していますが、任意の名前に変更しても問題ありません。
以降の手順でも同じ名前を使い続けてください。
adduser senuser
passwd senuser
2. ServiceReport による Spyre カード設定
現在の設定を検証
servicereport -v -p spyre
初期状態では多くの項目が FAIL になることがありますが、これは正常です。
不正設定を自動修正
servicereport -r -p spyre
以下の内容が自動設定されます。
- VFIO バインディング
- udev ルール
- sentient グループ
- memlock
- VFIO モジュール挿入
senuser を sentient グループへ追加
usermod -aG sentient senuser
3. モデルディレクトリのセットアップ
Spyre コンテナからモデルを参照するためのディレクトリを作成します。
sentient グループがアクセスできるよう権限を設定します。
install -d -m 0775 -o root -g sentient /opt/ibm/spyre/models/src
4. systemd / ログ / リソース委任の設定
systemd linger を有効化
senuser としてログインしていない状態でも Quadlet(systemd で管理する Podman コンテナ)が自動起動するよう設定します。
※ Quadletでの利用方法は別記事で書こうと思います。
loginctl enable-linger senuser
コンテナログを永続保存
-m 2755 はディレクトリに setgid ビットを立てており、グループが systemd-journal で統一されます。
install -d -m 2755 -o root -g systemd-journal /var/log/journal
sed -ri 's/^#?Storage=.*/Storage=persistent/' /etc/systemd/journald.conf
systemctl restart systemd-journald
senuser にリソース委任を許可
CPU、メモリなどのリソースを senuser のユーザー unit に委任できるようにします。
install -d -m 0755 -o root -g root /etc/systemd/system/user@.service.d
cat << EOF > /etc/systemd/system/user@.service.d/delegate.conf
[Service]
Delegate=cpu cpuset memory pids
EOF
systemctl daemon-reload
LPAR を再起動して変更を適用
カーネルモジュールの挿入や udev ルールを確実に反映させるために再起動します。
reboot
非 root ユーザー(senuser)として実行する手順
重要: root でログイン後に
sudo su senuserで切り替えるのは NG です。
この方法ではXDG_RUNTIME_DIRや D-Bus セッションが正しく初期化されず、Podman の rootless 環境が正常に動作しません。
必ずsenuserとして直接ログインしてください。
1. Quadlet 用 systemd ディレクトリを作成
mkdir -p ~/.config/containers/systemd
2. AI モデルのダウンロード
Hugging Faceには以下が必要です:
- アクティブなアカウント
- インストールおよび認証済みのコマンドラインインターフェイス(CLI)クライアントが必要です。インストールおよび認証の手順については、コマンドラインインターフェイス(CLI)のドキュメントを参照
Git LFS を有効化してモデルをクローン
git lfs install
cd /opt/ibm/spyre/models/src
# 必須モデル
git clone https://huggingface.co/ibm-granite/granite-3.3-8b-instruct
# Embedding モデル(用途に応じて選択)
git clone https://huggingface.co/ibm-granite/granite-embedding-30m-english
git clone https://huggingface.co/ibm-granite/granite-embedding-125m-english
git clone https://huggingface.co/ibm-granite/granite-embedding-107m-multilingual
git clone https://huggingface.co/ibm-granite/granite-embedding-278m-multilingual
git clone https://huggingface.co/BAAI/bge-reranker-v2-m3
# その他サポートモデル(任意)
git clone https://huggingface.co/ibm-granite/granite-4.1-8b-fp8
git clone https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct
git clone https://huggingface.co/mistralai/Mistral-Small-3.2-24B-Instruct-2506
git clone https://huggingface.co/intfloat/multilingual-e5-large
git clone https://huggingface.co/intfloat/multilingual-e5-large-instruct
Spyre カードの ID 確認
コンテナ起動時に Spyre カードの PCIe ID を指定する必要があります。
以下のコマンドで確認できます。
lspci -d 1014:06a7
出力例:
0001:00:00.0 Processing accelerators: IBM Device 06a7 (rev 02)
0002:00:00.0 Processing accelerators: IBM Device 06a7 (rev 02)
0001:00:00.0 や 0002:00:00.0 がカード ID です。コンテナ起動時にスペース区切りで指定します。
例: AIU_IDS="0001:00:00.0 0002:00:00.0 0003:00:00.0 0004:00:00.0"
RHAIIコンテナの起動
エンティティ抽出用(カード1枚)
granite-4.1-8b-fp8 を使ってエンティティ抽出を行う構成です。
fp8 量子化モデルのため、カード1枚・100GB メモリで動作します。
export AIU_IDS="0001:00:00.0" # lspci で確認したカード ID に変更してください
export HOST_MODELS_DIR=/opt/ibm/spyre/models/src
export VLLM_MODEL_PATH=/models/granite-4.1-8b-fp8
export AIU_WORLD_SIZE=1
export MAX_MODEL_LEN=3072
export MAX_BATCH_SIZE=16
podman run \
--device=/dev/vfio \
-v "${HOST_MODELS_DIR}:/models" \
-e AIU_PCIE_IDS="${AIU_IDS}" \
--pids-limit=0 \
--userns=keep-id \
--group-add=keep-groups \
--security-opt label=disable \
--memory=100G \
-p 127.0.0.1:8000:8000 \
registry.redhat.io/rhaii-early-access/vllm-spyre-rhel9:3.5.0-ea.1-1781067361 \
--model "${VLLM_MODEL_PATH}" \
-tp "${AIU_WORLD_SIZE}" \
--max-model-len "${MAX_MODEL_LEN}" \
--max-num-seqs "${MAX_BATCH_SIZE}"
インストラクション用(カード4枚)
より大きなコンテキスト長(32k)を設定した instruct 構成です。
カード4枚・200GB メモリを使用します。
export AIU_IDS="0001:00:00.0 0002:00:00.0 0003:00:00.0 0004:00:00.0" # カード ID に変更してください
export HOST_MODELS_DIR=/opt/ibm/spyre/models/src
export VLLM_MODEL_PATH=/models/granite-4.1-8b-fp8
export AIU_WORLD_SIZE=4
export MAX_MODEL_LEN=32768
export MAX_BATCH_SIZE=32
podman run \
--device=/dev/vfio \
-v "${HOST_MODELS_DIR}:/models" \
-e AIU_PCIE_IDS="${AIU_IDS}" \
--userns=keep-id \
--group-add=keep-groups \
--security-opt label=disable \
--pids-limit=0 \
--memory=200G \
--shm-size=2G \
-p 127.0.0.1:8000:8000 \
registry.redhat.io/rhaii-early-access/vllm-spyre-rhel9:3.5.0-ea.1-1781067361 \
--model "${VLLM_MODEL_PATH}" \
-tp "${AIU_WORLD_SIZE}" \
--max-model-len "${MAX_MODEL_LEN}" \
--max-num-seqs "${MAX_BATCH_SIZE}"
コンテナイメージのバージョンは Early Access のため更新される場合があります。最新のタグは RHAII のリリース情報を確認してください。
-p 127.0.0.1:8000:8000 のように localhost バインドにしているため、外部からの直接アクセスは不可です。
外部からアクセスしたい場合はリバースプロキシなどを経由してください。