v0.3 发布验收(CI + 原生 MCP 真机研究)
日期:2026-08-20 结论:PASS(v0.3 的单机/小规模裸进程 + SQLite 边界内) 真机:WSL2,NVIDIA RTX 5090 32GB 研究 Agent:GPT-5.6 Luna,通过 Codex 原生
gpuctlMCP 工具调用
本轮发布验收补齐 CI、版本、README、前端浏览器 smoke、MCP 并发与鉴权,
并让一个全新的 Luna 研究 Agent 在看不到实现的条件下完成真实训练、监控、
失败诊断、checkpoint 评估、比较和推荐。最终证据支持合并到 main;它不等同于
多节点、长时间 soak 或任意模型工作负载的生产验证。
决策契约与方法
Section titled “决策契约与方法”- 决策:当前 v0.3 是否可以合并到
main并作为本地 GPU 控制平面发布。 - 包含:Python/前端质量门、20 个 MCP 工具、真实 GPU 训练与评估、语义一致性、 checkpoint 数据完整性、并发与失败路径、HTTP MCP 鉴权。
- 排除:多节点训练、数日 soak、不同框架的大模型训练、跨公网暴露和多租户。
- 发布阻断规则:任何 checkpoint 交叉污染、错误推荐、未鉴权写入口、原生 MCP 传输不稳定、质量门失败,均判定不通过。
- 黑盒约束:Luna 只能读取
AGENTS.md与三个 gpu-training skills,并直接调用 model-visiblegpuctl工具;禁止 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 |
研究迭代与负面证据
Section titled “研究迭代与负面证据”| 迭代 | 观察 | 诊断与处置 | 结果 |
|---|---|---|---|
| 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,不复用这些记录。
native5 真机结果
Section titled “native5 真机结果”原生会话 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_runs、compare_checkpoints、run 级和 experiment 级
get_best_checkpoint 均选择 baseline checkpoint,值为 0.11983935413360595,
且 source=evaluation,不存在训练 fallback 掩盖评估空洞的问题。
失败、并发与鉴权
Section titled “失败、并发与鉴权”受控 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。
非声明与后续边界
Section titled “非声明与后续边界”本报告支持“v0.3 在当前单机 RTX 5090、裸进程、SQLite 目标边界内可发布”。它不证明:
- 多节点或多 GPU 分布式训练;
- 长时间负载、断电恢复和海量 checkpoint 容量;
- 所有训练框架的 checkpoint 目录布局;
- 面向公网或多租户的安全性。
这些应作为后续独立容量/故障注入研究,而不是扩大本次 v0.3 结论。