リモートアクセスしているDGX SparkでのNemoClawのセットアップ
はじめに
NVIDIA が公開している AI エージェントフレームワーク NemoClaw を、Tailscaleを使ってリモートアクセスしているDGX Spark 上にセットアップしました。公式の手順(spark-install.md)に従ってインストールを進めたところ、いくつかのトラブルに遭遇したので、解決方法とともに共有します。
環境
- ハードウェア: NVIDIA DGX Spark(ARM / aarch64)
- GPU: 1基、VRAM 124,610 MB
- OS: Ubuntu(Docker + cgroup v2 構成済み)
-
推論エンドポイント: vLLM で
Intel/Qwen3.5-122B-A10B-int4-AutoRoundをホスト(Tailscale 経由で別マシンから提供) - リモートアクセス: Tailscale SSH
NemoClaw / OpenShell とは
NemoClaw は NVIDIA が開発した AI エージェントフレームワークで、OpenShell というコンテナサンドボックス基盤の上で動作します。OpenShell は軽量 Kubernetes(K3s)ベースのローカルゲートウェイを立ち上げ、Docker コンテナ内にセキュアなサンドボックス環境を構築する CLI ツールです。
インストール手順
公式手順に沿った基本的な流れは以下の通りです。
# OpenShell CLI のインストール
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh
# NemoClaw リポジトリのクローン
git clone https://github.com/NVIDIA/NemoClaw.git
cd NemoClaw
# DGX Spark 用の Docker 設定
sudo ./scripts/setup-spark.sh
# インストール(Node.js導入 → NemoClaw CLI ビルド → Onboarding)
./install.sh
Onboarding では推論プロバイダーの選択、サンドボックスの作成、ダッシュボードの起動が行われます。サンドボックス名はデフォルトの”my-assistant”にしています。推論プロバイダーの選択ではオフィスの他のDGX Spark2台でホストしているQwen3.5-122B-A10Bの量子化モデルのローカルエンドポイントURLとモデル名(”Intel/Qwen3.5-122B-A10B-int4-AutoRound”)を指定しました。
ハマりどころ① — ダッシュボードのポートフォワード問題
インストールの最後に以下のメッセージが表示されて止まりました。
Waiting for NemoClaw dashboard to become ready...
Dashboard taking longer than expected to start. Continuing...
! No active forward found for port 18789
原因
NemoClaw のダッシュボード(OpenClaw Gateway)はサンドボックス内部の 127.0.0.1:18789 で動作しています。ホスト側にポートフォワードが確立されていないと、外部からアクセスできません。
解決策
openshell forward コマンドでサンドボックス内のポートをホスト側に転送します。
openshell forward start 18789 my-assistant
状態確認に使えるコマンド
# サンドボックスの一覧と状態
openshell sandbox list
# サンドボックスの詳細ステータス
nemoclaw my-assistant status
# サンドボックスのログ
nemoclaw my-assistant logs
# サンドボックスに入る
nemoclaw my-assistant connect
# サンドボックス内でポートのリッスン状態を確認(ps や ss がない場合)
cat /proc/net/tcp
/proc/net/tcp のローカルアドレスは16進数なので、0x4965 = 18789 のように変換して読む必要があります。
ハマりどころ② — Tailscale 経由でのアクセス
DGX Spark に Tailscale SSH で接続している場合、通常の SSH ポートフォワード(ssh -L)が使えないことがあります。
commandline disabled
このメッセージが出た場合、Tailscale SSH はポートフォワードを無効にしています。
解決策
openshell forward でホスト側の 127.0.0.1:18789 にフォワードした後、socat で Tailscale の IP アドレスにバインドします。
# ホスト側でポートフォワードを設定
openshell forward start 18789 my-assistant
# socat で Tailscale アドレスに転送
socat TCP-LISTEN:18789,bind=<TailscaleのIP>,reuseaddr,fork TCP:127.0.0.1:18789 &
ハマりどころ③ — origin not allowed エラー
ブラウザからダッシュボードにアクセスすると、以下のエラーが表示されました。
origin not allowed (open the Control UI from the gateway host or allow it in gateway.controlUi.allowedOrigins)
原因
OpenClaw の設定ファイル(/sandbox/.openclaw/openclaw.json)の allowedOrigins に http://127.0.0.1:18789 しか登録されておらず、Tailscale の IP アドレスからのアクセスが拒否されていました。
解決策
サンドボックス内の設定ファイルはセキュリティのため読み取り専用になっているので、サンドボックスを再作成する必要があります。CHAT_UI_URL 環境変数で許可するオリジンを指定します。
# サンドボックスを削除
nemoclaw my-assistant destroy --yes
# ロックファイルが残っている場合は削除
rm -f ~/.nemoclaw/onboard.lock
# CHAT_UI_URL を指定して再セットアップ
cd ~/work/NemoClaw
CHAT_UI_URL=http://<TailscaleのIP>:18789 nemoclaw onboard
ハマりどころ④ — 認証エラー(too many failed authentication attempts)
ダッシュボードに何度かトークンなしでアクセスすると、レートリミットに引っかかります。
unauthorized: too many failed authentication attempts (retry later)
解決策
- まず認証トークンを取得します。
nemoclaw my-assistant connect
python3 -c "import json; cfg=json.load(open('/sandbox/.openclaw/openclaw.json')); print(cfg.get('gateway',{}).get('auth',{}).get('token',''))"
exit
- 数分待ってからレートリミットが解除されたら、トークン付き URL でアクセスします。
http://<TailscaleのIP>:18789/#token=<取得したトークン>
- シークレットウィンドウ(プライベートブラウジング)を使うと、ブラウザのキャッシュによる問題を回避できます。
以上のプロセスを経て、無事UIにアクセスできました。
まとめ
NemoClaw on DGX Spark のセットアップで遭遇した主なトラブルと対処法をまとめます。
| トラブル | 原因 | 対処法 |
|---|---|---|
| ポートフォワードが確立されない | サンドボックス内ポートがホストに転送されていない | openshell forward start 18789 my-assistant |
| Tailscale 経由でアクセスできない | localhost のみバインド+SSH フォワード無効 |
socat で Tailscale IP に転送 |
| origin not allowed | allowedOrigins に Tailscale IP が未登録 |
CHAT_UI_URL を指定してサンドボックスを再作成 |
| too many failed auth attempts | トークンなしアクセスでレートリミット | トークン付き URL でアクセス、数分待つ |
リモート(Tailscale 等)から DGX Spark にアクセスする場合、最初から CHAT_UI_URL を正しく設定しておくことが最大のポイントです。これさえ押さえておけば、ほとんどのトラブルを回避できます。
Discussion