实验方法¶
最小实验不是缩小项目规模,而是隔离一个机制并保留能证伪它的观察。质量、正确性、性能和资源需要分别测量,再解释它们之间的关系。
实验卡¶
每次实验固定:
| 项 | 最小记录 |
|---|---|
| 问题 | 可证伪假设、预期机制、成功与失败条件 |
| 对照 | baseline、唯一主要变量、保持不变的条件 |
| 输入 | 数据快照、slice、tokenizer、模板与采样方式 |
| 模型 | checkpoint、adapter、精度、上下文与解码参数 |
| 代码 | commit、依赖、kernel、编译与运行时版本 |
| 系统 | 硬件、拓扑、驱动、并行布局和资源限制 |
| 统计 | 指标、样本数、重复、seed、停止规则与区间 |
| 产物 | 原始输出、日志、trace、失败样本与结论边界 |
“其余配置相同”不够具体。至少保存实际解析后的配置和派生量,例如 global batch tokens、有效 loss tokens、KV bytes 与请求长度分布。
四类实验¶
语义 reference¶
用手算、FP64 小张量或确定性状态机固定目标。入口见手撕实现。
等价性¶
比较优化前后 forward、backward、状态转移和随机分布。先找第一个分叉点,不用最终 logits 容差掩盖中间错误。
消融¶
一次只改变能解释因果的问题变量。若同时换数据、tokenizer、训练时长和模型结构,结果只能说明整套 recipe 不同。
压力与故障¶
主动构造极端长度、空 mask、零方差、OOM、worker 退出、工具超时、注入和 stale cache。happy path 不能代表可靠性。
实现路径¶
| 路线 | 入口 |
|---|---|
| 输入协议 | Tokenizer、序列构造 |
| 模型数学 | 张量原语、Decoder-only Transformer |
| 替代结构 | 递推与记忆、多模态原语 |
| 学习目标 | 训练目标 |
| 序贯决策与策略优化 | 强化学习、LLM 策略优化 |
| 集群语义 | 分布式与容错 |
| 服务状态 | 推理引擎 |
| 外部系统 | 检索与智能体 |
| 额外计算 | 推理时计算 |
| 结论可信度 | 评测工具 |
与正文怎样配合¶
每个通用机制的最小语义核先放在正文第一次完整解释它的位置:例如 RoPE、packed GAE、KV page table 和配对重采样。这些代码与公式共用符号,并用少量断言固定最容易写错的边界。
本区在此基础上继续完成三件事:
- 把相邻机制组装成完整数据流或小系统;
- 扩展退化输入、故障注入、梯度和等价性测试;
- 对照直白 reference、向量化实现与生产系统必须保留的不变量。
正文中的主实现默认展开。较长的辅助代码、状态机和完整测试可以折叠,但仍可搜索、复制并通过标题深链。这里的 reference 同样不包含 CLI、配置和部署脚手架;需要生产系统时继续核对正文契约与成熟实现。
正确性矩阵¶
每个算子或状态机至少覆盖:
- identity:退化为已知实现或不改变输入;
- mask:被屏蔽内容不影响输出和梯度;
- degenerate:空、单元素、零方差、全相同、容量耗尽;
- partition:切 block、microbatch、rank 或 chunk 后语义不变;
- resume:中断恢复与连续执行一致;
- version:不兼容 tokenizer、layout、schema 或 checkpoint 被拒绝;
- failure:错误类别显式返回,不被吞成普通零值。
性能实验¶
- 用性能模型先算 FLOPs、bytes、通信与峰值显存;
- 固定硬件功耗、时钟、NUMA 与网络拓扑;
- 预热 kernel、allocator、编译图和 cache;
- 使用真实 shape 与长度分布,不只测整齐方阵;
- 区分 host、queue、kernel、通信与同步时间;
- 同时报吞吐、p50/p95/p99、显存、能耗与质量;
- 给出置信区间和运行间方差;
- 保存 profiler trace,并解释瓶颈为何出现。
只报峰值 utilization 会遗漏有效工作比例;只报 tokens/s 会遗漏 SLO 违约。推理服务应优先看 goodput。
复现层级¶
| 层级 | 能说明什么 |
|---|---|
| 接口可运行 | 环境与基本调用兼容 |
| reference 对齐 | 数学或状态语义一致 |
| 指标接近 | 在给定数据和协议上接近 |
| 消融重现 | 机制方向得到支持 |
| 跨规模/硬件重现 | 外推边界扩大 |
一个层级通过不能自动推出下一层。作者报告、开放代码、开放权重与独立复现也应分开记录。
失败记录¶
失败实验保留:
- 首个异常 step 与最后一个正常 checkpoint;
- 输入、随机状态、数据 cursor 和并行布局;
- 最小复现与完整运行的差异;
- 被排除的假设及证据;
- 修复后的回归样例;
- 结论仍未知的部分。