Update: Claude Code記事を200K対応に更新 + ワンライナー追加
All checks were successful
Deploy Docusaurus Site / deploy (push) Successful in 26s
All checks were successful
Deploy Docusaurus Site / deploy (push) Successful in 26s
This commit is contained in:
parent
6364d215c6
commit
8a5a873587
@ -1,7 +1,7 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
title: DGX SparkでClaude Codeをローカルモデルで動かす
|
||||
description: DGX Spark上でQwen3-Coder-Next-FP8をvLLM経由でClaude Codeのバックエンドとして使う方法
|
||||
description: DGX Spark上でQwen3-Coder-Next-FP8をvLLM経由でClaude Codeのバックエンドとして使う方法(200Kコンテキスト対応)
|
||||
hide_table_of_contents: false
|
||||
displayed_sidebar: null
|
||||
---
|
||||
@ -18,6 +18,16 @@ Claude Codeをローカルで動かすメリット:
|
||||
|
||||
この記事では、DGX Spark上でQwen3-Coder-Next-FP8を使ってClaude Codeを動かす方法を解説する。
|
||||
|
||||
## ワンライナーセットアップ
|
||||
|
||||
```bash
|
||||
curl -sL https://docs.techswan.online/scripts/dgx-spark-claude-code.sh | bash
|
||||
```
|
||||
|
||||
:::tip
|
||||
初回はモデルロードに約10分かかる。スクリプトは完了まで待機する。
|
||||
:::
|
||||
|
||||
## 構成
|
||||
|
||||
```
|
||||
@ -38,21 +48,11 @@ Claude Codeをローカルで動かすメリット:
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**なぜプロキシが必要?**
|
||||
- Claude Code → Anthropic Messages API
|
||||
- vLLM → OpenAI互換API
|
||||
## 手動セットアップ
|
||||
|
||||
フォーマットが異なるため、**claude-code-proxy**で変換する。
|
||||
### Step 1: vLLMでQwen3-Coder-Next-FP8を起動
|
||||
|
||||
## 前提条件
|
||||
|
||||
- DGX Spark(128GB統合メモリ)
|
||||
- Docker
|
||||
- Node.js 22+
|
||||
|
||||
## Step 1: vLLMでQwen3-Coder-Next-FP8を起動
|
||||
|
||||
```bash title="vLLM起動コマンド"
|
||||
```bash title="vLLM起動(200Kコンテキスト)"
|
||||
docker run -d --name qwen3-coder-next-fp8 \
|
||||
--gpus all \
|
||||
-p 8000:8000 \
|
||||
@ -61,8 +61,8 @@ docker run -d --name qwen3-coder-next-fp8 \
|
||||
nvcr.io/nvidia/vllm:25.11-py3 \
|
||||
vllm serve Qwen/Qwen3-Coder-Next-FP8 \
|
||||
--served-model-name qwen3-coder-next \
|
||||
--max-model-len 32768 \
|
||||
--max-num-seqs 32 \
|
||||
--max-model-len 200000 \
|
||||
--max-num-seqs 8 \
|
||||
--gpu-memory-utilization 0.85 \
|
||||
--enable-auto-tool-choice \
|
||||
--tool-call-parser qwen3_xml \
|
||||
@ -73,42 +73,23 @@ docker run -d --name qwen3-coder-next-fp8 \
|
||||
|
||||
| パラメータ | 値 | 説明 |
|
||||
|-----------|-----|------|
|
||||
| `--served-model-name` | `qwen3-coder-next` | モデル名(`/`を含めない) |
|
||||
| `--enable-auto-tool-choice` | - | Tool Calling有効化 |
|
||||
| `--tool-call-parser` | `qwen3_xml` | **Qwen3専用パーサー**(重要!) |
|
||||
| `--max-model-len` | `200000` | 200Kコンテキスト |
|
||||
| `--max-num-seqs` | `8` | 同時リクエスト数(メモリ節約) |
|
||||
| `--tool-call-parser` | `qwen3_xml` | **Qwen3専用パーサー** |
|
||||
|
||||
:::danger tool-call-parserに注意
|
||||
`--tool-call-parser hermes` ではなく **`qwen3_xml`** を使うこと!
|
||||
hermesだとTool Callingのフォーマットが崩れてClaude Codeが止まる。
|
||||
:::
|
||||
|
||||
### 起動確認
|
||||
### Step 2: claude-code-proxyをセットアップ
|
||||
|
||||
```bash
|
||||
# ヘルスチェック
|
||||
curl http://localhost:8000/health
|
||||
|
||||
# モデル一覧
|
||||
curl http://localhost:8000/v1/models
|
||||
```
|
||||
|
||||
初回起動は約10分かかる(45GBのモデルをロード)。
|
||||
|
||||
## Step 2: claude-code-proxyをセットアップ
|
||||
|
||||
### インストール
|
||||
|
||||
```bash
|
||||
# リポジトリをクローン
|
||||
git clone https://github.com/fuergaosi233/claude-code-proxy.git
|
||||
cd claude-code-proxy
|
||||
|
||||
# 依存関係をインストール
|
||||
pip install -r requirements.txt --user
|
||||
```
|
||||
|
||||
### 設定ファイル
|
||||
|
||||
```bash title=".env作成"
|
||||
cat > .env << 'EOF'
|
||||
OPENAI_BASE_URL=http://localhost:8000/v1
|
||||
@ -121,27 +102,11 @@ MAX_TOKENS_LIMIT=8192
|
||||
EOF
|
||||
```
|
||||
|
||||
### プロキシ起動
|
||||
|
||||
```bash
|
||||
python start_proxy.py
|
||||
```
|
||||
|
||||
### 動作確認
|
||||
|
||||
```bash
|
||||
curl http://localhost:8082/v1/messages \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "x-api-key: dummy" \
|
||||
-d '{"model": "claude-3-5-sonnet-20241022", "max_tokens": 100, "messages": [{"role": "user", "content": "Hello"}]}'
|
||||
```
|
||||
|
||||
## Step 3: Claude Codeを起動
|
||||
|
||||
:::tip ANTHROPIC_AUTH_TOKEN
|
||||
`ANTHROPIC_AUTH_TOKEN` は**設定しない**こと!
|
||||
両方設定するとAuth conflictエラーが出る。
|
||||
:::
|
||||
### Step 3: Claude Codeを起動
|
||||
|
||||
```bash
|
||||
ANTHROPIC_BASE_URL=http://localhost:8082 \
|
||||
@ -149,6 +114,10 @@ ANTHROPIC_API_KEY=dummy \
|
||||
claude
|
||||
```
|
||||
|
||||
:::tip ANTHROPIC_AUTH_TOKEN
|
||||
`ANTHROPIC_AUTH_TOKEN` は**設定しない**こと!両方設定するとAuth conflictエラーが出る。
|
||||
:::
|
||||
|
||||
### シェル設定に追加(推奨)
|
||||
|
||||
```bash title="~/.bashrc"
|
||||
@ -159,24 +128,16 @@ alias claude-local='ANTHROPIC_BASE_URL=http://localhost:8082 ANTHROPIC_API_KEY=d
|
||||
|
||||
| 項目 | 値 |
|
||||
|------|-----|
|
||||
| プロンプト処理 | ~1900 tokens/s |
|
||||
| 生成速度 | ~6 tokens/s |
|
||||
| プロンプト処理 | ~2300 tokens/s |
|
||||
| 生成速度 | ~20-30 tokens/s |
|
||||
| メモリ使用量 | ~84GB / 119GB |
|
||||
| KVキャッシュ | 26GB(32Kコンテキスト) |
|
||||
|
||||
### 動作確認済み機能
|
||||
|
||||
- ✅ チャット応答
|
||||
- ✅ ストリーミング
|
||||
- ✅ Tool Calling(Bash実行、ファイル操作)
|
||||
- ✅ 日本語対応
|
||||
| 最大コンテキスト | **200K tokens** |
|
||||
| 同時リクエスト | 8 |
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
### Tool Callingで止まる
|
||||
|
||||
**原因:** `--tool-call-parser` の設定が間違っている
|
||||
|
||||
```bash
|
||||
# ❌ 間違い
|
||||
--tool-call-parser hermes
|
||||
@ -187,42 +148,25 @@ alias claude-local='ANTHROPIC_BASE_URL=http://localhost:8082 ANTHROPIC_API_KEY=d
|
||||
|
||||
### Auth conflict エラー
|
||||
|
||||
```
|
||||
Auth conflict: Both a token (ANTHROPIC_AUTH_TOKEN) and an API key (ANTHROPIC_API_KEY) are set.
|
||||
```
|
||||
|
||||
**対処:**
|
||||
```bash
|
||||
unset ANTHROPIC_AUTH_TOKEN
|
||||
```
|
||||
|
||||
### 文字化け
|
||||
### max_tokens エラー
|
||||
|
||||
```bash
|
||||
LANG=en_US.UTF-8 claude
|
||||
```
|
||||
|
||||
### vLLMが404を返す
|
||||
|
||||
vLLMはAnthropic API未実装のため、claude-code-proxyを使う。
|
||||
入力が長すぎて出力枠がない場合、プロキシの `MAX_TOKENS_LIMIT` を下げる。
|
||||
|
||||
## まとめ
|
||||
|
||||
DGX SparkでClaude Codeをローカルモデルで動かすポイント:
|
||||
|
||||
1. **vLLM** + **Qwen3-Coder-Next-FP8**を起動
|
||||
2. **`--tool-call-parser qwen3_xml`** を使う(重要!)
|
||||
1. **vLLM** + **Qwen3-Coder-Next-FP8**を起動(200K対応)
|
||||
2. **`--tool-call-parser qwen3_xml`** を使う
|
||||
3. **claude-code-proxy**でAPI変換
|
||||
4. **`ANTHROPIC_AUTH_TOKEN`は設定しない**
|
||||
|
||||
これでプライベートなコーディング環境の完成!🎉
|
||||
|
||||
## 参考リンク
|
||||
|
||||
- [vLLM Claude Code統合](https://docs.vllm.ai/en/latest/serving/integrations/claude_code/)
|
||||
- [vLLM Tool Calling](https://docs.vllm.ai/en/latest/features/tool_calling/)
|
||||
- [claude-code-proxy](https://github.com/fuergaosi233/claude-code-proxy)
|
||||
- [Qwen3-Coder-Next-FP8](https://huggingface.co/Qwen/Qwen3-Coder-Next-FP8)
|
||||
|
||||
---
|
||||
|
||||
|
||||
95
static/scripts/dgx-spark-claude-code.sh
Normal file
95
static/scripts/dgx-spark-claude-code.sh
Normal file
@ -0,0 +1,95 @@
|
||||
#!/bin/bash
|
||||
# DGX Spark Claude Code ローカル実行スクリプト
|
||||
# Usage: curl -sL https://docs.techswan.online/scripts/dgx-spark-claude-code.sh | bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 DGX Spark Claude Code セットアップ"
|
||||
echo ""
|
||||
|
||||
# Step 1: vLLM起動
|
||||
echo "📦 Step 1: vLLM + Qwen3-Coder-Next-FP8 起動..."
|
||||
docker stop qwen3-coder-next-fp8 2>/dev/null || true
|
||||
docker rm qwen3-coder-next-fp8 2>/dev/null || true
|
||||
|
||||
docker run -d --name qwen3-coder-next-fp8 \
|
||||
--gpus all \
|
||||
-p 8000:8000 \
|
||||
-v ~/.cache/huggingface:/root/.cache/huggingface \
|
||||
--ipc=host \
|
||||
nvcr.io/nvidia/vllm:25.11-py3 \
|
||||
vllm serve Qwen/Qwen3-Coder-Next-FP8 \
|
||||
--served-model-name qwen3-coder-next \
|
||||
--max-model-len 200000 \
|
||||
--max-num-seqs 8 \
|
||||
--gpu-memory-utilization 0.85 \
|
||||
--enable-auto-tool-choice \
|
||||
--tool-call-parser qwen3_xml \
|
||||
--trust-remote-code
|
||||
|
||||
echo " コンテナ起動完了(モデルロードに約10分かかります)"
|
||||
echo ""
|
||||
|
||||
# Step 2: claude-code-proxy セットアップ
|
||||
echo "🔧 Step 2: claude-code-proxy セットアップ..."
|
||||
PROXY_DIR="$HOME/.claude-code-proxy"
|
||||
|
||||
if [ ! -d "$PROXY_DIR" ]; then
|
||||
git clone https://github.com/fuergaosi233/claude-code-proxy.git "$PROXY_DIR"
|
||||
fi
|
||||
|
||||
cd "$PROXY_DIR"
|
||||
pip install -r requirements.txt --user --quiet 2>/dev/null || pip install -r requirements.txt --user --break-system-packages --quiet
|
||||
|
||||
cat > .env << 'EOF'
|
||||
OPENAI_BASE_URL=http://localhost:8000/v1
|
||||
OPENAI_API_KEY=dummy
|
||||
BIG_MODEL=qwen3-coder-next
|
||||
MIDDLE_MODEL=qwen3-coder-next
|
||||
SMALL_MODEL=qwen3-coder-next
|
||||
REQUEST_TIMEOUT=300
|
||||
MAX_TOKENS_LIMIT=8192
|
||||
EOF
|
||||
|
||||
echo " プロキシ設定完了"
|
||||
echo ""
|
||||
|
||||
# Step 3: プロキシ起動
|
||||
echo "🌐 Step 3: プロキシ起動..."
|
||||
pkill -f start_proxy.py 2>/dev/null || true
|
||||
nohup python3 start_proxy.py > /tmp/proxy.log 2>&1 &
|
||||
sleep 3
|
||||
|
||||
if curl -s http://localhost:8082/health > /dev/null 2>&1; then
|
||||
echo " プロキシ起動完了 (port 8082)"
|
||||
else
|
||||
echo " ⚠️ プロキシ起動中... (数秒待ってください)"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Step 4: vLLMヘルスチェック待ち
|
||||
echo "⏳ Step 4: vLLM起動待ち..."
|
||||
echo " (モデルロード中... 約10分かかります)"
|
||||
echo ""
|
||||
|
||||
while ! curl -s http://localhost:8000/health > /dev/null 2>&1; do
|
||||
sleep 10
|
||||
echo -n "."
|
||||
done
|
||||
echo ""
|
||||
echo " ✅ vLLM起動完了!"
|
||||
echo ""
|
||||
|
||||
# 完了メッセージ
|
||||
echo "=========================================="
|
||||
echo "🎉 セットアップ完了!"
|
||||
echo ""
|
||||
echo "Claude Codeを起動するには:"
|
||||
echo ""
|
||||
echo " ANTHROPIC_BASE_URL=http://localhost:8082 ANTHROPIC_API_KEY=dummy claude"
|
||||
echo ""
|
||||
echo "または ~/.bashrc に追加:"
|
||||
echo ""
|
||||
echo " alias claude-local='ANTHROPIC_BASE_URL=http://localhost:8082 ANTHROPIC_API_KEY=dummy claude'"
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
Loading…
x
Reference in New Issue
Block a user