note-articles/dgx-spark-minimax-m25-reap.md

350 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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-ExpertsMoEモデルです。Cerebras社がREAPRouter-weighted Expert Activation Pruning技術を適用し、オリジナルの230Bパラメータから172Bに軽量化したものが本モデルです。
### スペック
| 項目 | 値 |
|------|-----|
| 総パラメータ数 | 172B |
| アクティブパラメータ数 | 10B/トークン |
| レイヤー数 | 62 |
| エキスパート数 | 192256から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](https://build.nvidia.com/spark/connect-two-sparks)
### 確認事項
- QSFPケーブルによる物理接続
- ネットワークインターフェース設定自動または手動IP割当
- パスワードなしSSHの設定
- ネットワーク疎通確認
---
## 環境構築
### 1. Dockerグループの設定初回のみ
```bash
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
```
### 2. NGC公式vLLMイメージの取得
DGX Sparkではドライバー互換性の関係で、**必ずNGC公式イメージを使用**してください。
```bash
# 両方のノードで実行
docker pull nvcr.io/nvidia/vllm:25.11-py3
export VLLM_IMAGE=nvcr.io/nvidia/vllm:25.11-py3
```
### 3. クラスターデプロイスクリプトの取得
```bash
# 両方のノードで実行
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ヘッドードの起動
```bash
# 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ワーカーードの起動
```bash
# 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
```
### クラスター状態の確認
```bash
# 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へのログイン
```bash
# 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のダウンロード
```bash
# コンテナ内で約330GB、時間がかかります
huggingface-cli download cerebras/MiniMax-M2.5-REAP-172B-A10B
```
---
## 推論サーバーの起動
### MiniMax-M2.5-REAP-172B用の起動コマンド
```bash
# 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` | メモリ使用率上限 |
### メモリ節約版(長文不要な場合)
```bash
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でテスト
```bash
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
}'
```
### ヘルスチェック
```bash
curl http://localhost:8000/health
```
---
## 監視とデバッグ
### Rayダッシュボード
```
http://<head-node-ip>:8265
```
### GPU使用状況の確認
```bash
# 両ノードで
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メモリ不足エラー
```bash
# 対策1: シーケンス数を減らす
--max-num-seqs 32
# 対策2: コンテキスト長を短く
--max-model-len 16384
# 対策3: メモリ使用率を下げる
--gpu-memory-utilization 0.80
```
### CUDA illegal memory access エラー
```bash
# CUDAグラフモードを変更
--compilation-config "{\"cudagraph_mode\": \"PIECEWISE\"}"
```
### Rayクラスターに接続できない
```bash
# ネットワークインターフェースの確認
ibdev2netdev
# ファイアウォールの確認
sudo ufw status
# Rayポートの開放必要な場合
sudo ufw allow 6379
sudo ufw allow 8265
```
---
## 重要な注意点
### Thinkingトークンの扱い
MiniMax-M2.5は **interleaved thinking model** です。出力に含まれる `<think>...</think>` タグは、履歴として次のリクエストに含める必要があります。
```python
# ❌ NGパターンthinkingを削除
content = response.replace(r'<think>.*?</think>', '')
# ✅ OKパターンそのまま保持
history.append({"role": "assistant", "content": response})
```
### 推奨推論パラメータ
```json
{
"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)](https://huggingface.co/cerebras/MiniMax-M2.5-REAP-172B-A10B)
- [DGX Spark vLLM公式ガイド](https://build.nvidia.com/spark/vllm/stacked-sparks)
- [MiniMax-M2 公式リポジトリ (GitHub)](https://github.com/MiniMax-AI/MiniMax-M2)
- [vLLM MiniMax-M2 デプロイガイド](https://docs.vllm.ai/projects/recipes/en/latest/MiniMax/MiniMax-M2.html)
- [REAP論文 (arXiv)](https://arxiv.org/abs/2510.13999)
---
*この記事は2026年2月時点の情報です。最新情報は各公式ドキュメントをご確認ください。*