结构指标无法区分「稳定的世界」与「停住的世界」
长会话中真正要紧的退化不是画面损坏,而是世界不再响应,同时每一帧单独看仍然完好。下面是同一输入下的两次运行:一次持续演化,一次没有。
停住的那次结构分是 0.181,仍在演化的那次是 0.171。只按结构排序,前者更优。差别只出现在第二个量上:0.713 对 0.092,相差八倍。
因此我们把长程行为定义为一个合取:结构不得坍缩,且块间运动不得衰减。此前仅凭结构判据通过的结果全部按双判据重估,本页给出的是修正后的结论。
用解码帧标定结构指标
一个指标只有当它的取值对应可观测的东西时才有用。我们取结构分两端的块做全量解码:0.035 时画面是饱和白区,没有可恢复的几何;0.33 时人物、墙面纹理与纵深次序都能分辨。也就是说这个量程覆盖了「场景内容存在与否」,而后续所有结论正依赖这一性质。
把该梯度方法改造成常数显存开销
公开的形式化中已指出:直接的可微缓存实现会超出可用显存。我们复现了这一点,22.9GB 对 24GB 预算。把一步拆成两遍——先在 no_grad 下做 rollout,再在静态因果 mask 下做一次可微重建——整步峰值回到基线。机制是:全程只有一次前向携带梯度,分片优化器因此能像平常一样逐单元 reshard。
整步峰值 10.11GB,与关闭该方法的基线相等。
该方法的边际显存开销:≈0。同一步、同 batch、同分片配置下测得
同一批运行的质量结果是负的。5 seed × 220 块下四项指标无显著差异,点估计略偏向基线;训练 loss 前后 1/4 从 0.2209 变到 0.2207。显存结论与质量结论我们分开报告,因为它们是两个命题,而只有前者被支持。
五种降块延迟的干预,其中四种为净负
下列每一项都做了实现,并在**完整管线**上计时,而不是只测受影响的 kernel——两者结论不一致。数值是相对未修改配置的块延迟变化量。
当前块延迟 672ms。游戏级预算是 33ms。
相差 20 倍。我们自己的近期目标 300–400ms 仍差 2 倍。这批卡不支持 FP8
这张表支持的结论比「延迟是硬件问题」要窄:在我们实现的五种干预里,没有一种是划算的;分辨率那一项把开销定位在深度而非序列长度。这与受硬件约束的判断一致,但并未确立它。我们认为仍可信的杠杆是换更小的骨干,它需要重走蒸馏与动作条件适配,我们尚未验证。
运动幅度在第 7 块后衰减,两个候选机制均被否定
块间运动在前六块保持平稳,随后单调下降,到第 60 块累计 −45%。有两个机制足够合理,值得直接检验。两者都与测量不符。
与不叠该方法的同规模对照权重做受控对照,单一变量:5 seed 下斜率 −0.039±0.007 与 −0.032±0.018。差值落在种子离散度内,且点估计偏向叠了的那一版。重训的立论前提不成立。
窗口大小除下来正好是七块,与起点吻合。但加宽之后起点不变:三种窗口在前七块上逐位一致,两个较大的在此之后也彼此一致,说明另有约束在起作用。
在有候选机制通过检验之前,我们不给出机制解释。
上面两个候选都已被我们自己的数据否定。一个听起来正确、却未经检验的解释代价更高,因为它会终止搜索
十条假设、否定它们的测量,以及各自的代价
每一条都合理到值得投入,而每一条都被我们自己的数据否定。条的长度是被否定之前花掉的工作量。若某次否定同时使更早的结论作废,会在条目里注明。点开看具体测量。
所有评估——守卫、感知验证、显存工作、漂移暴露、动态 sink、缓存回滚——都没传那个开关,因此跑在 sink 关闭的状态下,而交付版本里它是硬编码开着的。正确配置下 5 seed × 400 块斜率全为正、根本没有坍缩。那六轮并不是在测量一个真实存在的缺陷。现在任何评估之前都要逐项比对实验配置与交付配置;就本例而言,启动时的一行日志即可暴露。
塌缩块数恶化 1.5~14×。蒸馏让学生匹配教师在给定上下文下的分布;当上下文是累积漂移时,教师的输出也与漂移自洽——等于在教模型顺着糊下去。正确形式是污染输入配干净目标,我们做成了污染输入配自洽目标。
5 seed × 220 块:四项指标无显著差异、方向略差。训练 loss 前后 1/4 从 0.2209 到 0.2207。显存问题解决了,算法问题没有。
修好一个被静默覆盖的随机种子之后发现:同一配置跨 seed 的离散度(1.13–3.73)远大于配置之间的差异。此前所有消融都是在解读噪声,建立在它之上的机制解释也一并作废。
净 +126ms(540 对 414)。裸整数矩阵乘在真实形状上确实快 2.1–3.7×,但手写量化/反量化的访存让整层更慢;融合 kernel 在前馈上快 2.78×,却要求管线并不使用的 dtype,305 层的转换把收益全部吃掉。孤立 GEMM 基准不等于替换后的耗时。
受控对照,单一变量。斜率 −0.039±0.007 与 −0.032±0.018——完全落在种子噪声内,且叠了的方向上还更好。整体重训的立论前提就此消失。
很诱人:319ms 对 508ms。但输出是 NaN——运动指标达 6.2e6;再小一档全是零。三档都无报错跑完,各产出 200 个输出文件,延迟数据也符合预期。日志里没有任何信息能把可用的那一档与另外两档区分开——这类改动的验收标准因此必须是解码后的画面,而不是「跑完了」。
算术吻合得完美。加宽窗口之后什么都没动:三种尺寸在前七块上逐位相同,两个较大的在之后也彼此相同——说明被统一钳制,而且都掉到接近冻结。
在较低分辨率上稳定把斜率从 −0.023 转正到 +0.009,两个 seed 复现。在交付分辨率上两个 seed 方向相反。一个分辨率上调出的超参不能迁移;沿用换来的是零收益加 13% 的细节代价。
用两个解码器对同一批 latent 解码并直接比较,轻量解码器更锐。这与我们内部持有数月的一个假设相反。主导因素是分辨率:所比较的两档像素面积相差 2.5 倍。
跨会话的质量下降源于残留状态,而非模型
用户反馈会话内画面逐渐变糊,并偶尔出现上一次会话的内容;而离线以相同分辨率与权重运行时两者都不出现。以连续三次会话的首帧字节数做隔离,可确定性地复现该下降,从而把故障定位在模型之外。有三处缓存越过了会话边界。
修复前 —— 首帧逐次劣化
修复后 —— 字节级完全一致
102383 / 102383 / 102383 字节
| 注意力缓存 | reset 只把索引清零,张量内容原样留着;sink 与滚动窗口于是读到本会话从未写入的槽位 |
| 交叉注意力缓存 | 只重置了「已初始化」标志 |
| 解码器时序缓存 | 真凶——流式解码故意跨调用保留时序状态,这是对的,但没有任何地方在会话之间清理:第二个玩家的第一块,被当作第一个玩家的续帧解码 |
三次会话的首帧字节数:修复前 102KB / 62KB / 67KB,修复后完全一致。
这同时解释了离线与实时画质之间长期存在的差异:离线每次调用都是新进程,因而缓存为空
第二个效应只在交互下出现:全零动作向量不是停止指令。松开全部输入后,模型仍从上下文继续传播运动,实测松手后第一块为 1.181、按住时为 1.235,需 6~8 块、约五秒才收敛。这段时间内控制不可用。我们目前在推理侧抑制它——无输入时冻结世界——这是服务层的缓解措施,不是模型层的修正,我们如实记录。
哪些可从已发表工作中获得,哪些必须在这里测出来
已发表工作中可得
- 一个开源基座
- 蒸馏、低秩适配、attention sink、KV 缓存
- 一个可用的单会话演示
本工作中由测量确立
- 一套经解码帧标定的双判据,可区分「稳定的世界」与「停住的世界」
- 十条被否定的假设及否定它们的测量,其中一条使此前六轮优化作废
- 持续服务下的失效模式:三处缓存越过会话边界、输入释放后的惯性、以及一个无报错跑完却产出 NaN 的粒度设置
- 消费级硬件上一个被刻画过的运行点,显存与延迟边界是定位出来的,不是估计的
- 一处仍未解释的衰减,两个主要机制均已排除
这项工作背后的立场是:本地硬件是控制权的载体。一个只能通过别人的数据中心才能用到的模型,属于拥有那个数据中心的人;把推理搬到用户自己的设备上,是改变这一点的具体一步。它首先是一个研究问题和工程问题,因此这一页给出的是测量,不是主张。放回这个目标记一次账:显存已不再是约束;延迟仍然是——相对我们自己的目标差 2 倍、相对游戏级预算差 20 倍,且没有找到能补上的算法杠杆;另有一处衰减仍未解释。下一步要验的是更小的骨干。