9.6 KiB
DGX Sparkで最新LLM「MiniMax-M2.5-REAP-172B」を動かしてみた
はじめに
NVIDIA DGX Sparkは、デスクトップサイズでありながら最大200Bパラメータ(デュアル構成で405B)のAIモデルを動かせる小型AIワークステーションです。今回は、2026年2月にリリースされたばかりの最新モデル「MiniMax-M2.5-REAP-172B-A10B」をDGX Sparkデュアル構成(256GB統合メモリ)で動かす手順を紹介します。
MiniMax-M2.5-REAP-172Bとは?
MiniMax-M2.5は、中国MiniMax社が開発したコーディング・エージェント特化のMixture-of-Experts(MoE)モデルです。Cerebras社がREAP(Router-weighted Expert Activation Pruning)技術を適用し、オリジナルの230Bパラメータから172Bに軽量化したものが本モデルです。
スペック
| 項目 | 値 |
|---|---|
| 総パラメータ数 | 172B |
| アクティブパラメータ数 | 10B/トークン |
| レイヤー数 | 62 |
| エキスパート数 | 192(256から25%削減) |
| コンテキスト長 | 196,608トークン |
| ライセンス | Modified MIT |
なぜREAP版がおすすめ?
- ほぼ無劣化で25%軽量化: HumanEval等のベンチマークでオリジナルと同等性能
- vLLMネイティブ対応: パッチ不要でそのまま動く
- 256GBメモリで十分動作: オリジナル230B版では厳しいVRAM要件をクリア
動作環境
DGX Spark デュアル構成
| 項目 | スペック |
|---|---|
| アーキテクチャ | NVIDIA Grace Blackwell (GB10) |
| GPU | Blackwell GPU × 2 |
| メモリ | 256GB統合メモリ(LPDDR5x) |
| ストレージ | 4TB NVMe × 2 |
| ネットワーク | ConnectX-7 (QSFP接続) |
事前準備:ネットワーク構成
デュアルSpark構成では、2台のノードをQSFPケーブルで物理接続する必要があります。
詳細な手順は公式ドキュメントを参照してください: 👉 Connect two Sparks
確認事項
- QSFPケーブルによる物理接続
- ネットワークインターフェース設定(自動または手動IP割当)
- パスワードなしSSHの設定
- ネットワーク疎通確認
環境構築
1. Dockerグループの設定(初回のみ)
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
2. NGC公式vLLMイメージの取得
DGX Sparkではドライバー互換性の関係で、必ずNGC公式イメージを使用してください。
# 両方のノードで実行
docker pull nvcr.io/nvidia/vllm:25.11-py3
export VLLM_IMAGE=nvcr.io/nvidia/vllm:25.11-py3
3. クラスターデプロイスクリプトの取得
# 両方のノードで実行
wget https://raw.githubusercontent.com/vllm-project/vllm/refs/heads/main/examples/online_serving/run_cluster.sh
chmod +x run_cluster.sh
Rayクラスターの起動
Node 1(ヘッドノード)の起動
# Node 1で実行
# 高速インターフェースのIPアドレスを取得
# ibdev2netdev で "(Up)" と表示されるインターフェースを使用
export MN_IF_NAME=enp1s0f1np1
export VLLM_HOST_IP=$(ip -4 addr show $MN_IF_NAME | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
echo "Using interface $MN_IF_NAME with IP $VLLM_HOST_IP"
bash run_cluster.sh $VLLM_IMAGE $VLLM_HOST_IP --head ~/.cache/huggingface \
-e VLLM_HOST_IP=$VLLM_HOST_IP \
-e UCX_NET_DEVICES=$MN_IF_NAME \
-e NCCL_SOCKET_IFNAME=$MN_IF_NAME \
-e OMPI_MCA_btl_tcp_if_include=$MN_IF_NAME \
-e GLOO_SOCKET_IFNAME=$MN_IF_NAME \
-e TP_SOCKET_IFNAME=$MN_IF_NAME \
-e RAY_memory_monitor_refresh_ms=0 \
-e MASTER_ADDR=$VLLM_HOST_IP
Node 2(ワーカーノード)の起動
# Node 2で実行
export MN_IF_NAME=enp1s0f1np1
export VLLM_HOST_IP=$(ip -4 addr show $MN_IF_NAME | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
# 重要:Node 1のIPアドレスを設定
# Node 1で `echo $VLLM_HOST_IP` を実行して確認
export HEAD_NODE_IP=<NODE_1_IP_ADDRESS>
echo "Worker IP: $VLLM_HOST_IP, connecting to head node at: $HEAD_NODE_IP"
bash run_cluster.sh $VLLM_IMAGE $HEAD_NODE_IP --worker ~/.cache/huggingface \
-e VLLM_HOST_IP=$VLLM_HOST_IP \
-e UCX_NET_DEVICES=$MN_IF_NAME \
-e NCCL_SOCKET_IFNAME=$MN_IF_NAME \
-e OMPI_MCA_btl_tcp_if_include=$MN_IF_NAME \
-e GLOO_SOCKET_IFNAME=$MN_IF_NAME \
-e TP_SOCKET_IFNAME=$MN_IF_NAME \
-e RAY_memory_monitor_refresh_ms=0 \
-e MASTER_ADDR=$HEAD_NODE_IP
クラスター状態の確認
# Node 1で実行
export VLLM_CONTAINER=$(docker ps --format '{{.Names}}' | grep -E '^node-[0-9]+$')
echo "Found container: $VLLM_CONTAINER"
docker exec $VLLM_CONTAINER ray status
2ノードが認識され、GPUリソースが利用可能と表示されればOKです。
モデルのダウンロード
Hugging Faceへのログイン
# Node 1のコンテナ内で実行
export VLLM_CONTAINER=$(docker ps --format '{{.Names}}' | grep -E '^node-[0-9]+$')
docker exec -it $VLLM_CONTAINER /bin/bash
# コンテナ内で
huggingface-cli login
MiniMax-M2.5-REAP-172Bのダウンロード
# コンテナ内で(約330GB、時間がかかります)
huggingface-cli download cerebras/MiniMax-M2.5-REAP-172B-A10B
推論サーバーの起動
MiniMax-M2.5-REAP-172B用の起動コマンド
# Node 1で実行
export VLLM_CONTAINER=$(docker ps --format '{{.Names}}' | grep -E '^node-[0-9]+$')
docker exec -it $VLLM_CONTAINER /bin/bash -c '
vllm serve cerebras/MiniMax-M2.5-REAP-172B-A10B \
--tensor-parallel-size 2 \
--tool-call-parser minimax_m2 \
--reasoning-parser minimax_m2_append_think \
--trust-remote-code \
--enable-auto-tool-choice \
--max-model-len 65536 \
--gpu-memory-utilization 0.90'
パラメータ解説
| パラメータ | 説明 |
|---|---|
--tensor-parallel-size 2 |
2台のSparkでテンソル並列 |
--tool-call-parser minimax_m2 |
MiniMax専用ツールコールパーサー |
--reasoning-parser minimax_m2_append_think |
thinking出力を履歴に保持 |
--max-model-len 65536 |
最大コンテキスト長(64K) |
--gpu-memory-utilization 0.90 |
メモリ使用率上限 |
メモリ節約版(長文不要な場合)
docker exec -it $VLLM_CONTAINER /bin/bash -c '
vllm serve cerebras/MiniMax-M2.5-REAP-172B-A10B \
--tensor-parallel-size 2 \
--tool-call-parser minimax_m2 \
--reasoning-parser minimax_m2_append_think \
--trust-remote-code \
--enable-auto-tool-choice \
--max-model-len 16384 \
--max-num-seqs 32 \
--gpu-memory-utilization 0.85'
動作確認
OpenAI互換APIでテスト
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "cerebras/MiniMax-M2.5-REAP-172B-A10B",
"messages": [
{"role": "user", "content": "Pythonでフィボナッチ数列を生成する関数を書いて"}
],
"temperature": 1.0,
"top_p": 0.95,
"top_k": 40
}'
ヘルスチェック
curl http://localhost:8000/health
監視とデバッグ
Rayダッシュボード
http://<head-node-ip>:8265
GPU使用状況の確認
# 両ノードで
nvidia-smi
# コンテナ内から
export VLLM_CONTAINER=$(docker ps --format '{{.Names}}' | grep -E '^node-[0-9]+$')
docker exec $VLLM_CONTAINER nvidia-smi --query-gpu=memory.used,memory.total --format=csv
トラブルシューティング
OOM(メモリ不足)エラー
# 対策1: シーケンス数を減らす
--max-num-seqs 32
# 対策2: コンテキスト長を短く
--max-model-len 16384
# 対策3: メモリ使用率を下げる
--gpu-memory-utilization 0.80
CUDA illegal memory access エラー
# CUDAグラフモードを変更
--compilation-config "{\"cudagraph_mode\": \"PIECEWISE\"}"
Rayクラスターに接続できない
# ネットワークインターフェースの確認
ibdev2netdev
# ファイアウォールの確認
sudo ufw status
# Rayポートの開放(必要な場合)
sudo ufw allow 6379
sudo ufw allow 8265
重要な注意点
Thinkingトークンの扱い
MiniMax-M2.5は interleaved thinking model です。出力に含まれる <think>...</think> タグは、履歴として次のリクエストに含める必要があります。
# ❌ NGパターン:thinkingを削除
content = response.replace(r'<think>.*?</think>', '')
# ✅ OKパターン:そのまま保持
history.append({"role": "assistant", "content": response})
推奨推論パラメータ
{
"temperature": 1.0,
"top_p": 0.95,
"top_k": 40
}
まとめ
DGX Sparkデュアル構成(256GB)とNGC公式vLLMイメージを使えば、最新のMiniMax-M2.5-REAP-172Bが快適に動作します。オープンソースモデルとしてはトップクラスのコーディング・エージェント性能を持つこのモデル、ぜひ試してみてください。
参考リンク
- MiniMax-M2.5-REAP-172B (Hugging Face)
- DGX Spark vLLM公式ガイド
- MiniMax-M2 公式リポジトリ (GitHub)
- vLLM MiniMax-M2 デプロイガイド
- REAP論文 (arXiv)
この記事は2026年2月時点の情報です。最新情報は各公式ドキュメントをご確認ください。