跳转到内容

GPUPlane 产品设计文档

版本:v0.1-draft · 2026-08-17 本文档在原始产品方案基础上做批判性审视与精化。竞品验证详见 01-product-research.md,工程落地见 03-system-design.md


GPUPlane 是一套面向个人开发者与 1–8 卡小规模 GPU 环境的 Agent-native Training Control Plane。 以轻量 Agent 为执行端,在不改变既有 PyTorch 工作流的前提下,提供远程任务调度、资源监控、实验追踪、Checkpoint 与 Evaluation 管理,并通过 REST / CLI / Web / MCP 向人和 AI Agent 提供同一个控制面。

一句话:给个人的 GPU 训练补上“控制面”,让人和 Agent 用同一套语义操作训练生命周期。

1.1 定位的三个支点(差异化来源)

Section titled “1.1 定位的三个支点(差异化来源)”
支点 含义 对立面
个人 GPU 优先 围绕 1–8 卡设计:SQLite、单 worker、独占调度、systemd 部署 ClearML/K8s 系:为集群设计再向下裁剪,基础设施即成本
工作流兼容(Observer 而非 Trainer) 平台在训练代码之外;python train.py 永远可独立运行;三级接入(零侵入/TB 约定/SDK) ClearML 的环境重建与 Git 强依赖;平台型 Trainer 对 loop 的接管
Agent-native 语义工具(diagnose/compare/best-checkpoint)+ MCP + Skill,平台持续监控、Agent 按事件介入 传统 tracker 只有 CRUD API,Agent 只能拿到原始点

逐条列出:保留(验证成立)/ 修订(方向对但需调整)/ 新增(原方案遗漏)/ 风险(需持续警惕)。

  1. Job ≠ Run 的分离(Job 调度 / Run 观测)——比“Job=Experiment”灵活,是评估流水线(train→ckpt→eval job)成立的前提。✅
  2. GPU 独占调度、不以 utilization 判空闲——util=0 可能是 DataLoader/Eval 阶段,这是个人 GPU 调度最常见的错误假设。✅
  3. LOST 状态 + reconcile——agent 失联语义清晰,比简单 FAILED 准确。✅
  4. 三级接入(零侵入 / TB 约定 / 可选 SDK)——是“不绑架训练过程”承诺的技术兑现。✅
  5. SQLite + 无 Kafka/Redis——个人规模的正确默认。✅
  6. MCP 只是 Core Service 的适配器、语义优先于原始数据——架构上最重要的两条原则。✅

2.2 修订建议(方向正确,设计需调整)

Section titled “2.2 修订建议(方向正确,设计需调整)”
# 原方案 问题 修订
R1 同一张 GPU 同时只允许一个 job(“gpu.owner_job”) 未定义多卡节点与 cpu-only job 抽象 GPU Slot:每卡一个槽;调度注入 CUDA_VISIBLE_DEVICESgpu:0 的 job 走 cpu-only 并发通道(每节点上限 2),评估/导出不再排队等训练
R2 “日志实时发送至 Control Server” 训练日志可上 GB,全量进 SQLite 必膨胀 全文日志只存 agent 本地文件;server 只持久化尾部 2000 行 ring buffer + 实时转发;--full 时按需向 agent 拉取
R3 Checkpoint 记录 hash GB 级文件全量 hash 太贵,watcher 会卡 改为快速指纹(size+mtime+头尾各 1MB 的 sha1);全量校验做成手动 ckpt verify
R4 Checkpoint Watcher“识别新生成的 checkpoint” 未处理半成品写入(大文件写数分钟) 防抖注册:mtime 稳定 10s 才上报;跳过 .tmp/.partial;识别 HF checkpoint-*/trainer_state.json 提取 step
R5 第一版调度 SQL 轮询 正确,但缺 dispatch 超时处理 DISPATCHING 状态 ack 超时(30s)回 QUEUED,上限 3 次后置 FAILED(防 agent 假死吞 job)
R6 WebSocket 提供 Web UI 实时日志 单向场景 WS 偏重 UI 日志默认 SSE(浏览器自带重连);WS 只留给交互操作(stdin/信号)
R7 v0.1 范围(Agent+监控+队列+Runner+日志+Web UI+CLI+Run+指标+TB+Checkpoint) 约 3 个里程碑的量,一次性交付风险高 拆为 M0–M5(见 04 路线图),Web UI 推迟到 M4,此前 CLI 闭环;每个里程碑都可独立使用
R8 SDK from gpuctl import run 品牌不统一(目录 GPUPlane vs gpuctl) 统一命令/包命名空间为 gpuctl(CLI、SDK import、数据目录 ~/.gpuctl/),产品名 GPUPlane 仅作品牌
R9 Run 与重试的关系未定义 重试时 metrics 归属易混淆 每次 dispatch(含 retry)创建新 Runjob_id + attempt),重试曲线天然隔离可对比
R10 “Agent 按事件介入” 缺少 Agent 被唤醒的实际通道(MCP 是 request/response,平台推不动 agent) 三通道落地:① webhook 外推(ntfy/Bark 通知人)② gpuctl event-hook 拉起本地 agent 会话 ③ Agent 侧分钟级低成本轮询 list_events + get_run_summary
# 遗漏 补法
N1 认证与安全模型完全缺失(远程提交/取消任务是高危能力) 单用户多 token + scope(read/write/agent/sdk);MCP 默认只读,submit/cancel 需 write scope;跨网必须 TLS/Tailscale
N2 环境快照:方案明确拒绝环境重建(对),但连“记录”也没有 dispatch 时 agent best-effort 采集 git commit/dirty、python 版本、关键包版本、argvruns.env_snapshot——不重建,但可比较、可追溯,成本几乎为零
N3 通知渠道:训练完成/OOM 时人不在电脑前 v0.2 webhook(ntfy/Bark/自定义 URL)订阅事件类型推送
N4 SQLite 备份 gpuctl server backup(在线备份 API + 日志打包),可选 litestream
N5 uvicorn 单 worker 约束(内存态 pub/sub 多 worker 不共享) 架构上确认单 worker 为既定约束并写入部署文档;pub/sub 抽象接口留扩展点
N6 训练环境与平台依赖隔离 SDK 零重依赖(仅 httpx);agent/server 永远独立 venv,绝不装进训练环境
  1. TB 解析的边界情况(tensor 化 scalar、半写 CRC、step 回退、大文件全量 CRC 慢)——已逐条给出工程对策(03 号文档 §7.4),集成测试必须用真实 PyTorch SummaryWriter 产物;
  2. MCP 生态版本动荡(官方 mcp 2.0 与 fastmcp 3/4 交替期存在硬冲突)——钉版 + MCP 独立成包 + v0.3 才接入,把生态风险排在最后;
  3. 功能蔓延:最容易发生在 Web UI(变成“小 W&B”)和 Scheduler(变成“小 K8s”)。每加一个功能问:1 张 5090 的用户需要它吗?
  4. 诊断规则的误报疲劳:OVERFITTING_SUSPECTED 等启发式规则误报会快速消耗信任——所有规则阈值可配,critical 级别宁缺毋滥。

  • P1 个人研究者/独立开发者(主要):1 台自装 GPU 工作站(如 RTX 5090),PyTorch/HF/TRL 技术栈,白天用笔记本、训练跑在家里/实验室的机器上;当前工作流 = SSH + tmux + 手动 nvidia-smi + TensorBoard;
  • P2 小实验室(次要):2–4 台异构 GPU 机(3090/4090/5090 混部),几个学生共用,需要“谁在用卡、排队”的可见性;
  • P3 AI Agent(一等公民,非人类):Codex/Claude Code 等,受用户委托执行“改代码→训练→评估→迭代”闭环。
# 场景 现状痛点 GPUPlane 体验
S1 离开工位后想知道“训练还活着吗、loss 正常吗” SSH 上去翻 tmux + 肉眼读日志 手机浏览器开 Dashboard:进度、曲线、事件一目了然
S2 排队跑多个实验(改 lr 三连跑) 手动守着一个个起,或写脆弱 shell 脚本 连提 3 个 job,独占调度串行执行,完成推送通知
S3 训练挂了(OOM/NaN),快速定位 翻 stderr、猜原因、改完重跑 OOM 事件 + tail 日志 + failure_reason;Agent 可自动诊断并改 batch size 重提
S4 训完 10 个 checkpoint,选哪个 手动跑 eval、Excel 记结果 checkpoint 自动注册 → 一键排队评估 → 按 primary metric 推荐
S5 让 AI Agent 代管实验循环 Agent 只能 SSH 瞎摸,无结构化观测 MCP 语义工具:summary/diagnose/compare/best-checkpoint + Skill 工作流
S6 上周裸跑的训练,想纳入管理 散落在 outputs/ 目录 gpuctl import-run 离线导入,与平台内 run 同视图对比

Must(v0.1,缺了就不是这个产品)

Section titled “Must(v0.1,缺了就不是这个产品)”

Agent 心跳/GPU 监控 · Job 队列+独占调度 · ProcessRunner · 日志(本地全文+server tail+SSE) · Job 状态机含 LOST · SDK run.log · TB 自动接入 · Checkpoint 发现注册 · CLI 全命令 · Web 四页 · Run Summary · import-run · token 认证 · systemd 部署

Project/Experiment · Evaluation Job 与结果回挂 · 事件规则全集 · Retry · DockerRunner · Webhook 通知 · MetricDefinition 管理 · SDK 框架 callback extras · 环境快照(提前到 v0.1 M2 低成本先做)

MCP Server · 语义诊断五件套 · Skill/AGENTS.md 模板 · run 对比视图增强 · artifact 管理

Won’t(明确不做,与原方案一致并补充)

Section titled “Won’t(明确不做,与原方案一致并补充)”

K8s/Slurm 调度 · 多租户与计费 · 云 GPU 供给 · Kafka 等消息基础设施 · 完整 W&B/MLflow 替代 · 强制 Docker/Git-clean/环境重建 · 模型文件托管与分发(checkpoint 只注册不搬运) · 抢占式调度


  • v0.1 北极星:用户连续 7 天没有为训练管理打开过 SSH+tmux;
  • v0.3 北极星:一次“改配置→训练→评估→选 checkpoint”循环由 Agent 端到端完成,用户只在开始和结束时介入;
  • 关键健康指标:agent 上报链路可用率(spool 兜底率 100%)、误报事件占比 <10%、server SQLite 体积增长 <50MB/周(日志策略生效的证据)。

6. 与竞品的关系(调研验证后定稿,论证见 01 号文档 §2/§4)

Section titled “6. 与竞品的关系(调研验证后定稿,论证见 01 号文档 §2/§4)”

调研确认的关键事实(2026-08,两路独立调研交叉验证)

  • W&B 已有官方 MCP(2026-05,20 个 schema-first tools)与 Aria 研究 agent——但全部只读;W&B Launch 任务执行全 Docker 化,生产级自托管需 K8s+MySQL+S3+Redis(+ClickHouse)。W&B 验证了“Agent 消费训练语义”的需求真实性,但不碰“任务在我的 GPU 机器上怎么跑”;
  • MLflow 3.x 已把 SQLite 定为默认后端——我们的存储选型获得行业背书;其官方 MCP(3.4 起)仅限 GenAI traces;
  • ClearML 自托管 = apiserver+ES+Mongo+Redis 全家桶,执行模型强依赖 Git 快照+环境重建;dstack SSH fleet 需 Docker+免密 sudo,其官方 Agent Skill 是调研中唯一“agent 可提交任务”的成熟产品(CLI 驱动、非 MCP、无训练语义);
  • SwanLab 有硬件监控+通知但无任务执行;Aim 维护状态存疑(社区 issue 追问 + release 断档),不宜作为依赖;
  • 训练作业生命周期(submit/monitor/kill/diagnose)没有任何权威 MCP server——空白经两路调研一致确认。

结论:GPUPlane 不与任何 tracker 抢“实验数据记录”的存量——占据的是 tracker 与 orchestrator 之间的空位:本地优先的执行控制面 + 训练语义 + Agent 可读写。与 wandb/TensorBoard 是互补关系(GPUPlane 消费 TB events;用户可继续用 wandb 追踪)。潜在威胁与护城河三件套(裸进程工作流 / checkpoint-evaluation 谱系语义 / SQLite 级零依赖)详见 01 号文档 §4.2。