0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NVIDIAが作った「LLMの仕分け人」NeMo Switchyard — DGX Sparkでローカル×クラウド自動振り分けを構築した

0
Last updated at Posted at 2026-07-17

TL;DR

  • NeMo Switchyard は NVIDIA が 2026-07-01 にリリースした LLM ルーティングプロキシ(v0.1.0 Alpha)
  • 「この質問は簡単だからローカルで」「これは難しいからクラウドで」を自動判定して振り分ける
  • DGX Spark(ARM64)に pip 一発で入る。OpenClaw 専用ルーティングポリシーが標準搭載
  • 結果: シンプルなタスクのAPI費が $0 になった
  • しかし言うほど効果が出るかは貴方のやること次第
    image.png

何が嬉しいのか

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 コマンドで接続する

参考リンク


検証環境: DGX Spark (GB10 / ARM64 / CUDA 13.0) / NeMo Switchyard v0.1.0 / 2026-07-17

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?