mcpField
T
tao-run-on-brev

tao-run-on-brev

github.com/nvidia云与 DevOps3.8k1.6k 次安装今天更新
代码仓库

关于 tao-run-on-brev

tao-run-on-brev 是将 TAO 容器任务运行在 NVIDIA Brev GPU 实例上的技能,面向已能访问目标实例的 TAO 工作流。它负责容器任务执行与状态管理,不负责实例的创建和配置。

主要功能

  1. 01通过 brev exec 运行 TAO 容器
  2. 02提交、查看状态与日志、取消任务
  3. 03调用 tao-run-on-docker 的容器流程
  4. 04记录 TAO 作业状态
  5. 05清理临时实例以停止计费

适用场景

  1. 01在可访问的 Brev 实例上提交 TAO 任务
  2. 02查看容器任务状态和日志
  3. 03取消任务并清除临时实例
  4. 04运行单实例多 GPU 任务

安装

复制下面的命令,在终端中运行。

$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 skill bank 插件初始化的,请先运行 tao-setup 技能(主机预检、凭据、跨技能发现)。

NVIDIA Brev 提供按需 GPU 实例(预装 NVIDIA 驱动程序、 CUDA、Docker 和 NVIDIA Container Toolkit)。Brev 基于实例:你 创建一个实例,通过 brev exec 在其上运行命令,完成后将其删除。

此技能有意保持精简。创建、搜索 GPU/价格、启动/停止、删除和登录等实例的配置与管理,均由 NVIDIA Brev 自带的 Agent 技能负责,本技能不重复实现。 此技能只涵盖 TAO 专属部分: 在已连接的实例上运行 TAO 容器,并通过 brev exec 将容器操作方式交由 tao-run-on-docker 处理,遵循四动词 Docker 合约。

配置实例:使用官方 Brev 技能或 MCP

NVIDIA Brev 发布了一项 Agent 技能,可以通过自然语言管理实例 (“创建一个 A100 实例”、“搜索每小时低于 $3 的 GPU”、“停止我的所有实例”)。安装一次即可——它会自动注册到 Agent 的技能目录中,并在运行时被发现:

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)。 两者都负责处理登录/身份验证相关细节、placement ID、GPU 搜索和清理标志。 它们不负责实例上的容器执行——这由本技能负责。

本技能的预检: brev CLI 位于 PATH 中且已登录(无头模式: 在任何其他调用前运行 brev login --token "$BREV_API_TOKEN"),并且可以连接目标实例——先运行一个两个单词的命令进行轮询,直到成功,再执行实际工作(新实例会先报告 RUNNING,而 sshd 尚未启动):

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; }

探测命令必须是两个单词,并作为一个参数加引号。单令牌探测 (brev exec <instance> -- true)即使所有实际命令都失败也会通过, 因为 brev exec [instance...] <command> 只将最后一个位置参数视为命令——因此单独的 true 会碰巧落在正确的位置,而 docker run ... 则不会。请参阅下文的 brev exec 参数形式。

新实例上的首次 brev exec 请预留 ≥ 600 s(SSH 启动 + 首次拉取容器);60–120 s 的包装器超时会截断启动过程,看起来像是虚假的 exec failed。

存储

没有共享 NFS/Lustre——通过 tao-data-io 使用 B/C 级存储:将输入从 S3 暂存到实例的本地磁盘(或在容器内获取),并且在删除实例之前将结果上传到 S3。实例本地的 ~/ 在停止/启动后仍会保留,但 删除/创建后不会保留,因此必须在清理实例前上传结果。

执行——四个动词(基于 Docker 的组合)

Brev 是一个组合式使用方:submit 连接到实例,然后通过 brev exec 将容器操作方式交由四个 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 参数形式

远程命令是一个参数。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 显示的完全一致。

每个实例只需进行一次 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(最多 8× H100 / A100 / L40S);torchrun --nproc-per-node=N 或 PyTorch DDP 可在实例内运行。

评论

支持 Markdown