
之前在业务迭代里用 Vast AI 租 GPU 做训练时遇到过几次“明明昨天还好好的今天实例就 Down 了”的情况。控制台里实例状态变成no_powerSSH 连不上训练日志断在中间最难受的是数据有可能没保存。网上关于 Vast AI 的教程大多只讲怎么租机器很少讲“实例 Down 了该怎么办”。这篇文章我整理了一套从环境准备、实例创建到故障排查、恢复重建的闭环实操方案覆盖工程师使用 Vast AI 时最常见的掉线场景也适合刚接触 AI 算力平台的新手按步骤操作。1. Vast AI 是什么实例为什么会 Down1.1 一分钟理解 Vast AIVast AI 是一个去中心化的 GPU 算力市场平台它做的事情简单说就是“连接算力需求方和 GPU 供给方”。需求方可以是个人开发者、高校实验室、中小型 AI 团队供给方则是拥有闲置显卡的机房、矿场或普通服务器所有者。和传统云厂商的“统一数据中心”模式不同Vast AI 上的实例分布在全世界不同供应商的机器上因此价格通常比大厂云 GPU 便宜不少型号也比较丰富从 RTX 4090 到 A100、H100 都能搜到。它的工作方式类似租车平台你选车、选配置、付钱、拿到使用权但车辆本身不归平台所有而是归属不同房东。正因为它“分布式”的特点实例稳定性会比统一机房更难保证。供应商的网络、电源、硬件状态都会直接影响你的训练任务。这也是“Vast AI Down”问题比传统云更常见的根本原因。1.2 “Down” 到底指什么在做排查之前先要把“Down”拆开看。不同层面的 Down处理方式完全不同。第一类是平台层面 Down。比如 Vast AI 的网页控制台打不开、充值接口报错、API 超时这种情况不是你实例的问题而是平台整体故障通常只能等待平台恢复。第二类是实例层面 Down。实例状态从running变成off、no_power、unsupported或者你在vastai show instances里根本看不到实例了。这类问题需要你主动恢复或重建。第三类是任务层面 Down。实例还在运行但是训练进程挂了比如显存溢出OOM、进程被杀、磁盘写满、CUDA 驱动异常。这类问题不用重建机器直接进容器里排查即可。第四类是网络层面 Down。实例活着但 SSH 连接超时、端口不通、带宽掉到无法训练。这种情况要区分是映射端口没开、IP 变了还是供应商网络波动。1.3 典型应用场景Vast AI 在以下场景里用得最多跑 Stable Diffusion 推理或微调跑大模型微调比如 LoRA、QLoRA做强化学习或大规模并行实验临时租卡验证 PyTorch / TensorFlow 代码用低价竞价实例做短时批处理任务。在这些场景里实例 Down 意味着训练中断、进度丢失、时间浪费。因此理解实例生命周期、掌握快速恢复方法就成了一项必备工程技能。2. 环境准备与基本配置2.1 账号、API Key 与 SSH 密钥开始操作之前先注册 Vast AI 账号并在控制台的 Account 页面生成 API Key。API Key 是调用 CLI 和 API 的凭证类似云平台的 AccessKey必须妥善保管。同时准备 SSH 密钥推荐使用 ed25519 算法。如果本机没有可以用以下命令生成ssh-keygen -t ed25519 -C vast-ai-key -f ~/.ssh/vast_ai cat ~/.ssh/vast_ai.pub生成后把公钥内容复制到 Vast AI 控制台的 SSH Key 配置里。这样创建实例时平台会自动把公钥写入实例的~/.ssh/authorized_keys你才能免密登录。2.2 安装 CLI 工具Vast AI 官方提供vastai命令行工具目前比较稳定的是 0.x 版本。不同版本的参数有差异但核心命令思路一致。安装命令如下pip install -U vastai export VAST_API_KEY你的API_KEY vastai show instances如果show instances能返回空列表或实例信息说明 CLI 配置成功。2.3 理解核心概念在 Vast AI 里有几个概念需要先搞明白实例Instance一台由 GPU、CPU、内存、磁盘、镜像组成的虚拟机器本质是一个 Docker 容器运行在供应商的物理机上。镜像Image运行环境一般用 PyTorch、TensorFlow、Ubuntu CUDA 等预置镜像也可以自己推镜像到 Docker Hub。端口映射Ports把容器内端口暴露到公网。比如 SSH 用 22TensorBoard 用 6006Gradio 用 7860。竞价实例Bid出价租用机器价格可能比按需低但供应商可以随时回收实例。对稳定性要求高的任务谨慎使用。下面是一个用 Python 调用 Vast AI API 查询可用 GPU 的示例注意 API 路径和字段可能随平台更新请以官方文档为准import os import requests API_KEY os.environ[VAST_API_KEY] headers { Authorization: fBearer {API_KEY}, Accept: application/json, } def search_gpu(modelRTX4090, num_gpus1): url https://console.vast.ai/api/v0/search_offers/ params { gpu_name: model, num_gpus: num_gpus, limit: 10, } resp requests.get(url, headersheaders, paramsparams, timeout30) resp.raise_for_status() offers resp.json().get(offers, []) for offer in offers: print( offer.get(id), offer.get(gpu_name), offer.get(num_gpus), offer.get(dph_total), ) if __name__ __main__: search_gpu()这里把 API Key 通过环境变量读取避免把密钥硬编码在代码里。3. 实例租用与连接流程3.1 通过 CLI 创建实例在控制台里搜索 GPU、选择镜像很方便。如果希望通过命令行创建实例可以参考以下逻辑但要注意不同镜像、不同 API 版本的字段名会有差异# 先查看某个报价的详情 vastai show offers --gpu-name RTX4090 --num-gpus 1 # 创建实例这里参数以官方 CLI 0.5.x 为参考实际使用前请 vastai create instance --help 确认 vastai create instance 报价ID \ --image nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04 \ --disk 32 \ --ssh \ --direct \ --ports 22:22,6006:6006,7860:7860--disk 32表示申请 32GB 磁盘空间--ports表示端口映射。在实际项目中端口映射关系到后续连接一定要提前规划好因为部分供应商不支持实例创建后修改端口映射。3.2 连接实例创建完成后用vastai show instances查看实例的公网 IP 和端口信息。然后通过 SSH 登录ssh -i ~/.ssh/vast_ai -p 你映射的SSH端口 root实例公网IP这里有个常见坑Vast AI 的容器默认用户可能是root但不是所有镜像都默认开启 root SSH。如果登录失败先确认控制台里实例日志有没有报错再检查是否用了正确的私钥和端口。3.3 状态检查与日志定位进入实例后第一件事是确认 GPU 和驱动状态nvidia-smi正常情况下会显示显卡型号、驱动版本、显存占用。如果nvidia-smi命令不存在说明镜像没有安装 NVIDIA 驱动或容器没有挂载 GPU这时候即使实例显示 running训练也会失败。查看最近系统日志dmesg -T | tail -50在分布式 GPU 环境中dmesg能帮你判断是不是供应商物理机有问题比如 GPU 掉卡、PCIe 错误、温度过高。4. 完整实战案例从实例 Down 到恢复下面用一个实际常见的场景来做一次完整排查与恢复。4.1 场景设定假设你昨天在 Vast AI 上租了一台 RTX 4090 实例镜像为 PyTorch 镜像正在跑一个 LoRA 微调任务。今天早上发现控制台实例状态变成no_powerSSH 连接超时训练过程中断。4.2 第一步确认实例状态先查看实例列表vastai show instances如果输出为空说明实例已被平台移除通常是供应商回收或平台清理只能重建。如果实例还在但状态不是running可以尝试重启vastai restart instance 实例ID重启命令只是“重启”操作不保证解决硬件问题。如果重启后状态回到running立刻 SSH 进去保存数据和日志。4.3 第二步SSH 连接与目录检查能连上机器后首先检查磁盘和运行时间df -h uptime free -h磁盘写满是最常见的“假 Down”原因。容器内日志文件、模型 checkpoint、数据集缓存都可能迅速占满磁盘。一旦磁盘满容器会表现为无法写入、进程崩溃甚至 SSH 命令执行异常。查看训练日志定位中断原因tail -200 /root/train.log如果日志里有CUDA out of memory说明是显存不足需要调小 batch size 或改用梯度累积如果是Killed可能是内存或磁盘不足导致 OOM Killer 介入如果是Connection reset by peer则可能是供应商网络抖动或容器被重启。4.4 第四步检查 GPU 状态执行nvidia-smi如果输出显示 GPU 型号但显存为 0或者出现 “No devices were found”说明容器没有正确挂载 GPU。此时可以尝试ls /dev/nvidia*如果/dev/nvidia0等设备节点不存在通常是供应商驱动异常这种情况仅靠重启容器解决不了需要先重启实例不行就换供应商重建。4.5 第五步数据备份与重建如果实例无法恢复最稳妥的做法是“备份数据重建实例”。在还能 SSH 的情况下先把重要文件打包传输到本地或其他存储tar -czf backup.tar.gz /root/checkpoints /root/output /root/train.log scp -P 你的SSH端口 backup.tar.gz user你的IP:/backup/然后删除原实例避免持续计费vastai destroy instance 实例ID重建时建议选择另一家供应商或换一个区域避免再次踩到同一台故障物理机。4.6 第六步验证恢复结果重建实例后安装需要的依赖或直接使用原镜像拉取备份重新启动训练。启动前可以先用一段简单代码验证 PyTorch 能用 GPUimport torch print(CUDA available:, torch.cuda.is_available()) print(GPU count:, torch.cuda.device_count()) print(GPU name:, torch.cuda.get_device_name(0)) x torch.randn(1000, 1000, devicecuda) y torch.matmul(x, x) print(Matmul OK, shape:, y.shape)如果输出正常说明环境恢复成功可以继续训练。5. 常见问题与排查思路结合日常使用经验把 Vast AI 实例 Down 相关的高频问题整理如下问题现象常见原因解决思路实例状态no_power机器关机或未开机控制台点开机或 API 调用 power on实例状态unsupported供应商机型不再兼容停止实例选择其他供应商重建SSH 连接超时IP 变化、端口映射失效删除实例重建重新确认公网 IP 和端口nvidia-smi无输出驱动未安装或设备未挂载检查/dev/nvidia*重启实例训练中途Killed内存或磁盘不足查看dmesg清理磁盘调小 batch size磁盘只读容量满或文件系统异常df -h检查容量扩容或删除大文件控制台能打开但 API 超时平台 API 波动增加重试逻辑关注平台状态页竞价实例突然消失供应商回收使用持久卷任务支持 checkpoint 断点续跑下面挑几个重点场景展开说明。5.1 实例状态变 no_powerno_power的直接含义是“机器没有通电”也就是供应商那边物理机可能被关机了。这个状态最常见于竞价实例被供应商回收或者供应商异常断电。处理方式是先点开机等一两分钟看状态变化。如果反复出现no_power说明供应商机器不稳定建议直接换供应商。5.2 SSH 连不上SSH 连不上时不要反复重试先按以下顺序排查确认实例状态是running确认 SSH 端口有没有映射到公网确认本机私钥路径、用户名是否正确查看实例控制台的 Console 日志尝试从 Vast AI 网页端的 Web 终端进入容器。如果 Web 终端能进说明容器活着只是 SSH 服务或网络问题如果 Web 终端也进不去基本可以判断实例本身有问题。5.3 竞价实例被抢占竞价实例能省钱但代价是会被回收。应对方案不是不用竞价而是让任务支持断点续跑。训练脚本每隔一段时间保存一次 checkpoint重启后从最近的 checkpoint 继续训练。# 伪代码训练循环中定期保存 checkpoint for epoch in range(start_epoch, total_epochs): train_one_epoch() if epoch % save_interval 0: torch.save({ epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), }, fcheckpoint_epoch_{epoch}.pt)这样即使实例被回收损失也只是最近一个保存周期内的进度。5.4 磁盘容量满很多用户只关注 GPU 型号忽略了磁盘容量。Vast AI 默认磁盘可能只有十几 GB而一个大模型权重文件就有 5-10GB加上数据集和日志很容易写满。创建实例时建议在报价允许的条件下申请更大的磁盘比如 50GB 到 100GB。如果磁盘满了先用du -sh *找出大目录清理缓存和日志。6. 最佳实践与工程建议结合多次踩坑经验下面这些建议能显著降低 Vast AI 实例 Down 带来的损失。6.1 数据持久化优先实例是“一次性”的供应商回收、机器故障、手动删除都会导致数据丢失。重要数据一定要持久化常见方案有三种定期把 checkpoint 同步到自己的对象存储或网盘使用 Vast AI 的卷功能将数据存放在独立持久卷上训练脚本每次保存 checkpoint 后自动上传到云端。最稳妥的方式是“两处保存”本地一份云端一份。只存本地实例没了就全丢了。6.2 关键信息不要硬编码API Key、SSH 私钥、数据库密码都不应该出现在代码仓库里。写成环境变量或使用密钥管理工具同时给 API Key 设置最小权限避免泄露后造成恶意扣费。例如在启动训练时使用环境变量传递密钥export WANDB_API_KEY你的key python train.py --config config.yaml6.3 学会看计费规则Vast AI 的计费通常按小时产生费用实例关闭后可能仍会产生存储费用。长时间不用的实例如果确认数据已经备份应直接销毁而不是停机。还需要注意不同供应商的报价差异很大同一型号 GPU 的价格可能相差一倍。搜索时比较dph_total每小时总价和dph_total之外的网络、磁盘费用综合判断成本。6.4 自动化监控与告警不要依赖人工盯控制台。写一个简单的健康检查脚本每隔几分钟检查实例能否连上、GPU 是否可用、磁盘是否快满异常时通过企业微信、钉钉或邮件告警。# health_check.sh INSTANCE_ID你的实例ID STATE$(vastai show instance $INSTANCE_ID --raw 2/dev/null | python3 -c import sys,json; print(json.load(sys.stdin).get(actual_status,))) if [ $STATE ! running ]; then echo 实例状态异常: $STATE | tee /tmp/vast_alert.log # 这里可以补充发送告警的脚本 fi配合 crontab 每 5 分钟执行一次即可。6.5 任务设计尽可能可恢复训练任务一定要支持 checkpoint 断点续跑这是面对分布式算力平台不稳定时最核心的工程策略。除了保存模型权重还要保存 optimizer、epoch、随机数种子否则恢复后可能会影响训练效果。数据加载也可以做“预下载 缓存”避免每次启动都从远端拉取大文件既省流量又缩短启动时间。6.6 多实例容灾如果训练任务关键建议同时在两个不同供应商或不同区域各租一台机器主实例挂了立刻切到备用实例。虽然成本翻倍但对高优先级任务来说这是最直接的容灾手段。7. 总结与下一步学习方向Vast AI 是一个性价比高但稳定性需要自己兜底的 GPU 算力平台。它把 GPU 的“购买成本”变成了“租用成本”让个人和小团队也能用上顶级显卡但分布式算力天然的异构性和不确定性也要求使用者具备更强的故障处理能力。本文主要讲了 Vast AI 的核心概念、环境配置、实例创建与连接方式重点剖析了实例 Down 的几种类型和完整排查流程包括no_power、SSH 连接失败、GPU 掉卡、磁盘满、竞价实例被回收等高频问题。如果你按照文章里的方式做好数据备份、checkpoint 续跑和自动化监控大部分故障都不会对你的训练进度造成毁灭性打击。接下来你可以继续学习几个方向一是阅读 Vast AI 官方 API 文档把创建实例、查询报价、实例管理等操作脚本化二是研究 Docker 镜像定制把自己的训练环境做成镜像提升创建实例的效率三是学会更多分布式训练容错方案比如 PyTorch Lightning 的 checkpoint 机制、Ray 的任务重调度这些技能在真实 AI 工程中非常实用。最后提醒一句在实际项目中先把“实例挂了怎么办”这个问题想好再开始大规模训练。祝大家的训练任务都能稳定跑完少踩几个 Down 的坑。