背景

MiniMax-2.5 229B MoEは,256個の専門家を持つ混合専門家モデルで,特に長コンテキスト処理と知識集約型タスク向けに設計されている。ローカル環境での運用を検討する際,GPUメモリ制約と生成速度のバランスを取るため,IQ5K量子化でのベンチマークを実施した。

RTX PRO 6000 Blackwell Max-Q(96GB VRAM)環境で,65,536トークンの長コンテキスト設定下での実行可能性と性能を定量的に評価することが目的。

目的

  1. MiniMax-2.5 229B MoE IQ5K量子化の実行可能性をBlackwell環境で確認
  2. Prompt評価(prefill)と生成(decode)の速度を分離して計測
  3. expert CPU配置設定(-ot exps=CPU)の影響度を把握
  4. 65,536トークンのKV キャッシュ動作とprompt cacheの安定性を検証

実験環境

項目仕様
GPUNVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition(VRAM: 96GB, Compute Capability: 12.0)
CPUIntel(実際はAMD EPYC相当,AVX/AVX2/AVX512対応)
メモリ768GB DDR5
モデルMiniMax-2.5(アーキテクチャ: minimax-m2), 229B.A10B(MoE)
量子化IQ5_K(表示上5.5 bits per weight, モデルサイズ: 157.77 GiB)
コンテキスト長65,536トークン
Runtimellama.cpp(commit: 1cb7e1bf, build: 4192)

実施内容

起動コマンド

  podman run --rm -it \
  --device nvidia.com/gpu=all \
  -p 8081:8080 \
  --shm-size 16g \
  --cap-add=SYS_NICE \
  -v "$MO":/models:ro,Z \
  $IMG \
  --host 0.0.0.0 --port 8080 \
  -m "$MODEL" \
  --no-mmap --jinja \
  -c 65536 \
  --threads 13 --threads-batch 25 \
  -b 2048 -ub 2048 \
  -ngl 99 \
  -ot exps=CPU \
  -ctk f16 -ctv f16 \
  --warmup-batch \
  -fa on
  

主要パラメータ説明

  • -c 65536: コンテキスト長を65,536トークンに設定
  • –threads 13: CPU処理用スレッド数
  • -ngl 99: GPU層を99層offload(ほぼ全層をGPUで計算)
  • -ot exps=CPU: MoE expertの重みをCPU配置に強制
  • -fa on: Flash Attention有効化
  • –no-mmap: メモリマップなしで直接ロード

ベンチマーク実行

8回のリクエストサイクルで,プロンプト長・生成長を変動させて計測。HTTP /chat/completions エンドポイント経由でのレスポンスタイムを記録。

結果

メモリ配置(実測値)

メモリ領域サイズ
CPU buffer157,356 MiB(IQ5K重み本体)
CUDA0 buffer3,578.73 MiB(計算用一時バッファ)
KV cache (CUDA0)15,872 MiB(K: 7.75 GiB + V: 7.75 GiB)
Compute buffer (CUDA0)1,990 MiB

KV キャッシュはf16で確保され,65,536コンテキスト下での メモリ配置は安定。GPU側の計算バッファは約2 GiB程度で,実運用に支障なし。

ベンチマーク結果(8ラン)

RunPrompt tokPP msPP tok/sGen tokGen msGen tok/sTotal tokTotal msTotal tok/s
17533,517214.072156,07935.379689,597100.87
23862,266170.361965,56335.235827,82974.34
32971,840161.382406,81635.215378,65662.04
43412,053166.1278322,65134.571,12424,70345.50
51,2646,152205.4673421,25934.531,99827,41172.89
69424,377215.2192126,84934.301,86331,22659.66
79384,338216.231574,57634.311,0958,914122.84
81,0756,097176.321,35140,01933.762,42646,11652.61

統計サマリー

メトリクスPrompt tok/sGen tok/sTotal tok/s
Mean190.6434.6673.84
Median190.8934.5567.46
Min161.3833.7645.50
Max216.2335.37122.84

Prompt Evaluation速度のばらつき

プロンプト評価(Prefill)は125-314 tok/sとブレが大きく,以下の要因が推定される:

  • キャッシュヒット率: 同一プロンプトの再利用時はキャッシュが効く
  • KV操作の処理コスト: prompt cacheが15.8 GiBまで蓄積されると,古いエントリ削除や一貫性チェックのコストが増加
  • NUMA/ページング: 157 GiB CPU側メモリへのアクセスパターンが統一されない

生成速度の安定性

生成(decode)は33.76-35.37 tok/sにほぼ張り付いており,expert計算がCPU側に寄っているため,PCIe/メモリ帯域のボトルネックが支配的であることを示唆。

考察

Expert CPU配置の影響

ログ上は「offloaded 63/63 layers to GPU」と表示されるものの,実際には -ot exps=CPU で256個のexpert重み(MLP層)がCPU配置されている。これにより:

  • PCIe経由のアクティブexpert転送: 各生成ステップで8個のアクティブexpertのみをCPUからGPUへ読み込む
  • メモリ帯域のボトルネック化: expert計算の往復転送がリンク飽和の原因に
  • 生成速度の上限: 35 tok/s前後という安定値は,PCIeスループット制約を示唆

Prompt Cacheの動作

ケースBのログから,prompt cacheが実際に機能していることを確認:

  • 6,029トークンで1,460 MiB保存
  • 23,104トークンで5,595 MiB保存
  • 上限8,192 MiB内で動作

同一システムプロンプトを何度も使用する運用なら,キャッシュ再利用により初回のprefill速度低下を緩和できる。

Flash Attentionの有効性

flash_attn=1有効下で,KV キャッシュが15.8 GiBまで積み上がっても,メモリアクセスパターンの最適化により,マトリクス計算効率が維持されている可能性が高い。

感想

起動・HTTP待受・KV確保・flash-attn有効化まで一通り安定して動作する構成であることが実証された。65,536コンテキストでのサーバ稼働は技術的に実現可能。

ただし,性能の詰めは -ot exps=CPU と –no-mmap の2点を改善せずに他の微調整だけ行うと効果が限定的 になることに注意。特にexpert計算がCPU寄りになっている場合,PCIeバンド幅制約が覆い隠せない。

tokenizer設定の警告(special_eos_id is not in special_eog_ids)が出ていることも,停止条件やタグ解釈の不安定性につながるため,調査・修正が推奨される。

再現方法

1. モデル取得

  huggingface-cli download TheBloke/MiniMax-2.5-A10B-IQ5_K-GGUF
  

2. llama.cpp サーバ起動

上記「実施内容」のコマンドを参照。$MODEL は ggufファイルのパス,$IMG はllama.cpp container imageとなる。

3. ベンチマーク計測

  curl -X POST http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "minimax",
    "messages": [{"role": "user", "content": "Your prompt..."}],
    "max_tokens": 1024
  }' | jq .usage
  

レスポンスJSON内の prompt_eval_count / prompt_eval_durationcompletion_tokens / completion_eval_duration から tok/s を算出。複数回リクエストして平均値を取得。

補足ノウハウ

Expert Offload戦略の選択肢

-ot exps=CPU はメモリ効率(GPU側を小さく保つ)重視だが,性能は損なわれる。代替案:

  1. -ot exps=GPU: expertもGPU配置(VRAM使用量増,高速化)
  2. mixed offload: 頻繁に使うexpertはGPU,稀なexpertはCPU(複雑だが中庸)

No-mmap の影響

--no-mmap は全ての重みをメモリに直接ロードするため,起動時間が遅く(プロセス初期化時に157 GiBを読み込む),また NUMA環境での ページング傾向が増す。代替案としてメモリマップを有効化して初期化速度を短縮できるが,アクセスパターンによってはページフォルト増加もある。

Tokenizer設定エラー

special_eos_id is not in special_eog_ids は,モデル側のtokenizer.jsonとllama.cppの解釈ズレを示す。モデル公開元のtokenizer設定を確認し,必要なら llama.cppの特殊トークンマッピングを明示的に指定(--special-tokens-file など)。

コンテキスト長と実効バッチサイズの関係

コンテキスト長が大きいほど,KV キャッシュのメモリ占有率が高くなり,実行時バッチサイズを自動調整する際に効率が低下しやすい。-b 2048 -ub 2048 の設定は上記環境では安定だが,異なるGPU・メモリ構成では要調整。

関連トピック

  • MiniMax-2.5 Expert Offload 運用と Web 生成検証 — IQ4_NL/IQ3_Sでの量子化比較、React LP・歯科医院サイトのワンショット生成検証。実際の生成出力を確認できる動画あり
  • NVIDIA Blackwell世代GPUの特性(Compute Capability 12.0)
  • llama.cpp によるMoEサポートの実装状況
  • Flash Attention による KV キャッシュ効率化
  • PCIe Gen 5バンド幅とexpert計算のスケーリング