# 069:KV Cache 与推测解码的机制实验 从文章目录执行,建议 Python 3.12。依赖固定为 NumPy 2.3.5。 ```bash python3 -m pip install -r code/requirements.txt python3 code/minimal_decode.py > code/smoke_test.txt python3 -m py_compile code/minimal_decode.py code/audit_results.py python3 code/audit_results.py > code/audit_test.txt ``` 本次未执行安装行,使用现有 Python 3.12.14 / NumPy 2.3.5,macOS 26.6 arm64 CPU。 无需下载权重、数据集或访问网络。运行通常不到数秒。 默认更新本目录 results.json;保留另一轮用 `--out /absolute/new/directory`,审计也传同一 `--out`。 ## 阅读次序 1. `Decoder.forward`:新增块按历史长度取绝对位置,投影 Q/K/V,拼接每层缓存,构造带偏移的因果遮罩。 2. `baseline`:对比重算整个前缀与只喂新词元。 3. `speculative`:草稿串行抽样,目标一次因果块前向,首次拒绝后裁剪,残差抽样并追加一个词元。 4. `sampling_audit`:三项概率的精确质量守恒、20万次蒙特卡洛,以及错误回退负对照。 5. `audit_results.py`:从保存文件独立核对每轮长度、工作量、统计中位数和残差采样律。 ## 固定配置 - 输入前缀 `[0,1,3,2,4,1,5,6]`;生成48项;不设 EOS、padding 或停止词。 - 两层目标、一层草稿,batch1,dim16,heads2,head_dim8,FFN32,vocab8,position容量256。 - pre-norm + tanh FFN,无偏置、无 dropout、无训练、无自然语言数据。只是小型 Transformer 风格解码器。 - 参数 float64;种子69/70/71;草稿和目标分别由相同种子初始化,前段权重相同,层数和输出头不同。 - 贪心使用 argmax 的单点分布,平局由 NumPy 首索引规则处理;随机模式温度1,不启用 top-k/top-p/惩罚。 - 贪心检查 gamma1/4/8;随机模式 gamma4并逐轮核对;同参数草稿单独检查全接受及 bonus。 - 每轮始末目标缓存长度为已提交长度减1。非终止轮草稿全接受时可能再少1,下一轮输入其未缓存尾部,可能一次补两项。 - 为避免超过输出预算,每轮草稿长度最多剩余预算减1;最后一轮可能 gamma0,计入 full_rounds 但不计入 proposed。 - gamma0终止轮不调用草稿,其缓存保持上一轮长度;相对最终提交序列可能落后三项。已终止,无需补齐;审计逐轮重建实际有效长度。 - 每轮实际审计会完整重算 logits 和两套缓存;计时关闭这些额外审计。 - 计时初始化固定种子69,每条路径单独预热一次、顺序执行7次,含 prefill、RNG创建、抽样、Python循环、复制,不含模型构造/文件IO。 - 所有目标调用含 prefill;layer_tokens按层累计位置,不是 FLOPs;score_cells包括矩阵中最终被mask的单元。 - 缓存字节仅有效数组载荷。裁剪用copy释放拒绝后缀的底层数组;未测峰值RSS/GPU显存。 ## 证据边界 浮点误差阈值1e-10;概率负对照蒙特卡洛误差阈值0.01,错误策略TV需大于0.04(解析值0.06)。 蒙特卡洛只核验固定三项单步分布,非自然语言完整联合分布检验;逐轮多词元机制由确定性缓存/logits审计支撑。 未运行 Transformers/T5X、论文大模型、CUDA、旋转位置、滑窗、低精度、结束符或多批输入。 本实验输出无语言含义;没有论文准确率/吞吐复现结论。