TL;DR
- NeMo Switchyard は NVIDIA が 2026-07-01 にリリースした LLM ルーティングプロキシ(v0.1.0 Alpha)
- 「この質問は簡単だからローカルで」「これは難しいからクラウドで」を自動判定して振り分ける
- DGX Spark(ARM64)に pip 一発で入る。OpenClaw 専用ルーティングポリシーが標準搭載
- 結果: シンプルなタスクのAPI費が $0 になった
- しかし言うほど効果が出るかは貴方のやること次第
何が嬉しいのか
LLM の運用コストには構造的なムダがある。
「今日の天気は?」も「G1ヒューマノイドのトルク制約を解析して」も、同じ 550B パラメータのモデルに投げていないだろうか。前者にはローカルの 35B で十分なのに、後者と同じ API 料金を払っている。
NeMo Switchyard はこの問題を ルーティング層 で解決する。OpenAI Chat Completions 互換の API を受け取り、リクエストの複雑さを分類し、適切なバックエンドに自動振り分けする。
Classifier 自体もローカル LLM が担当するので、判定にもコストがかからない。
全体像 — DGX Spark 内で完結する部分とクラウドへ出る部分
ポイント: 🟢 緑枚内(DGX Spark)で完結する質問は API 費用が一切かからない。🟠 黄色枚(クラウド)に出るのは complex / reasoning のみ。
ルーティング判定フロー — Classifier の分岐ロジック
fail-open 設計: Classifier が迷ったら安全側(強いモデル)にフォールバック。品質を落とさない。
環境
| 項目 | 値 |
|---|---|
| ハードウェア | NVIDIA DGX Spark (GB10 Blackwell) |
| アーキテクチャ | aarch64 / ARM64 SBSA |
| OS | Ubuntu 24.04.4 LTS |
| CUDA | 13.0 / VRAM 130.6 GB |
| NeMo Switchyard | v0.1.0 Alpha |
| ローカル LLM | Qwen3.6:35b-a3b(Ollama / localhost:11434) |
| クラウド LLM | Nemotron 3 Ultra 550B(build.nvidia.com API) |
インストール — 30 秒で終わる
# Python 3.12 仮想環境
python3 -m venv ~/.venv/switchyard
source ~/.venv/switchyard/bin/activate
# インストール(ARM64 対応確認済み)
pip install "nemo-switchyard[server,cli]"
# 確認
switchyard --version
# → switchyard 0.1.0
ARM64(DGX Spark)でも x86_64 でも同じコマンド。依存関係で引っかかることはなかった。
設定 — profiles.yaml を書くだけ
~/.config/switchyard/profiles.yaml:
endpoints:
nvidia_api:
base_url: https://integrate.api.nvidia.com/v1
api_key: ${NVIDIA_API_KEY} # build.nvidia.com で取得
ollama_local:
base_url: http://localhost:11434/v1
api_key: dummy
targets:
nemotron_ultra:
endpoint: nvidia_api
model: nvidia/nemotron-3-ultra-550b-a55b
format: openai
qwen36_local:
endpoint: ollama_local
model: qwen3.6:35b-a3b
format: openai
profiles:
# 自動振り分け(メイン)
hybrid:
type: llm-routing
profile_name: openclaw # OpenClaw 向けポリシーが標準搭載
strong: nemotron_ultra # 複雑 → Nemotron 3 Ultra
weak: qwen36_local # シンプル → ローカル Qwen
classifier: qwen36_local # 振り分け判定もローカル Qwen
fallback_target_on_evict: nemotron_ultra
# 固定プロファイル(比較・デバッグ用)
ultra_direct:
type: passthrough
target: nemotron_ultra
local_only:
type: passthrough
target: qwen36_local
ポイント:
-
profile_name: openclawを指定するだけで、OpenClaw/常駐エージェント向けに最適化されたルーティング基準が適用される - 組み込みポリシーは
general(汎用)/coding_agent(コーディング)/openclaw(常駐アシスタント)の 3 種類 -
fallback_target_on_evictで分類失敗時のフォールバック先を指定(fail-open 設計)
起動
nohup switchyard serve \
--config ~/.config/switchyard/profiles.yaml \
--port 4000 \
> /tmp/switchyard.log 2>&1 &
# ヘルスチェック
curl http://localhost:4000/health
# → {"status":"ok"}
これで localhost:4000 が OpenAI 互換の振り分けプロキシとして動く。
検証 — 本当に振り分けてくれるのか
テスト①: シンプルな質問 → ローカル Qwen に振り分け
curl -s -X POST http://localhost:4000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"hybrid","messages":[{"role":"user","content":"What is 2 + 2?"}],"max_tokens":16}'
| 項目 | 結果 |
|---|---|
| ルーティング先 |
qwen3.6:35b-a3b ✅ |
| コスト | $0 |
Classifier が simple と判定 → weak ターゲットにルーティング。
テスト②: 複雑な質問 → Nemotron 3 Ultra に振り分け
curl -s -X POST http://localhost:4000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"hybrid","messages":[{"role":"user","content":"Analyze the biomechanical constraints SONIC must solve for a G1 humanoid to perform a dynamic sword dance: joint torque limits, real-time balance at 50Hz, and sim-to-real transfer gap."}],"max_tokens":64}'
| 項目 | 結果 |
|---|---|
| ルーティング先 |
nvidia/nemotron-3-ultra-550b-a55b ✅ |
| 判定カテゴリ | complex / reasoning |
Classifier が complex と判定 → strong ターゲットにルーティング。
テスト③: Nemotron 3 Ultra 直接(ベースライン確認)
curl -s -X POST http://localhost:4000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"ultra_direct","messages":[{"role":"user","content":"Say: Nemotron Ultra is online."}],"max_tokens":20}'
| 項目 | 結果 |
|---|---|
| ルーティング先 | nvidia/nemotron-3-ultra-550b-a55b |
| レスポンス | Nemotron Ultra is online. |
passthrough プロファイルなので分類なしで直接ルーティング。
追加検証 — 8 パターンで境界を探る
| # | テスト内容 | ルーティング先 | 応答時間 | 判定 |
|---|---|---|---|---|
| ④ | 超複雑推論(レイテンシ計算) | Nemotron 3 Ultra | 22.9s | ✅ |
| ⑤ | 端末構築(GR00T N1.7 インストールスクリプト) | Nemotron 3 Ultra | 30.9s | ✅ |
| ⑥ | 中程度(G1 と Go2 の違い) | Nemotron 3 Ultra | 82.7s | ⚠️ |
| ⑦ | コーディング(MuJoCo 解析 Python 関数) | Nemotron 3 Ultra | 13.0s | ✅ |
| ⑧ | 日本語複雑質問(ZMQ パイプライン設計) | Nemotron 3 Ultra | 82.4s | ✅ |
2 つの発見
発見①: ドメイン特化クエリは想定より上位にルーティングされる
テスト⑥「G1 と Go2 の違いを教えて」は、一般的なコンテキストなら medium → Qwen3.6 を期待していた。
しかし Classifier(Qwen3.6)がロボティクス文脈を認識し complex と判定、Nemotron 3 Ultra に振り分けた。
profile_name: openclaw のポリシーが「ロボティクス・AI 専門領域の質問は複雑扱い」するよう調整されている可能性がある。ドメイン特化環境では「思ったより上位モデルを使う」 傾向として認識しておくと良い。
コスト最適化を攻めたい場合は、profile_name: general に切り替えるか、custom プロファイルで閾値を調整する。
発見②: Classifier に大型モデルを使うとレイテンシが乗る
テスト⑥と⑧の応答時間が 80 秒台。これは Classifier として Qwen3.6(35B)を使っているため、振り分け判定自体に推論時間がかかっている。
改善案: Classifier を軽量モデルに分離する
targets:
classifier_fast:
endpoint: ollama_local
model: qwen3:1.7b # 1.7B で分類のみ担当
format: openai
profiles:
hybrid_fast:
type: llm-routing
profile_name: openclaw
strong: nemotron_ultra
weak: qwen36_local
classifier: classifier_fast # ← 軽量モデルに変更
fallback_target_on_evict: nemotron_ultra
精度とレイテンシのトレードオフになるが、分類タスクは入力が短いので 1.7B でも十分な精度が出る可能性がある。次回検証予定。
ルーティングの仕組み
llm-routing 方式の内部動作:
1. ユーザーリクエスト着信
2. Classifier LLM が直近の会話を要約
3. 4 カテゴリに分類:
- simple → weak(ローカル)
- medium → weak(ローカル)
- complex → strong(クラウド)
- reasoning → strong(クラウド)
4. 判定結果に基づきターゲットにプロキシ
5. 分類失敗 → fallback_target_on_evict にフォールバック
fail-open 設計なので、Classifier が落ちても strong 側にフォールバックしてサービスは止まらない。
コスト構造
| ケース | コスト |
|---|---|
| シンプル・日常タスク | $0(ローカル Qwen3.6) |
| 複雑・推論タスク | $0.50/Mtok(in) + $2.20/Mtok(out)(Nemotron 3 Ultra API) |
| Classifier 判定 | $0(ローカル Qwen3.6) |
ポイント: 日常的な質問(天気、簡単な計算、雑談)が全体の 7-8 割を占めるなら、API 費用は理論上 7-8 割削減できる。
OpenClaw との接続
Switchyard は OpenAI Chat Completions 互換なので、OpenClaw の model フィールドに http://localhost:4000/v1 をエンドポイントとして指定するだけで統合できる。
OpenClaw Agent → Switchyard (localhost:4000) → ローカル or クラウド
profile_name: openclaw が標準搭載されている時点で、NVIDIA 側が OpenClaw + DGX Spark の組み合わせを想定した設計であることが分かる。
まとめ
| やったこと | 結果 |
|---|---|
| DGX Spark に Switchyard インストール | pip 一発、ARM64 対応 |
| hybrid プロファイルで自動振り分け | simple → Qwen($0)、complex → Nemotron Ultra |
| OpenClaw 専用ポリシー確認 |
profile_name: openclaw 標準搭載 |
| 8 パターンで境界テスト | ドメイン特化は上位寄り、Classifier レイテンシは要改善 |
NeMo Switchyard はまだ v0.1.0 Alpha だが、「ローカル LLM とクラウド LLM のいいとこ取り」を yaml 1 枚で実現する という体験は、今後のマルチモデル運用の標準になる予感がある。
次回予告:
-
cascade方式(ツール実行結果シグナルによる動的ルーティング) - Classifier 軽量化(1.7B vs 35B の精度比較)
-
switchyard launch claudeで Claude Code を DGX Spark に 1 コマンドで接続する
参考リンク
- NeMo Platform(Switchyard 含む)— GitHub
- NeMo Platform ドキュメント
- NeMo Switchyard 解説 — DevelopersIO(classmethod)
- Nemotron 3 Ultra モデルカード
- build.nvidia.com — Free API Endpoints
検証環境: DGX Spark (GB10 / ARM64 / CUDA 13.0) / NeMo Switchyard v0.1.0 / 2026-07-17