mcpField
T
tao-run-on-brev

tao-run-on-brev

github.com/nvidiaクラウド・DevOps3.8k1.6k 回インストール今日更新
リポジトリ

tao-run-on-brev について

tao-run-on-brev は、NVIDIA Brev の GPU インスタンスで TAO コンテナジョブを実行するスキルです。コンテナの実行とジョブ管理を担い、インスタンスのプロビジョニングは Brev のスキルまたは MCP サーバーに委ねます。

主な機能

  1. 01brev exec による TAO コンテナ実行
  2. 02ジョブの送信、状態確認、ログ取得、キャンセル
  3. 03tao-run-on-docker へのコンテナ操作の委譲
  4. 04TAO ジョブ状態の記録
  5. 05終了時の一時インスタンス削除

活用シーン

  1. 01接続可能な Brev インスタンスへの TAO ジョブ送信
  2. 02コンテナジョブの状態とログの確認
  3. 03ジョブのキャンセルと一時インスタンスの削除
  4. 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.md
skill-card.md
skill.oms.sig
config/
skillspector-baseline.yaml
evals/
evals.json
references/
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 はインスタンス内で動作します。

コメント