跳转到内容

v0.3 发布验收(CI + 原生 MCP 真机研究)

日期:2026-08-20 结论:PASS(v0.3 的单机/小规模裸进程 + SQLite 边界内) 真机:WSL2,NVIDIA RTX 5090 32GB 研究 Agent:GPT-5.6 Luna,通过 Codex 原生 gpuctl MCP 工具调用

本轮发布验收补齐 CI、版本、README、前端浏览器 smoke、MCP 并发与鉴权, 并让一个全新的 Luna 研究 Agent 在看不到实现的条件下完成真实训练、监控、 失败诊断、checkpoint 评估、比较和推荐。最终证据支持合并到 main;它不等同于 多节点、长时间 soak 或任意模型工作负载的生产验证。

  • 决策:当前 v0.3 是否可以合并到 main 并作为本地 GPU 控制平面发布。
  • 包含:Python/前端质量门、20 个 MCP 工具、真实 GPU 训练与评估、语义一致性、 checkpoint 数据完整性、并发与失败路径、HTTP MCP 鉴权。
  • 排除:多节点训练、数日 soak、不同框架的大模型训练、跨公网暴露和多租户。
  • 发布阻断规则:任何 checkpoint 交叉污染、错误推荐、未鉴权写入口、原生 MCP 传输不稳定、质量门失败,均判定不通过。
  • 黑盒约束:Luna 只能读取 AGENTS.md 与三个 gpu-training skills,并直接调用 model-visible gpuctl 工具;禁止 FastMCP/httpx/curl/REST/SSH、MCP client 或协议脚本, 禁止读取实现、测试和数据库。
Gate 结果
uv run pytest tests/ -q 121 passed(1 个已知 Starlette deprecation warning)
uv run ruff check packages/ tests/ PASS
uv run mypy packages/ PASS,56 source files
cd web && pnpm build PASS,TypeScript strict + Vite
cd web && pnpm test:e2e 2 passed,Chromium
git diff --check PASS
CI GitHub Actions 覆盖 pytest、Ruff、mypy、web build、Playwright
版本 Python workspace、runtime、FastAPI/FastMCP、plugin、web 统一为 0.3.0
迭代 观察 诊断与处置 结果
native1 原生工具已注入,但非交互子会话把调用标为 user cancelled 给独立验收会话配置无交互审批;未把本轮当业务证据 方法问题,重跑
native2(修复前) baseline/low/high 三个 run 都指向同一 checkpoints/checkpoint-469;三次 eval 均读到 high-LR 权重 示例 artifact 未按 run 隔离;增加 run-scoped 路径、递归 watcher、共享路径评估拒绝 确认 release blocker
native3 服务端 409 成功阻止污染,但旧 run 的 grace-period watcher 把新 run 子树登记给自己 watcher 跳过 sibling run_* 子树;增加重叠 watcher 回归 防线有效,归属仍需修复
native4 checkpoint 隔离、指纹、事件和 metrics 已正确;Agent 按 skill 调 eval.py --suite heldout,但示例入口名称不一致 实际示例统一为 eval.py 并接受 --suite skill/可执行契约修复
native4 follow-up 两个旧 checkpoint 发生 FileNotFoundError 发布同步误用了 rsync --delete,删除了远端示例运行时 artifacts;不是产品逻辑缺陷。停止对 examples 使用 --delete,重新训练生成全新证据 环境受污染,整轮废弃
native5(fresh) 从零训练、等待 watcher、评估、比较、失败诊断、并发读全部通过 无需进一步产品修复 PASS

部署误删的远端 MNIST checkpoint 无法从原目录恢复;历史 SQLite 记录仍在,但对应旧文件 不可再用于评估。native5 使用全新 run/checkpoint,不复用这些记录。

原生会话 transcript:/tmp/gpuplane-luna-native5-transcript.jsonl

  • 原生 MCP 调用 68 次;工具错误 0;并发读 17 次;Event-loop/transport 错误 0。
  • Node:nd_01M09MKC9GEBG3AEAS0ZATE49V(RTX 5090)。
  • Project / Experiment:prj_01M0F7JMBQFF44EFQKVXY5W5XV / exp_01M0F7JMBQJXPJQVR2W7PEFAF3
  • Primary metric:eval/loss,minimize。
Variant Run Train eval/loss Heldout eval/loss Accuracy 结论
baseline, lr=0.001 run_01M0F7JNQMY8AHJM3RQV8Y07JZ 0.1198393541 0.1198393541 0.9630 winner
high-LR, lr=1.0 run_01M0F7MEE5X423BW3SJDRRXDKW 3.8933912964 3.8933912964 0.0202 reject

两者均为 CUDA、1 epoch、469 steps、exit 0。每个 run 恰有 48 个指标点, (metric name, step) 重复数为 0;每个 run 恰有一个 CHECKPOINT_CREATED,且无跨 run 事件。

Run Checkpoint Path suffix Fingerprint
baseline ckpt_01M0F7MDE57BMJTPYRHVHH3VWD checkpoints/run_01M0F7JNQMY8AHJM3RQV8Y07JZ/checkpoint-469 7668378dd91e4694312b58714b5517244e8a10cd
high-LR ckpt_01M0F7MHNCCZSW4J2W6YNZD57Q checkpoints/run_01M0F7MEE5X423BW3SJDRRXDKW/checkpoint-469 8311a7d1cea807c69aa6a07343819d6a762e097b

两次 evaluation 均为 SUCCEEDED

  • baseline:eval_01M0F7NNQ9RPJCPESA7Q57S4GS
  • high-LR:eval_01M0F7NNPGHSMSJCB9Z23G41C8

compare_runscompare_checkpoints、run 级和 experiment 级 get_best_checkpoint 均选择 baseline checkpoint,值为 0.11983935413360595, 且 source=evaluation,不存在训练 fallback 掩盖评估空洞的问题。

受控 CPU 失败 job_01M0F7QBHGBYE9D2YBX1T4TFS5 / run_01M0F7QC9439616R512E7GJKQP 按预期 exit 7。explain_failure 返回:

  • cause:process exited with code 7
  • suggested fix:先检查 stderr,并修正 command、working directory、依赖或输入;
  • next action 为 tail_logs,明确说明 unchanged retry 很可能原样失败;
  • 未建议 retry_job,未重试,也未取消健康任务。

MCP client 改为每请求独立 httpx.AsyncClient 后,native2 的 114 次和 native5 的 68 次原生调用均未再出现 Event loop is closed;native5 的 17 次并发读同样为 0 错误。

Streamable HTTP 现在使用 constant-time Bearer verifier。正确 token 的全部原生调用通过; 错误 token 的独立原生 Codex 探针在 MCP 初始化时收到 HTTP 401,工具未注入。stdio 保持 单客户端模式,不叠加 HTTP transport auth;上游 server 的 scope 仍决定 write tools 是否可用。

  • MCP:跨 event loop/concurrency 生命周期隔离;HTTP Bearer 鉴权。
  • Checkpoint:示例按 GPUCTL_RUN_ID 隔离;watcher 支持嵌套路径且跳过 sibling run; 共享物理路径拒绝评估;SDK/watcher replay 不重复发创建事件。
  • Metrics:GPUPlane job 内只走 SDK,同一示例不再同时由 SDK + TensorBoard 重复上报。
  • Failure semantics:未知失败先看日志和改配置,不盲目原样 retry。
  • Evaluation:提供与 skill 契约一致的 examples/mnist/eval.py --suite heldout
  • Release:CI、0.3.0 版本统一、README 工具/测试数据、Playwright smoke。

本报告支持“v0.3 在当前单机 RTX 5090、裸进程、SQLite 目标边界内可发布”。它不证明:

  • 多节点或多 GPU 分布式训练;
  • 长时间负载、断电恢复和海量 checkpoint 容量;
  • 所有训练框架的 checkpoint 目录布局;
  • 面向公网或多租户的安全性。

这些应作为后续独立容量/故障注入研究,而不是扩大本次 v0.3 结论。