关于 vast-gpu
vast-gpu 是用于估算 GPU 需求、筛选 vast.ai 报价并管理实例的技能,涵盖配置到销毁流程。它面向需要租用算力的实验工作流,并在项目文件中跟踪活动实例。
主要功能
- 01估算 GPU、显存、磁盘和运行时长
- 02按总成本搜索并排序 GPU 报价
- 03租用并配置 GPU 实例
- 04同步实验代码和依赖项
- 05跟踪、列出和销毁实例
适用场景
- 01为计划中的训练任务选择 GPU
- 02创建实例以运行实验
- 03将代码和依赖部署到租用的 GPU
- 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:分析任务需求
阅读可用上下文,确定任务需求:
-
从实验计划中(
refine-logs/EXPERIMENT_PLAN.md):- 计算预算(GPU 总小时数)
- 硬件提示(例如,“4x RTX 3090”)
- 模型架构和数据集大小
- 运行顺序和各里程碑的成本估算
-
从实验脚本中(如果已编写):
- 模型大小——查找模型类、
num_parameters和配置文件 - 批量大小、序列长度——据此估算显存
- 数据集——根据数据集大小和轮数估算训练时间
- 多 GPU——检查是否使用
DataParallel、DistributedDataParallel、accelerate、deepspeed
- 模型大小——查找模型类、
-
从用户描述中(如果没有计划或脚本):
- 模型名称/大小(例如,“微调 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 3060 | 0.5× |
| RTX 3090 | 1.0× |
| RTX 4090 | 1.6× |
| A5000 | 0.9× |
| A6000 | 1.1× |
| L40S | 1.5× |
| A100 SXM | 2.0× |
| H100 SXM | 3.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 中解析出主机和端口。例如:
- 输入:
ssh://[email protected]:58955 - 主机:
1.208.108.242,端口:58955
**重要:**始终使用
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 交叉比对实验关联信息。
操作:销毁全部实例
拆除所有活动实例(在所有实验完成后执行):
- 从每个实例下载结果
- 销毁所有实例
- 清空
vast-instances.json - 报告总费用
关键规则
- 根据任务选择——绝不要求用户挑选 GPU 型号。分析任务,估算需求,并提供经过成本优化且列出总价的选项
- 实验完成后务必销毁实例——vast.ai 按秒计费,让实例持续运行会浪费钱
- 销毁前先下载结果——销毁后数据会永久丢失
- 短时实验(<2 小时)优先采用按需定价。对于长时间运行(>4 小时)的任务,建议采用可中断/竞价定价并设置检查点
- 确认可靠性 > 0.95——不可靠的主机可能会在训练中途崩溃
- 创建实例时使用
--directSSH——比代理 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)更划算
vastaiCLI 要求 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