diff --git a/docs-tech/dgx-spark-claude-code-local/index.md b/docs-tech/dgx-spark-claude-code-local/index.md index 0d77e6c..8b75d1d 100644 --- a/docs-tech/dgx-spark-claude-code-local/index.md +++ b/docs-tech/dgx-spark-claude-code-local/index.md @@ -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) --- diff --git a/static/scripts/dgx-spark-claude-code.sh b/static/scripts/dgx-spark-claude-code.sh new file mode 100644 index 0000000..491eed9 --- /dev/null +++ b/static/scripts/dgx-spark-claude-code.sh @@ -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 "=========================================="