tao-run-on-brev について
tao-run-on-brev は、NVIDIA Brev の GPU インスタンスで TAO コンテナジョブを実行するスキルです。コンテナの実行とジョブ管理を担い、インスタンスのプロビジョニングは Brev のスキルまたは MCP サーバーに委ねます。
主な機能
- 01brev exec による TAO コンテナ実行
- 02ジョブの送信、状態確認、ログ取得、キャンセル
- 03tao-run-on-docker へのコンテナ操作の委譲
- 04TAO ジョブ状態の記録
- 05終了時の一時インスタンス削除
活用シーン
- 01接続可能な Brev インスタンスへの TAO ジョブ送信
- 02コンテナジョブの状態とログの確認
- 03ジョブのキャンセルと一時インスタンスの削除
- 04単一インスタンスでのマルチ GPU 実行
MCP 対応
このスキル自体は MCP サーバーを公開しません。インスタンスのプロビジョニングと管理には Brev MCP サーバーを利用でき、コンテナ実行は brev exec を通じて別途行います。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ nvidia/ skills --skill tao-run-on-brevインストール後、Claude Code で/tao-run-on-brevを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
BENCHMARK.mdskill-card.mdskill.oms.sigconfig/skillspector-baseline.yamlevals/evals.jsonreferences/skill_info.yaml詳細
Brev — TAO 実行用グルー
単独でインストールする場合 このセッションが TAO スキルバンクのプラグインによって初期化されていない場合は、まず
tao-setupスキルを実行してください(ホストの事前チェック、認証情報、スキル間の検出)。
NVIDIA Brev は、NVIDIA ドライバー、CUDA、Docker、NVIDIA Container Toolkit がプリロードされたオンデマンド GPU インスタンスを提供します。Brev はインスタンスベースです。インスタンスをプロビジョニングし、brev exec 経由でそのインスタンス上でコマンドを実行し、完了したら削除します。
このスキルは意図的に薄く作られています。インスタンスのプロビジョニングと管理(作成、GPU/価格での検索、起動/停止、削除、ログイン)は、NVIDIA Brev 専用のエージェントスキルが担当し、ここでは重複して扱いません。 このスキルが扱うのは TAO 固有の部分のみです。到達可能なインスタンス上で TAO コンテナを実行する処理は、4 動詞の Docker 契約を通じて行い、コンテナの実行方法は brev exec 経由で tao-run-on-docker に委ねます。
プロビジョニング:公式 Brev スキルまたは MCP を使用する
NVIDIA Brev は、自然言語でインスタンスを管理するエージェントスキル(「A100 インスタンスを作成」「3 ドル/時未満の GPU を検索」「自分の全インスタンスを停止」)を公開しています。一度インストールすれば、エージェントのスキルディレクトリに自動登録され、実行時に検出されます。
curl -fsSL https://raw.githubusercontent.com/brevdev/brev-cli/main/scripts/install-agent-skill.sh | bash
# installs to ~/.claude/skills/brev-cli/ , ~/.codex/skills/brev-cli/ , ~/.agents/skills/brev-cli/
または、Brev MCP サーバー(https://docs.nvidia.com/brev/_mcp/server)に接続します。どちらも、ログイン/認証に関する特有の処理、配置 ID、GPU の検索、終了時のフラグを担当します。ただし、インスタンス上でのコンテナ実行は対象外です。これはこのスキルの担当です。
このスキルの事前チェック: brev CLI が PATH 上にあり、ログイン済みであること(ヘッドレス環境では、ほかの呼び出しを行う前に brev login --token "$BREV_API_TOKEN" を実行します)。また、対象インスタンスに到達できることを確認してください。実際の処理を行う前に、2 語のコマンドで成功するまでポーリングします(新しいインスタンスは、sshd が起動する前に RUNNING を報告します)。
for i in $(seq 1 60); do brev exec <instance> "echo ok" 2>/dev/null | grep -qx ok && break; sleep 5; done
brev exec <instance> "echo ok" 2>/dev/null | grep -qx ok || { echo "instance not exec-ready"; exit 1; }
プローブは2 語で、1 つの引数として引用符で囲む必要があります。単一トークンのプローブ(brev exec <instance> -- true)は、実際のコマンドがすべて壊れていても成功します。これは brev exec [instance...] <command> が最後の位置引数だけをコマンドとして扱うためです。単独の true はたまたま正しい位置に収まりますが、docker run ... はそうなりません。詳しくは、下記の brev exec の引数形式を参照してください。
新しいインスタンスで最初に brev exec を実行する場合は、600 秒以上確保してください(SSH の起動と初回のコンテナプル)。ラッパーのタイムアウトが 60~120 秒だと起動が中断され、誤って exec failed のように見えます。
ストレージ
共有 NFS/Lustre はありません。tao-data-io 経由のストレージ階層はB/Cです。入力を S3 からインスタンスのローカルディスクにステージングする(またはコンテナ内で取得する)とともに、インスタンスを削除する前に結果を S3 にアップロードしてください。インスタンスのローカル ~/ は停止/起動をまたいで保持されますが、削除/作成をまたいでは保持されません。そのため、終了処理より先に結果をアップロードする必要があります。
実行 — 4 つの動詞(Docker 上の複合処理)
Brev は複合コンシューマーです。submit がインスタンスに到達し、その後、brev exec 経由で実行される4 つの Docker 動詞(tao-run-on-docker)にコンテナの実行方法を委ねます。対称的なピアではありません。課金を止めるには、終了時にインスタンスも削除する必要があります。$BANK = ${TAO_SKILL_BANK_PATH}。
-
submit — インスタンスに到達します(公式 Brev スキルまたは MCP を使用してプロビジョニング/再利用し、既存のインスタンスは
instance_idで再利用し、上記の手順で準備完了を待ちます)。組み立てたコマンドをリントし、起動前にレコードを開いて$JOB_IDを発行し、その後、インスタンス内で Docker のsubmit動詞を実行して RUNNING に設定します。redact_secrets.py lint <<<"$REMOTE_CMD" # no inline secrets; creds as -e VAR JOB_ID=$("$BANK/scripts/tao_job_record.py" open \ --platform brev --image "$IMG" \ --network-arch "$ARCH" --action "$ACTION" \ --storage-tier "$TIER" --results-root "$RESULTS_ROOT") brev exec <instance> "docker inspect '$JOB_ID' >/dev/null 2>&1 && { echo '$JOB_ID already submitted'; exit 0; }; docker run -d --name '$JOB_ID' --label 'tao-job=$JOB_ID' ..." "$BANK/scripts/tao_job_record.py" mark "$JOB_ID" --state RUNNING \ --backend-ref "<instance>/$JOB_ID" # instance is part of the ref: the # container is unreachable without it -
status / logs —
brev exec <instance> "docker inspect $JOB_ID"/brev exec <instance> "docker logs $JOB_ID"を実行し、Docker の動詞と同じ語彙に正確に対応付けます。レコードのbackend-refから<instance>を取得します。 -
cancel / teardown — コンテナを削除し、次に一時インスタンスの場合は削除して課金を停止し、その後レコードを更新します。一時インスタンスを稼働状態のまま残さないでください。
brev exec <instance> "docker rm -f $JOB_ID" brev delete <instance> # ephemeral instances only "$BANK/scripts/tao_job_record.py" mark "$JOB_ID" --state CANCELED --source agent
brev exec の引数形式
リモートコマンドは1つの引数です。CLI のシグネチャは
brev exec [instance...] <command> です。最後の位置引数以外はすべてインスタンス名として扱われ、
-- はフラグの解析を終了するだけで、その後の単語をひとまとめにはしません。そのため、brev exec <inst> -- docker inspect "$JOB_ID" は
インスタンスが <inst> docker inspect、コマンドが "$JOB_ID" と解釈され、
could not look up instance "docker" / ssh: illegal option -- -(終了コード 255)で失敗します。
インスタンスや SSH の障害のように見えますが、実際は構文エラーです。brev exec --help の例のとおり、
リモートコマンド全体を1つの文字列として引用符で囲んでください。
インスタンスごとの NGC 認証は一度だけ行ってください。NGC_KEY を argv に指定しないでください(リモートプロセスの一覧に残ります)。--password-stdin にパイプで渡してください。
IMG=nvcr.io/nvidia/tao/tao-toolkit:7.3.0-pyt # versions-key: images.tao_toolkit.pyt
# NGC auth (one-time per instance) — value never on argv.
# Single-quoted locally so $NGC_KEY expands in the instance's shell; export it
# there first (or pipe it in from the local shell, if the instance has no copy).
brev exec <instance> 'printf %s "$NGC_KEY" | docker login nvcr.io -u "$oauthtoken" --password-stdin'
# Verify auth without reading ~/.docker/config.json. Failure before a successful
# login = not authenticated; failure after = the key's org lacks entitlement.
brev exec <instance> "docker manifest inspect $IMG >/dev/null && echo AUTH_OK || echo AUTH_FAIL"
# Pull BEFORE the GPU run. `docker run` would pull implicitly, but the instance
# bills from boot, so a multi-GB first-time TAO pull is billed GPU-idle time.
# Pulling as its own step also separates a pull failure (auth/entitlement) from
# a training failure in the logs.
brev exec <instance> "docker image inspect $IMG >/dev/null 2>&1 || docker pull $IMG"
# Run a TAO job (the docker `submit` verb, over brev exec)
brev exec <instance> "docker inspect '$JOB_ID' >/dev/null 2>&1 && { echo '$JOB_ID already submitted'; exit 0; }; docker run -d --name '$JOB_ID' --label 'tao-job=$JOB_ID' --gpus all -v ~/data:/data -e NGC_KEY '$IMG' visual_changenet train -e /data/spec.yaml"
マルチ GPU とマルチノード
Brev ではマルチノードはサポートされていません。インスタンス単位で動作し、インスタンス間の調整には対応していません。単一インスタンス内のマルチ GPU はサポートされています(H100 / A100 / L40S を最大 8 基)。torchrun --nproc-per-node=N や PyTorch DDP はインスタンス内で動作します。