mcpField
V
vast-gpu

vast-gpu

github.com/wanshuiyin云与 DevOps18.2k460 次安装4 天前更新
代码仓库

关于 vast-gpu

vast-gpu 是用于估算 GPU 需求、筛选 vast.ai 报价并管理实例的技能,涵盖配置到销毁流程。它面向需要租用算力的实验工作流,并在项目文件中跟踪活动实例。

主要功能

  1. 01估算 GPU、显存、磁盘和运行时长
  2. 02按总成本搜索并排序 GPU 报价
  3. 03租用并配置 GPU 实例
  4. 04同步实验代码和依赖项
  5. 05跟踪、列出和销毁实例

适用场景

  1. 01为计划中的训练任务选择 GPU
  2. 02创建实例以运行实验
  3. 03将代码和依赖部署到租用的 GPU
  4. 04销毁实例前收集结果

安装

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

$npx skills add https://github.com/wanshuiyin/auto-claude-code-research-in-sleep --skill vast-gpu

安装后在 Claude Code 中输入/vast-gpu确认已加载。

详细介绍

Vast.ai GPU 管理

管理 vast.ai GPU 实例:$ARGUMENTS

概述

按需从 vast.ai 租用价格实惠、性能强劲的 GPU。此技能会分析训练任务以确定 GPU 需求,搜索性价比最高的报价,提供包含预估总费用的选项,并处理完整生命周期:租用 → 配置 → 运行 → 销毁。

用户无需指定 GPU 型号或硬件。只需描述任务,此技能会确定需要租用什么。

前提条件: 必须安装 vastai CLI(需要 Python ≥ 3.10)并完成身份验证:

pip install vastai
vastai set api-key YOUR_API_KEY

如果系统的 Python 版本低于 3.10,请使用 Python ≥ 3.10 创建虚拟环境(例如使用 conda create、pyenv、uv venv 等),并在其中安装 vastai。

创建任何实例之前,必须先在 https://cloud.vast.ai/manage-keys/ 上传 SSH 公钥。 创建实例时会将密钥写入实例;如果在租用后添加密钥,则必须销毁并重新创建实例。

状态文件

所有运行中的 vast.ai 实例都会记录在项目根目录的 vast-instances.json 中:

[
  {
    "instance_id": 33799165,
    "offer_id": 25831376,
    "gpu_name": "RTX_3060",
    "num_gpus": 1,
    "dph": 0.0414,
    "ssh_url": "ssh://[email protected]:58955",
    "ssh_host": "1.208.108.242",
    "ssh_port": 58955,
    "created_at": "2026-03-29T21:12:00Z",
    "status": "running",
    "experiment": "exp01_baseline",
    "estimated_hours": 4.0,
    "estimated_cost": 0.17
  }
]

此文件是 /run-experiment 和 /monitor-experiment 连接 vast.ai 实例时的权威数据源。

工作流

操作:配置(默认)

分析任务,找到最合适的 GPU,并提供经过成本优化的选项。这是主要入口点,可直接调用,也可在设置 gpu: vast 时由 /run-experiment 自动调用。

步骤 1:分析任务需求

阅读可用上下文,确定任务需求:

  1. 从实验计划中(refine-logs/EXPERIMENT_PLAN.md):

    • 计算预算(GPU 总小时数)
    • 硬件提示(例如,“4x RTX 3090”)
    • 模型架构和数据集大小
    • 运行顺序和各里程碑的成本估算
  2. 从实验脚本中(如果已编写):

    • 模型大小——查找模型类、num_parameters 和配置文件
    • 批量大小、序列长度——据此估算显存
    • 数据集——根据数据集大小和轮数估算训练时间
    • 多 GPU——检查是否使用 DataParallel、DistributedDataParallel、accelerate、deepspeed
  3. 从用户描述中(如果没有计划或脚本):

    • 模型名称/大小(例如,“微调 LLaMA-7B”、“训练 ResNet-50”)
    • 数据集规模(例如,“ImageNet”、“10k 个样本”)
    • 预计时长(例如,“约 2 小时”)

步骤 2:确定 GPU 需求

根据任务分析确定:

因素估算方式
最小显存模型参数量 × 4 字节(fp32)或 × 2 字节(fp16/bf16)+ 优化器状态 + 激活值。经验值:7B 模型约需 16 GB(fp16),13B 约需 28 GB,70B 约需 140 GB(需要多 GPU)。ResNet/ViT 约需 4-8 GB。额外预留 20%。
GPU 数量默认为 1,除非:模型无法装入单个 GPU 的显存,或脚本使用 DDP/FSDP/DeepSpeed,或计划指定使用多 GPU
预计小时数采用实验计划成本列中的估算值,或按以下公式计算:(数据集大小 × 轮数)/(吞吐量 × 批量大小)。如果有用户估算,则默认采用。为设置和意外减速额外增加 30% 缓冲
最小磁盘空间20 GB 基础空间 + 模型检查点大小 + 数据集大小。默认:50 GB
CUDA 版本与 PyTorch 版本匹配。PyTorch 2.x 需要 CUDA ≥ 11.8。默认:12.1

步骤 3:搜索报价

跨多个 GPU 档位搜索,找到性价比最高的选项。始终广泛搜索,不要只限于一种 GPU 型号:

# Tier 1: Budget GPUs (good for small models, fine-tuning, ablations)
vastai search offers "gpu_ram>=<MIN_VRAM> num_gpus>=<N> reliability>0.95 inet_down>100" -o 'dph+' --storage <DISK> --limit 10

# Tier 2: If VRAM > 24 GB, also search high-VRAM cards specifically
vastai search offers "gpu_ram>=48 num_gpus>=<N> reliability>0.95" -o 'dph+' --storage <DISK> --limit 5

输出是一个表格,列包括:ID、CUDA、N(GPU 数量)、Model、PCIE、cpu_ghz、vCPUs、RAM、Disk、$/hr、DLP(深度学习性能)、score、NV Driver、Net_up、Net_down、R(可靠性 %)、Max_Days、mach_id、status、host_id、ports、country。

**第一列(ID)**是 vastai create instance 所需的报价 ID。

步骤 4:提供经过成本优化的选项

向用户提供按预计总成本排序的 3 个选项:

Task analysis:
- Model: [model name/size] → estimated VRAM: ~[X] GB
- Training: ~[Y] hours estimated
- Requirements: [N] GPU(s), ≥[X] GB VRAM, ~[Z] GB disk

Recommended options (sorted by estimated total cost):

| # | GPU          | VRAM  | $/hr   | Est. Hours | Est. Total | Reliability | Offer ID  |
|---|-------------|-------|--------|------------|------------|-------------|-----------|
| 1 | RTX 3060    | 12 GB | $0.04  | ~6h        | ~$0.25     | 99.4%       | 25831376  |  ← cheapest
| 2 | RTX 4090    | 24 GB | $0.28  | ~4h        | ~$1.12     | 99.2%       | 6995713   |  ← best value
| 3 | A100 SXM    | 80 GB | $0.95  | ~2h        | ~$1.90     | 99.5%       | 7023456   |  ← fastest

Option 1 is cheapest overall. Option 3 finishes fastest.
Pick a number (or type a different offer ID):

重要展示规则:

  • 始终显示预计总成本($/hr × 预计小时数),而不只是 $/hr
  • 更快的 GPU 预计耗时更短(按相对 FLOPS 缩放)
  • 如果低价选项的可靠性 < 0.97,则标注“预算之选——有 3% 的中断概率”
  • 如果任务较短(<1 小时),建议选择可中断定价,以进一步降低成本
  • 如果没有报价满足显存需求,请说明原因并提供替代方案(例如,多 GPU、量化)

相对速度缩放(用于估算不同 GPU 档位的耗时,近似值):

GPU相对速度(FP16)
RTX 30600.5×
RTX 30901.0×
RTX 40901.6×
A50000.9×
A60001.1×
L40S1.5×
A100 SXM2.0×
H100 SXM3.3×

使用这些数值,根据不同报价的 GPU 缩放基础预计耗时。

操作:租用

根据用户选择的报价创建实例。

步骤 1:创建实例

vastai create instance <OFFER_ID> \
  --image <DOCKER_IMAGE> \
  --disk <DISK_GB> \
  --ssh \
  --direct \
  --onstart-cmd "apt-get update && apt-get install -y git screen rsync"

默认 Docker 镜像:pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel(如果设置了 AGENTS.md 中的 image: 字段,则以该字段为准)。

输出如下:

Started. {'success': True, 'new_contract': 33799165, 'instance_api_key': '...'}

new_contract 的值就是实例 ID——请保存此 ID,以用于后续所有命令。

步骤 2:等待实例就绪

每隔 20 秒轮询一次实例状态,直到实例运行(通常需要 30–60 秒,最长约 5 分钟):

vastai show instances --raw | python3 -c "
import sys, json
instances = json.load(sys.stdin)
for inst in instances:
    if inst['id'] == <INSTANCE_ID>:
        print(inst['actual_status'])
"

等待状态:loading → running。如果 loading 状态持续超过 5 分钟,请提醒用户——主机可能速度较慢,或者镜像可能较大。

步骤 3:获取 SSH 连接详情

vastai ssh-url <INSTANCE_ID>

此操作会返回格式为 ssh://root@<HOST>:<PORT> 的 URL。

从此 URL 中解析出主机和端口。例如:

**重要:**始终使用 vastai ssh-url 获取连接详情——不要依赖 vastai show instances 中的 ssh_host/ssh_port,因为它们可能指向与直接连接端点不同的代理服务器。

步骤 4:验证 SSH 连接

ssh -o StrictHostKeyChecking=no -o ConnectTimeout=15 -p <PORT> root@<HOST> "nvidia-smi && echo 'CONNECTION_OK'"

如果 SSH 返回 "Permission denied (publickey)" 错误:

  • 用户在创建实例之前没有将 SSH 密钥上传到 https://cloud.vast.ai/manage-keys/
  • **解决方法:**销毁此实例,让用户上传密钥,然后创建新实例。密钥会在创建实例时写入——无法为正在运行的实例添加密钥。

如果 SSH 返回 "Connection refused" 错误:

  • 实例可能仍在初始化。每隔 15 秒重试一次,最多 3 次。

步骤 5:更新状态文件

将新实例详情写入或更新到 vast-instances.json,包括第 3 步获取的 ssh_url、预估时长和费用。

步骤 6:报告

Vast.ai instance ready:
- Instance ID: <ID>
- GPU: <GPU_NAME> x <NUM_GPUS>
- Cost: $<DPH>/hr (estimated total: ~$<TOTAL>)
- SSH: ssh -p <PORT> root@<HOST>
- Docker: <IMAGE>

To deploy: /run-experiment (will auto-detect this instance)
To destroy when done: /vast-gpu destroy <ID>
操作:设置

遵循 ../shared-references/compute-env-contract.md:编写或复用声明式环境规范(按顺序排列 pip_phases,而不是一次性安装所有包),在 .aris/compute/vast.md 中记录 env:<name>@<specHash> 区块,并在启动实际实验之前运行带种子的内核验证——即使全新实例上的 import torch 成功,也仍可能使用了错误 SM 的 wheel。

为特定实验设置租用的实例。当目标为 vast.ai 实例时,由 /run-experiment 自动调用。

步骤 1:安装依赖(按阶段呈现环境规范)

将项目的环境规范按顺序呈现为多个阶段——每个阶段执行一次 pip install,避免后续软件包影响前一阶段锁定的版本:

# phase 1: the fought-over pins first (torch/cuda wheel)
ssh -p <PORT> root@<HOST> "pip install -q torch==<pinned>"
# phase 2+: everything that must respect those pins
ssh -p <PORT> root@<HOST> "pip install -q wandb tensorboard scipy scikit-learn pandas"

旧版回退方案——如果项目只有 requirements.txt,没有环境规范,则将其作为单个阶段安装,然后将由此导致的任何版本冲突视为将其转换为有序阶段的信号:

scp -P <PORT> requirements.txt root@<HOST>:/workspace/
ssh -p <PORT> root@<HOST> "pip install -q -r /workspace/requirements.txt"

注意:scp 使用大写 -P 指定端口,而 ssh 使用小写 -p。

步骤 2:同步代码

rsync -avz -e "ssh -p <PORT>" \
  --include='*.py' --include='*.yaml' --include='*.yml' --include='*.json' \
  --include='*.txt' --include='*.sh' --include='*/' \
  --exclude='*.pt' --exclude='*.pth' --exclude='*.ckpt' \
  --exclude='__pycache__' --exclude='.git' --exclude='data/' \
  --exclude='wandb/' --exclude='outputs/' \
  ./ root@<HOST>:/workspace/project/

步骤 3:验证设置

ssh -p <PORT> root@<HOST> "cd /workspace/project && python -c 'import torch; print(f\"PyTorch {torch.__version__}, CUDA: {torch.cuda.is_available()}, GPUs: {torch.cuda.device_count()}\")'"

预期输出:PyTorch 2.1.0, CUDA: True, GPUs: 1(如果是多 GPU 实例,则 GPU 数量会更多)。

操作:销毁

拆除 vast.ai 实例以停止计费。

步骤 1:确认已收集结果

销毁之前,检查是否有实验结果需要下载:

ssh -p <PORT> root@<HOST> "ls /workspace/project/results/ 2>/dev/null || echo 'NO_RESULTS_DIR'"

如果存在结果,请先下载:

rsync -avz -e "ssh -p <PORT>" root@<HOST>:/workspace/project/results/ ./results/

同时下载日志:

scp -P <PORT> root@<HOST>:/workspace/*.log ./logs/ 2>/dev/null

步骤 2:销毁实例

vastai destroy instance <INSTANCE_ID>

输出:destroying instance <INSTANCE_ID>.

销毁操作不可逆——实例上的所有数据都将被永久删除。

步骤 3:更新状态文件

从 vast-instances.json 中移除此实例,或将其状态标记为 destroyed。

步骤 4:报告费用

根据创建时间和 $/hr 计算实际费用:

Instance <ID> destroyed.
- Duration: ~X.X hours
- Actual cost: ~$X.XX (estimated was $Y.YY)
- Results downloaded to: ./results/
操作:列出

显示所有活跃的 vast.ai 实例:

vastai show instances

与 vast-instances.json 交叉比对实验关联信息。

操作:销毁全部实例

拆除所有活动实例(在所有实验完成后执行):

  1. 从每个实例下载结果
  2. 销毁所有实例
  3. 清空 vast-instances.json
  4. 报告总费用

关键规则

  • 根据任务选择——绝不要求用户挑选 GPU 型号。分析任务,估算需求,并提供经过成本优化且列出总价的选项
  • 实验完成后务必销毁实例——vast.ai 按秒计费,让实例持续运行会浪费钱
  • 销毁前先下载结果——销毁后数据会永久丢失
  • 短时实验(<2 小时)优先采用按需定价。对于长时间运行(>4 小时)的任务,建议采用可中断/竞价定价并设置检查点
  • 确认可靠性 > 0.95——不可靠的主机可能会在训练中途崩溃
  • 创建实例时使用 --direct SSH——比代理 SSH 更快
  • 始终使用 vastai ssh-url <ID> 获取连接详情——show instances 中的主机/端口可能会不同
  • 必须先上传 SSH 密钥,再创建实例——密钥会在创建时写入实例。如果 SSH 返回「Permission denied」,请销毁实例并在添加密钥后重新创建
  • 默认 Docker 镜像:pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel,除非用户另有指定
  • 实例上的工作目录:/workspace/(Docker 默认目录)。代码会同步到 /workspace/project/
  • 状态文件 vast-instances.json 必须保持最新——其他技能依赖它
  • 显示预估总费用,而不只是每小时费用——一块每小时 $0.90、2 小时完成的 GPU($1.80),比一块每小时 $0.30、耗时 8 小时的 GPU($2.40)更划算
  • vastai CLI 要求 Python ≥ 3.10——如果系统 Python 版本较低,请使用 conda 环境

AGENTS.md 示例

用户只需设置 gpu: vast——无需指定硬件偏好:

## Vast.ai
- gpu: vast                  # tells run-experiment to use vast.ai
- auto_destroy: true         # auto-destroy after experiment completes (default: true)
- max_budget: 5.00           # optional: max total $ to spend (skill warns if estimate exceeds this)
- image: pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel  # optional: override Docker image

该技能会分析实验脚本和计划,以确定要租用哪种 GPU。无需指定 GPU 型号、显存或实例数量。

与其他技能组合使用

/run-experiment "train model"       ← detects gpu: vast, calls /vast-gpu provision
  ↳ /vast-gpu provision             ← analyzes task, presents options with cost
  ↳ user picks option               ← rent + setup + deploy
  ↳ /vast-gpu destroy               ← auto-destroy when done (if auto_destroy: true)

/vast-gpu provision                 ← manual: analyze task + show options
/vast-gpu rent <offer_id>           ← manual: rent a specific offer
/vast-gpu list                      ← show active instances
/vast-gpu destroy <instance_id>     ← tear down, stop billing
/vast-gpu destroy-all               ← tear down everything

评论

支持 Markdown