2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spyreを使ってLLMを動かしてみる

2
Last updated at Posted at 2026-06-18

IBM PowerやIBM Z向けに提供されているIBM Spyreを使ってLLMを動かしてみます。
現在、IBM Spyre for Power向けには Red Hat AI Inference(RHAII)が提供されています。
RHAIIはRed Hatが提供するvLLMベースの推論用サーバーです。

Kubernetes などのオーケストレーター環境を使わず、podman run だけで手軽に試せる方法です。

Spyre for Powerの基本的な使い方である ai-services を使用する方法は下記の記事にまとめています。

環境

  • サーバー : IBM Power(Spyre アクセラレーター搭載)
  • OS : RHEL 9.6
  • コンテナランタイム : Podman
  • コンテナイメージ : registry.redhat.io/rhaii/vllm-spyre-rhel9:3.4.0
  • モデル : ibm-granite/granite-3.3-8b-instruct

Spyre カードの ID を確認する

まず、搭載されている Spyre(IBM AIU)の PCIe ID を確認します。
1014:06a7 がSpyreのデバイスIDなので、 -d でSpyreのみ表示可能です。

lspci -d 1014:06a7

実行例:

# lspci -d 1014:06a7
0381:50:00.0 Processing accelerators: IBM Spyre Accelerator (rev 02)
0382:60:00.0 Processing accelerators: IBM Spyre Accelerator (rev 02)
0383:70:00.0 Processing accelerators: IBM Spyre Accelerator (rev 02)
0384:80:00.0 Processing accelerators: IBM Spyre Accelerator (rev 02)
0481:50:00.0 Processing accelerators: IBM Spyre Accelerator (rev 02)

コンテナ起動時にPCIe IDが必要になります。
コピーしやすいように一行で表示できるコマンドはこちら。

lspci -d 1014:06a7 | awk '{print $1}' | paste -sd" " -

実行例:

0381:50:00.0 0382:60:00.0 0383:70:00.0 0384:80:00.0

コンテナを起動する

以下の環境変数を設定したうえで podman run を実行します。
AIU_IDS は使用するカードを絞りたい場合は手動で指定してください。

今回は簡易的に ai-services を実行時にダウンロードされているモデルをそのまま使用します。

本来は、root権限を持たないユーザーを作成しモデルをダウンロードする方法が推奨されています。
詳細が記載されているドキュメントはこちらです。

export AIU_IDS="$(lspci -d 1014:06a7 | awk '{print $1}' | paste -sd" " -)"
export HOST_MODELS_DIR=/var/lib/ai-services/models
export VLLM_MODEL_PATH=/models/ibm-granite/granite-3.3-8b-instruct
export AIU_WORLD_SIZE=4
export MAX_MODEL_LEN=3072
export MAX_BATCH_SIZE=16

podman run \
  --device=/dev/vfio \
  -v "${HOST_MODELS_DIR}:/models"Z \
  -e AIU_PCIE_IDS="${AIU_IDS}" \
  -e VLLM_SPYRE_USE_CB=1 \
  --pids-limit=0 \
  --userns=keep-id \
  --group-add=keep-groups \
  --security-opt label=disable \
  --memory=100G \
  -p 8000:8000 \
  registry.redhat.io/rhaiis/vllm-spyre-rhel9:3.3.0-1771459423 \
  --model "${VLLM_MODEL_PATH}" \
  -tp "${AIU_WORLD_SIZE}" \
  --max-model-len "${MAX_MODEL_LEN}" \
  --max-num-seqs "${MAX_BATCH_SIZE}" \
  --enable-prefix-caching

主なオプションの説明:

オプション 内容
--device=/dev/vfio Spyre デバイスをコンテナに渡す
-v "${HOST_MODELS_DIR}:/models" ホスト上のモデルディレクトリをマウント
AIU_PCIE_IDS 使用する Spyre カードの PCIe ID
VLLM_SPYRE_USE_CB Continuous Batching を有効化(1 で ON)
--memory=100G コンテナのメモリー上限
-p 8000:8000 API サーバーをホスト側にポートフォワード
-tp Tensor Parallel サイズ ※利用するSpyreカードの枚数を指定
--enable-prefix-caching プレフィックスキャッシュを有効化

起動ログを確認する

起動後はウォームアップ処理が走ります。初回起動時はモデルのコンパイルを行うため、完了まで数分かかります。

---- IBM AIU Device Discovery...
---- --> Detecting PCIe devices...
---- --> Detected:   5 AIU PFs,   0 AIU VFs,   0 NICs,   1 NVMEs
---- --> Writing final topology file: /tmp/etc/ibm/spyre/topo.json
---- IBM AIU Environment Setup... (Generate environment from existing config)
---- IBM AIU Devices Found: 5
...
(EngineCore_DP0 pid=94) INFO 05-12 02:25:21 [spyre_worker.py:415] load model...
(EngineCore_DP0 pid=94) INFO 05-12 02:25:25 [spyre_worker.py:443] load model took 4.755s
(EngineCore_DP0 pid=94) INFO 05-12 02:25:26 [spyre_worker.py:704] [WARMUP] Prefill [1/1]...
(EngineCore_DP0 pid=94) INFO 05-12 02:26:45 [spyre_worker.py:526] [WARMUP] Deploying to device...
(EngineCore_DP0 pid=94) INFO 05-12 02:28:11 [spyre_worker.py:536] [WARMUP] Finished in 165.372s (compilation cache enabled)
(EngineCore_DP0 pid=94) INFO 05-12 02:28:11 [core.py:210] init engine (profile, create kv cache, warmup model) took 165.37 seconds
...
(APIServer pid=1) INFO 05-12 02:28:12 [api_server.py:1912] Starting vLLM API server 0 on http://0.0.0.0:8000
(APIServer pid=1) INFO:     Application startup complete.

Application startup complete. が表示されれば API サーバーが起動完了です。
ウォームアップには今回の環境で約 2 分 45 秒かかりました(コンパイルキャッシュが有効な場合)。

補足: ログに [PRECOMPILED_WARN] が出る場合があります。コンパイル済みキャッシュのバージョンやモデルパスが異なる場合の警告であり、動作には影響しません。

curl で動作確認

API サーバーが起動したら、curl でリクエストを送って確認してみます。

curl -X POST -H "Content-Type: application/json" -d '{
    "model": "/models/granite-3.3-8b-instruct",
    "prompt": "日本の首都はどこですか?端的に教えてください。",
    "max_tokens": 50
}' http://127.0.0.1:8000/v1/completions | jq

レスポンス例:

{
  "id": "cmpl-9fc82009a691cbb9",
  "object": "text_completion",
  "created": 1781226728,
  "model": "/models/ibm-granite/granite-3.3-8b-instruct",
  "choices": [
    {
      "index": 0,
      "text": "\n東京\n\n日本の首都は東京です。",
      "logprobs": null,
      "finish_reason": "stop",
      "stop_reason": null,
      "token_ids": null,
      "prompt_logprobs": null,
      "prompt_token_ids": null
    }
  ],
  "service_tier": null,
  "system_fingerprint": null,
  "usage": {
    "prompt_tokens": 17,
    "total_tokens": 34,
    "completion_tokens": 17,
    "prompt_tokens_details": null
  },
  "kv_transfer_params": null
}

無事に回答が返ってきました。

OpenWebUI と連携してみる

せっかくなので、ブラウザから使えるチャットUIも試してみます。
Mac 上で OpenWebUI を Podman で起動し、先ほど起動した vLLM API に接続します。

podman run -d \
  -p 7860:8080 \
  -v open-webui:/app/backend/data \
  --name open-webui \
  ghcr.io/open-webui/open-webui:main

http://localhost:7860/ にアクセスすると OpenWebUI の画面が表示されます。

OpenAI APIの接続管理に起動したサーバーの接続情報を入れていきます。
API キーは設定していないため、任意の値(例: vllm)を入力します。

1778554057923-1e1a8ab3cd1b2.png

接続先として vLLM の API エンドポイントを指定することで、Granite モデルとブラウザからチャットできるようになります。

1778554148520-63d9a7b88b864.png

まとめ

RHAIIコンテナを使うことで、IBM Spyre アクセラレーター上での LLM 推論をシンプルな podman run コマンドだけで試せることが確認できました。

  • Spyre カードの PCIe ID を環境変数にセットして渡すだけでデバイスが認識される
  • ウォームアップ込みで数分以内に OpenAI 互換の API サーバーが起動する
  • OpenWebUI など既存の UI ツールとそのまま連携できる

手軽に試せる構成なので、まずは動作確認やベンチマークの出発点としておすすめです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?