首页
应用
关于
Search
1
Pytorch DDP
2,482 阅读
2
Pytorch 常见问题
1,515 阅读
3
视频时序切分
1,341 阅读
4
中文场景下的CLIP图文预训练
1,044 阅读
5
Semi-Supervised + Noisy Label
1,028 阅读
AIGC
AIGC Daily Papers
AIGC Fundamentals
其他
职场经验复盘
多模态理解
购房/投资
阅读
广告
Segmentation
LeetCode
Pytorch
Python
Shell
C++
常用链接
Search
标签搜索
AIGC
人工智能
论文速读
ai
视频生成
DiT
对齐
蒸馏
扩散模型
attention
transformer
图像生成
视频编辑
diffusion
基础知识
稀疏注意力
多模态
文生图
NVIDIA
llm
Jefxiong
累计撰写
205
篇文章
累计收到
8
条评论
首页
应用
栏目
AIGC
AIGC Daily Papers
AIGC Fundamentals
其他
职场经验复盘
多模态理解
购房/投资
阅读
广告
Segmentation
LeetCode
Pytorch
Python
Shell
C++
常用链接
页面
关于
搜索到
205
篇与
人工智能炼丹君
的结果
2026-09-11
AIGC 每日速读|2026-09-11|阿里13模型不会专业剪辑-CutCraft
今日 AIGC 论文速览 今日共 10 篇 · 音视频创作评测与安全 2 篇 · 可编程世界与物理视频 2 篇 · 生成后训练与统一多模态 2 篇 · 图像编辑与多视角生成 2 篇 · 设计自动化与合成数据 2 篇 重点论文标题列表 CutCraft(阿里巴巴、上海交通大学、复旦大学等):13模型不会专业剪辑 Programmable World Model(Alaya Lab):规则状态准确率98% ⚡ DIVA(Peng Li 等(ACM MM 2026)):参考图放大越狱风险 GGF(上海交通大学、中国电信人工智能研究院、中国科学技术大学):模型用自绘图反哺理解 FlowCPO(西湖大学、浙江大学、快手可灵团队):离线对齐GenEval达0.84 今日论文速览 1. CutCraft:13模型不会专业剪辑 Beyond Coherence: Benchmarking Professional Editing-Technique Execution in Multi-Shot Audio-Video Generation | 阿里巴巴、上海交通大学、复旦大学等 | arXiv:2609.08275 关键词:音视频生成,多镜头,剪辑评测,生成智能体 ⚠️ 前序问题:多镜头音视频模型已经能做出连贯、电影感强的片段,但现有评测多看画质、同步和物理合理性,无法判断模型是否真的执行了 J-cut、L-cut、转场时机和蒙太奇等专业剪辑指令。看起来像电影,不代表遵守了剪辑语法。 本文贡献:CutCraft 把结构化多镜头提示扩展为显式剪辑规格,并用镜头结构对齐、专家模型指标、工具化多模态判断和规则问答构成分层评测。作者还给出一个生成智能体基线:先规划镜头,再逐镜生成,最后做后期合成,使剪辑语义变成可执行步骤。 实验效果:对 13 个闭源与开源音视频生成模型的测试显示,当前系统普遍能维持内容连贯,却经常错过规定镜头数、转场关系和高阶蒙太奇;美学质量与剪辑指令遵循只有弱相关。智能体基线说明把剪辑拆成规划、生成和合成后更容易显式执行专业语法。 批判点评:混合评测仍依赖专家模型和多模态裁判,复杂剪辑意图可能被评分器误读。后期拼接能提升指令遵循,却可能掩盖底层生成模型不会原生控制镜头的问题;基准对真实剪辑师工作流、版权素材和长叙事的覆盖仍有限。 2. Programmable World Model:规则状态准确率98% Programmable World Model | Alaya Lab | arXiv:2609.10540 关键词:世界模型,视频生成,可编程状态,交互游戏 ⚠️ 前序问题:交互式视频世界模型能生成逼真的下一帧,却通常把角色生命值、阵营、库存和任务进度隐含在像素历史里。实体离开画面后,模型容易忘记它是否存活;自然语言提示也只能描述结果,无法保证规则在长时间交互中被稳定执行。 本文贡献:Programmable World Model 把世界状态演化与视觉生成拆开。编码智能体把自然语言规则写成可执行程序,轻量引擎维护包含屏外实体和非视觉属性的权威状态;状态增强的 3D 定向包围盒再经确定性编译器投影成身份、语义和运动方向控制图,预训练视频模型只负责把状态渲染成画面。 实验效果:在作者新建的 CombatStateBench 上,系统的存活角色数量准确率达到 94%,状态准确率达到 98%,并能在长时战斗交互中维持实体状态。它还支持用户预先编写游戏机制、逐个控制实体,并在镜头移开后继续保存世界事实。 批判点评:显式引擎让规则可验证,但也把开放世界压缩成包围盒、离散属性和手写转移规则;复杂物理、细粒度姿态与不可预设事件仍交给生成器补全。论文基准集中于战斗场景,面对大规模地图、多玩家并发和长期程序错误时的扩展性仍待验证。 3. DIVA:参考图放大越狱风险 The Price of Consistency: Exploiting Visual Anchors for Multimodal Jailbreaking in Video Generation | Peng Li 等(ACM MM 2026) | arXiv:2609.07216 关键词:视频生成,安全评测,多模态越狱,参考图控制 ⚠️ 前序问题:图生视频用参考图锁住主体和场景,提高时空一致性,但安全系统往往只重点审查文字。模型原本可能把危险提示漂移成无害内容,视觉锚点却会把生成过程拉回参考图中的危险意图,形成一致性越强、逃逸空间越小的安全悖论。 本文贡献:DIVA 是一个免训练多模态越狱框架,把危险意图拆成静态参考图和看似普通的运动提示,并用双重标准筛选兼顾隐蔽性与语义保真度的组合。论文同时提出 TI2VSafetyBench,用于专门评测多条件视频生成中的视觉锚定风险。 实验效果:作者在多家主流商业平台和开源视频模型上测试,DIVA 的攻击成功率显著高于纯文本攻击,说明只过滤提示词不足以覆盖图像与运动描述共同表达的风险。论文已被 ACM MM 2026 接收。 批判点评:攻击依赖先获得合适的危险参考图,现实系统还可能在上传、编码和输出阶段做二次视觉审核。公开越狱流程有双重用途风险;防御评估需要同时覆盖输入图、运动文本、跨模态组合和生成结果,且必须在平台更新后持续重测。 4. GGF:模型用自绘图反哺理解 Dreaming in Flow: Generative Grounding Feedback for Self-Evolving Unified Multimodal Models | 上海交通大学、中国电信人工智能研究院、中国科学技术大学 | arXiv:2609.08282 关键词:统一多模态,自训练,流模型,图像生成 ⚠️ 前序问题:统一多模态模型把理解和生成放进同一网络,却仍把两种能力当作独立任务训练。直接用模型自生成图像做自训练又会放大漏物体、属性错误和空间关系失真,缺少一种让生成经验反哺理解、再由理解修正生成的闭环。 本文贡献:生成接地反馈 GGF 只使用文本提示和模型自己的视觉梦境。流级反馈在同一噪声潜变量上比较文本、图像与修复条件的预测方向,把图像接地信息传回文本条件;梦境回放则通过描述和再想象,让可验证事实在两次生成间保持一致,并分离无关经验。 实验效果:在采用不同理解—生成融合设计的统一模型上,GGF 都带来一致的文生图提升,同时让视觉理解获得幅度较小但稳定的增益。方法不依赖额外成对图文数据,说明模型自身生成的图像可以成为双向训练信号。 批判点评:自生成经验仍受初始模型能力上限约束,流级一致不保证图像事实正确。回放和修复增加训练计算,如何过滤系统性偏见、避免错误闭环以及在闭源生成器上复现,仍是落地障碍。 5. FlowCPO:离线对齐GenEval达0.84 FlowCPO: A Unified Divergence View of Preference Alignment for Flow Models | 西湖大学、浙江大学、快手可灵团队 | arXiv:2609.09905 关键词:流模型,偏好对齐,离线优化,前向KL ⚠️ 前序问题:流与扩散模型的偏好对齐分成在线强化学习和离线偏好优化两派:前者必须不断从当前模型采样,成本高;后者常用正样本微调或似然比近似,既难解释与在线目标的关系,简化回归损失还可能无下界。 本文贡献:FlowCPO 用散度视角统一这些方法,并提出无需在线回滚的离线前向 KL 目标,同时利用偏好和拒绝样本。在线性插值及明确正则条件下,作者把前向 KL 上界化为可在固定数据上优化的对比流匹配损失,并证明该损失非负。 实验效果:在域内实验、CFG=3.0 时,FlowCPO 的平均 GenEval 与 OCR 分数分别为 0.84 和 0.87,高于 FlowDPO 的 0.81 和 0.74。域外测试中它取得最佳 GenEval,但多项奖励分数低于 RFT,结果并非全面领先。 批判点评:理论上界依赖线性插值和正则条件,真实大模型训练是否满足需要验证。离线数据省掉采样,却继承偏好数据覆盖与标注偏差;负样本权重、参考先验和插值系数也会带来额外调参成本。 6. PhysFlow:5万物理视频教会运动 PhysFlow: Physics-Aware Optical Flow for Motion Controllable Video Generation | 中科院自动化所、中国科学技术大学、北京航空航天大学、中关村学院 | arXiv:2609.08215 关键词:视频生成,物理一致性,光流,运动控制 ⚠️ 前序问题:视频生成器能做出漂亮纹理,却常出现碰撞错误、非刚体变形失真和前景背景接触不合理。完整物理引擎依赖准确 3D 重建和材料参数,文字或稀疏轨迹又不足以描述像素级形变,需要一种介于模拟状态和最终外观之间的密集运动表示。 本文贡献:PhysFlow 把生成拆成两步:PA-Flow 根据速度、加速度、密度和杨氏模量生成物理感知光流,分别建模全局运动与局部形变;FlowRender 再以光流视频为条件合成纹理。配套 PhysVideo 用物理引擎与 3D Gaussian Splatting 构建显式监督。 实验效果:PhysVideo 包含 1 万个前景物体和 5 万段带运动、材料属性标注的视频。实验显示 PhysFlow 在保持视觉质量的同时提升物理合理性,并能从单图处理非刚体运动、物体交互及前景背景接触。 批判点评:光流适合二维位移,却无法显式表达遮挡后的三维结构、拓扑变化和长期守恒量;两阶段误差也会累积。方法仍需用户或数据提供材料与运动属性,开放世界里这些参数通常难以可靠获得。 7. MIEdit:千组编辑基准无需调参 Multi-History-Step SDE Inversion for Image Editing with Superior Regional Awareness | 中科院自动化所、国科大(ECCV 2026) | arXiv:2609.06602 关键词:图像编辑,SDE反演,语义遮罩,免训练 ⚠️ 前序问题:免训练扩散编辑要在重建原图与服从新提示之间取舍。现有 ODE/SDE 反演步数多、编辑幅度受限,增大 CFG 还可能产生伪影;非编辑区域保护通常需要额外遮罩输入或独立分支。 本文贡献:MIEdit 用预测—校正的多历史步 SDE 反演,在每一步复用至少两个历史项,以更少步数提高稳定性和编辑可塑性;同时调整噪声日程缓解大幅编辑冲突。IASM 在反演早期借助 CFG 方向自动生成语义角度遮罩,并贯穿后续采样约束区域。 实验效果:作者构建 EditEval++,覆盖 30 个细粒度任务和超过 1,000 组图像—文本—遮罩三元组。实验显示 MIEdit 在无需微调、无需外部遮罩的条件下超过所比较方法,并能把输入重建到数值精度范围。论文已被 ECCV 2026 接收。 批判点评:多历史项会增加缓存与实现复杂度,自动遮罩质量仍依赖基础模型的 CFG 响应。论文主要围绕扩散 SDE 编辑,迁移到流匹配模型、超高分辨率和多对象关系编辑时是否稳定还未充分验证。 8. StreetDiff:全景约束街景多视角 StreetDiff: Multi-view Street Scenes Generation via Cross-view Consistent Multi-view Stable Diffusion with Structure Prompts | 深圳大学 | arXiv:2609.09890 关键词:多视角生成,街景,全景图,结构控制 ⚠️ 前序问题:多视角扩散在室内或简单自然场景表现不错,面对道路、建筑和动态目标密集的城市街景时,镜头旋转后容易重复物体、扭曲建筑和破坏布局。相邻视角注意力缺少球面几何对应,难维持全局结构。 本文贡献:StreetDiff 让全景分支负责全局布局、透视分支负责局部细节,并用 Panorama Alignment Module 按球面投影建立跨视角注意力约束。结构提示可来自分割图、轮廓或草图;作者还构建带文本和密集结构标注的 HDR 城市全景数据集 Street360。 实验效果:实验显示 StreetDiff 在街景生成质量和多视角几何一致性上超过所比较基线,尤其改善纯文本条件下的建筑与道路结构;它无需修改扩散骨干即可注入几何对齐。 批判点评:球面全景是有效的全局脚手架,但真实街区包含强遮挡、动态交通和大范围深度变化,二维投影约束仍可能失效。Street360 的地域与天气覆盖、从合成多视角到可导航 3D 场景的差距也需要检验。 9. LoGAN:少量字形扩展27种语言 LoGAN: Multilingual Font Localization with Generative Agents | Netflix(ECCV 2026) | arXiv:2609.07029 关键词:字体生成,多语言,VLM智能体,扩散模型 ⚠️ 前序问题:把一个品牌字体或电影 Logo 本地化到新语言,不只是生成单个字形,还要保留笔画风格、纹理、颜色、字距和字偶距。通用生图模型常改乱排版,传统字体生成又难从拉丁字母跨到结构复杂的中日韩字符。 本文贡献:LoGAN 用 VLM 智能体协调字形级扩散、少样本风格微调、字距与字偶距迁移以及纹理扩展模块。输入少量原字体字形或 Logo 字母后,系统分别解决结构、排版和材质,再组合成目标语言的完整字符集。 实验效果:论文覆盖超过 27 种语言,包括拉丁、希腊、西里尔与中日韩文字;在字体和真实 Logo 数据上,相比字体专用模型及 FLUX、Nano-Banana 等编辑模型取得更高字形保真度,并更好保持风格、纹理和字距。400 个电影 Logo 样本中有 44% 基于字体制作。 批判点评:多模块流水线提升可控性,也放大任一环节的误差和运行成本。少数字形可能不足以覆盖复杂脚本的部件组合、书写规范与文化设计语义;字体版权、人工修字和完整字符编码支持仍是商业落地条件。 10. AnomalyCraft-700K:4万异常视频70万标注 AnomalyCraft-700K: Component-Level Controllable and Verifiable Synthetic Anomalies for Fine-Grained Video Anomaly Understanding | 西北工业大学、新加坡管理大学 | arXiv:2609.06978 关键词:视频生成,异常检测,合成数据,多模态理解 ⚠️ 前序问题:真实异常视频稀少、难控制,已有合成数据通常只按类别或整句提示生成,提示与画面细节不一定一致,也缺少靠近正常—异常边界的困难正常样本,模型容易根据表面线索而非事件语义判断。 本文贡献:AnomalyCraft 把异常事件拆成场景、背景、主体、物体和有向交互五类组件,通过三阶段生成逐步放松非关键约束。相同组件同时作为核验单元,定位并人工修正视频—文本偏差;每个异常类别还配套语义接近但实际正常的困难反例。 实验效果:数据集包含超过 4 万段视频和 70 万条任务级文本标注,覆盖从异常检测、检索、描述到细粒度推理的六类任务。传统模型和多模态大模型评测都显示,它能为异常检测与理解提供有效监督。 批判点评:合成器的视觉偏差可能成为捷径,组件级人工修正也带来高成本和主观性。模型在该数据上提升不代表真实监控、开放场景和未见异常同样受益,需与真实数据混合训练并做跨域验证。 趋势观察 生成评测开始检查专业过程 CutCraft不再只看画质和连贯性,而是逐项检查镜头、转场和音画剪辑语法,说明创作模型的评价对象正在从结果扩展到过程执行。 世界模型从像素记忆走向权威状态 Programmable World Model把规则与实体状态交给可执行引擎,生成模型退回渲染器角色;可验证状态开始成为长期交互的一等公民。 条件越强,跨模态安全面越大 DIVA揭示参考图既提升一致性也会固定危险意图;安全策略需要联合审查图像、文字运动条件与输出,而不能只过滤提示词。 生成模型用结构中间态换取控制 从PhysFlow的光流、StreetDiff的全景几何到MIEdit的语义角度遮罩,低维且可解释的中间表示正在连接高层意图与像素生成。 人工智能炼丹君 整理 | 2026-09-11 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月11日
8 阅读
0 评论
0 点赞
2026-09-10
AIGC 每日速读|2026-09-10|90%稀疏视频DiT加速2.63倍-RoLA
今日 AIGC 论文速览 今日共 10 篇 · 高效与流式视频生成 3 篇 · 可控动作与手语生成 2 篇 · 生成基础设施与评测 3 篇 · 图像生成与编辑 2 篇 重点论文标题列表 RoLA(北京大学、清华大学、电子科技大学、阿里巴巴等):90%稀疏视频DiT加速2.63倍 Mask Forcing(香港科技大学(广州)、香港科技大学、加州大学圣迭戈分校等):给自回归蒸馏注入干净令牌 FlexMoGen(布朗大学、Epic Games、加州大学戴维斯分校、犹他大学):文字定内容,参考动作定风格 Decoupled SF(Yanru An 等):流式数字人15.4FPS且延迟1.3秒 Miles v0.1(RadixArk):744B模型异步RL跑上64张GB300 今日论文速览 1. RoLA:90%稀疏视频DiT加速2.63倍 RoLA: Rotary-Positioned Low-Rank Linear Attention for Efficient Diffusion Transformers | 北京大学、清华大学、电子科技大学、阿里巴巴等 | arXiv:2609.06712 关键词:视频生成,稀疏注意力,线性注意力,扩散Transformer 前序问题:视频扩散 Transformer 的时空令牌很长,稠密自注意力随序列长度平方增长。稀疏分支可以省计算,却会丢掉维持场景、运动和语义一致性的远程联系;现有低秩全局补偿又难同时保留 3D RoPE 的相对位置结构与可复用的线性摘要。 本文贡献:RoLA 将注意力拆成固定稀疏局部分支与低秩全局分支。它先把查询和键投影到低秩空间并通过非线性,再施加截断后的预训练 3D RoPE;这样旋转不会被非线性打乱,全局键值摘要可对所有查询复用。令牌级门控负责把局部尖峰与平滑全局背景重新融合,无需新增位置参数。 Architecture overview of the proposed method. (a) Dense 3D-RoPE attention decomposes into sparse top-$k$ spikes and a residual background. (b) The method replaces dense attention in pre-trained DiT blocks with sparse--low-rank branches and gated fusion, reusing backbone RoPE without additional positional embeddings. The right part shows the rotary low-rank branch and distribution-aware gated fusion. 实验效果:在 Wan2.1-14B 的 720p、81 帧设置上,RoLA 在 90% 稀疏率下仍保持有竞争力的生成质量,并在单张 NVIDIA H100 上取得 2.63 倍端到端推理加速。机制实验中,截断秩 r=64 的时间与高度相对位置余弦相似度都达到 0.93。 Deployment-oriented efficiency summary on RTX 5090 (different from the benchmark evaluation setting). Panel (a) shows representative fixed-setting deployment latency, panel (b) shows theoretical self-attention FLOPs per denoising step, and panel (c) shows long-sequence deployment latency. 批判点评:RoLA 需要对替换注意力后的完整骨干做单阶段全参数微调,部署收益并非零训练获得。低秩分支只解决高稀疏率下的全局补偿,稀疏局部分支本身沿用既有方案;更长视频、不同 RoPE 划分和消费级 GPU 上的质量—速度曲线仍需验证。 2. Mask Forcing:给自回归蒸馏注入干净令牌 Mask Forcing: Improving Autoregressive Video Diffusion Distillation via Dual-Noise Masking Rollout | 香港科技大学(广州)、香港科技大学、加州大学圣迭戈分校等 | arXiv:2609.09123 关键词:视频生成,自回归扩散,分布匹配蒸馏,模式坍塌 前序问题:用反向 KL 的分布匹配蒸馏把双向视频扩散教师压成因果学生时,目标偏向追逐少数高概率模式。学生在自回滚中容易越来越饱和、平滑,并把早期误差持续传给后续片段。 本文贡献:Mask Forcing 在学生自回滚期间沿空间和时间轴随机遮罩,用更干净、较低噪声的令牌替换部分高噪声输入。扰动让学生探索教师分布中尚未覆盖的区域,同时干净令牌给邻近噪声令牌提供去噪参照,从而缓解模式坍塌与长时误差积累。方法可插入多种 DMD 自回归蒸馏流程,不需要真实视频或额外后训练阶段。 实验效果:在 30 秒 LongLive 设置上,加入 Mask Forcing 后 HPSv3 从 8.44 提升到 9.11,VBench 总分从 83.91 提升到 84.51,语义分从 80.70 提升到 81.44。论文还报告它在逐帧和分块设置下普遍改善视觉质量与指令遵循。 批判点评:收益依赖遮罩比例、噪声窗口和更新粒度,表明它仍是一套需要按骨干与任务调参的训练策略。论文主要在既有因果视频蒸馏管线上验证,尚未说明对完全不同教师、极长序列或交互式状态更新是否同样稳定。 3. FlexMoGen:文字定内容,参考动作定风格 Flexible Motion Generation from Language and Style References | 布朗大学、Epic Games、加州大学戴维斯分校、犹他大学 | arXiv:2609.08032 关键词:人体动作生成,文本到动作,风格迁移,潜扩散 前序问题:文本很适合描述“做什么”,却难精确表达节奏、肢体发力和情绪动态;离散风格标签又无法覆盖未见风格、长动作或同一序列里的风格切换。 本文贡献:FlexMoGen 同时输入自然语言与风格动作片段,用无风格标签监督的变分编码器提取连续风格,再通过轻量适配模块调制文本到动作的潜扩散模型。统一预训练、相对位置编码和时变风格控制使模型可以合成长序列、多风格过渡以及未见过的文本—风格组合。 Overview of our style-adapted text-to-motion framework. The input content motion $x_c$ is encoded by a pretrained motion encoder, and Gaussian noise is added to its latent embedding. The text-to-motion (T2M) model (top right) consists of $7$ Transformer encoder layers that take motion, text, and time embeddings as inputs. Each self-attention block incorporates relative positional encoding into the key and value projections. During style finetuning, the T2M backbone is frozen, and only the weight matrices $W_s^{K}$ and $W_s^{V}$ in the Style Adaptation Module (SAM) are trained. SAM encodes a style example $x_s$ and injects its outputs as additive biases to the $K$ and $V$ vectors in the attention layers, guiding the network to preserve the semantics of $x_c$ while reflecting the style of $x_s$. 实验效果:22 名参与者给出 330 次成对判断。相对 SMooDi,FlexMoGen 在内容保持、风格反映和整体动作质量上的偏好率分别为 61.1%、67.7% 和 71.3%;相对 T2M+MP,内容和质量偏好率达到 82.1% 与 94.0%。 User study results (pairwise preference, % favoring ours). Left: FlexMoGen vs. T2M+MP. Middle: FlexMoGen vs. SMooDi. Right: FlexMoGen vs. LoRA-MDM. Criteria are content preservation, style reflection, and motion quality. 批判点评:风格参考本身可能同时携带动作内容,编码器是否真正解耦仍难完全证明。用户研究规模较小,长序列测试只含一次风格过渡;快速连续切换、接触物理和手部细节还需要更严格评测。 4. Decoupled SF:流式数字人15.4FPS且延迟1.3秒 Decoupled Self-Forcing Distillation for Streaming Talking Head Generation | Yanru An 等 | arXiv:2609.10317 关键词:说话人视频,流式生成,自强制蒸馏,动作潜变量 前序问题:端到端音频驱动视频扩散把音频条件融合到整幅视频潜变量,而身份、背景和外观大多与音频无关,既浪费容量也容易模糊细节。便宜的两阶段方法先生成动作,再渲染视频,却常因动作空间监督不足而损失画质。 本文贡献:该方法先在与身份解耦的低维动作空间里融合音频和动作字幕,由小型因果自回归 Transformer 生成动作潜变量,再交给预训练扩散渲染器。解耦自强制蒸馏用同一个冻结视频教师监督两条流:有动作条件时蒸馏因果渲染器,无条件时以真实视频给渲染回滚打分,反向约束动作生成器。 Overview of Motar. (a) An AR motion transformer models causal dependencies over motion latents, with an efficient diffusion head producing continuous-valued latents; a user-written motion caption and the driving audio are fused into a global condition query by a Q-Former projector. (b) Hierarchical conditioning: the global query is injected by full cross-attention for coarse, sequence-level control, while raw audio embeddings are injected by windowed cross-attention for frame-level lip articulation. (c) Decoupled self-forcing distillation: the frozen bidirectional teacher $G$ supervises both branches by distribution matching. Conditioned on motion, it distills $G$ into a block-causal student $G_\phi$; unconditionally, it matches the rendered motion rollout against the distribution of real talking videos. 实验效果:动作生成与视频渲染两条因果流并行运行,论文报告达到 15.4 FPS、首段延迟 1.3 秒,并称相对非流式教师没有质量退化。 Qualitative comparison with Wan-based end-to-end methods. For each result we show five frames with the spoken word beneath; the phoneme being articulated is highlighted in red (e.g. the “oo” in “look”), so that lip shape can be checked against the sound at each frame. Our method produces the tightest audio--lip alignment and the sharpest facial detail. 批判点评:动作空间没有天然的双向教师,论文借渲染结果间接监督,效果会受动作表示和渲染器上限共同影响。身份解耦在极端表情、遮挡与头部大幅运动下是否成立,以及跨语言口型和长时间漂移,仍需更大规模验证。 5. Miles v0.1:744B模型异步RL跑上64张GB300 Miles v0.1: Production-Level Post-Training | RadixArk | arXiv:2609.08368 关键词:大模型后训练,强化学习,SGLang,分布式训练 前序问题:前沿模型的强化学习已经包含多轮工具调用、超长回滚和异步环境,生成、训练与权重同步任一环节的不一致都会让 on-policy 假设失效;现有框架往往只覆盖某种后端或缺少生产级可观测性。 本文贡献:Miles 以 SGLang 负责回滚,训练端可选 Megatron-LM 或 PyTorch FSDP,并提供点对点、共享桶和磁盘增量等三类权重同步路径。系统统一支持全参数与 LoRA 强化学习、on-policy 蒸馏、SFT、真正的 rollout—training 对齐,并把同一架构扩展到扩散模型。 实验效果:端到端案例在 64 张 NVIDIA GB300 上对 GLM-5.2 744B-A40B 做终端编码任务的全异步智能体强化学习,前 30 个统计步骤的中位耗时为 263 秒。项目已开源代码与部署文档。 批判点评:64 张 GB300 的案例展示了规模上限,也意味着复现门槛很高。异步回滚会带来策略陈旧度、环境版本和样本重放偏差,系统提供校正机制,但不同任务下的稳定边界仍需独立验证。 6. VI-Bench:反推视频提示词最高仅得0.632 VI-Bench: Benchmarking Prompt Inversion from AIGC Videos | 中国科学院自动化研究所、弗吉尼亚大学、新加坡国立大学等 | arXiv:2609.08079 关键词:视频理解,提示词反演,生成评测,多模态模型 前序问题:视频描述只需说出画面内容,能够复现的提示词还要恢复风格、镜头运动和多镜头结构。现有视频理解基准没有测试“反推提示词后重新生成,能否回到原视频”,也难评估提示泄露风险。 本文贡献:VI-Bench 从 1610 万条真实用户提示中清洗出约 390 万条,构建 900 个经人工核验的 AIGC 视频,覆盖单镜头语义、风格与镜头控制、多镜头组合三档难度。它让 18 个视觉语言模型反推提示,再用原生成器回放,并联合原提示对齐与回放视频保真计算 Inversion Score。 实验效果:最强模型的总体 Inversion Score 只有 0.632;难度从单镜头升到多镜头后表现明显下降。主题与风格的“文本看似正确、回放却不像”差距最大,说明视频字幕能力不能替代可执行的生成控制恢复。 批判点评:提示反演同时涉及创作复用与隐私攻击,分数更高并非在所有场景都更好。基准把开放式提示压成五个维度,仍可能漏掉负面提示、采样器与种子等无法从画面稳定恢复的控制因素。 7. RelightFormer:9万物体训练多视角直接换光 RelightFormer: Feed-forward Generative Transformer for Multiview Object Relighting | 香港理工大学 | arXiv:2609.07414 关键词:图像重光照,多视角生成,生成Transformer,环境光照 前序问题:逆渲染要从图像分解几何、材质和光照,是高度欠定的优化问题;单图生成式重光照又忽略跨视角线索,难以在镜面、透明和毛发材质上保持一致。 本文贡献:RelightFormer 从视频基础模型改造出前馈生成 Transformer,用光照交叉注意力把目标环境贴图动态注入空间特征,并用对输入顺序不敏感的位置编码对称处理无序多视角。训练数据 LOD 包含 9 万个 Objaverse 物体与 3.9 万种独特光照,不显式估计法线、反照率等内在属性。 Architecture of RelightFormer. Input modalities (noise, reference images, and an environment map) are first patchified into token sequences, with ray embeddings added to encode stereo geometric priors. Noise and reference tokens are concatenated and processed through two parallel attention pathways: a multi-view self-attention module for intra- and cross-view feature aggregation, and an illumination attention module that dynamically injects lighting cues into spatial features. The outputs of both branches are element-wise summed and passed through an FFN. After the final layer, reference tokens are discarded, and the updated noise tokens are used to predict the flow-matching velocity field. For clarity, VAE encoding and decoding stages are omitted. 实验效果:在真实 OLATverse 材质分组上,RelightFormer 在多数类别取得最高前景指标;例如金属物体 sPSNR/PSNR 为 22.84/19.88,毛发物体为 17.75/14.28,并支持单视角、多视角和新视角的零样本重光照。 Qualitative results for multi-view image relighting in real-world OLATverse Dataset. 批判点评:绕过显式物理分解提升了易用性,却也降低了光照与材质参数的可解释性。9 万合成物体的材质分布与真实拍摄存在域差,复杂遮挡、非刚体和未知相机标定下的多视角一致性仍是风险。 8. AV-SafetyBench:只看视频会漏掉近半音画风险 AV-SafetyBench: A Safety Benchmark for Text-to-Audio-Video Generation | Suah Choi 等 | arXiv:2609.06991 关键词:音视频生成,安全评测,跨模态风险,生成基准 前序问题:文字到音视频模型同时生成画面、语音、音效和环境声,危险内容可能只藏在音轨,或由无害画面与无害声音组合后产生。只评视频或只评音频会系统性漏检。 本文贡献:AV-SafetyBench 建立四个轴、13 类风险的分类体系与 5200 条人工复核提示,分别从完整音画、仅视频、仅音频三种视角判定输出,再把完整音画风险归因到视频、音频、双模态各自危险或跨模态组合危险。 实验效果:五个开源音视频生成模型的完整音画不安全率为 25.1% 至 49.4%。在四个模型中,音频独有与音画联合风险占可归因不安全样本的 41.6% 至 48.3%;跨模态伤害类别中,87.5% 来自音画组合后才出现的风险。 批判点评:风险比例依赖提示集分布、生成拒答策略和裁判阈值,不应直接解释成真实产品事故率。基准主要覆盖公开模型与英语语境,多语言语音、方言暗示和长时叙事风险仍可能不足。 9. Concept Brittleness:用稀疏特征定位生图概念盲点 Interpreting Object-Dependent Concept Brittleness in Text-to-Image Diffusion Models | 复旦大学、深圳大学等 | arXiv:2609.09909 关键词:文生图,可解释性,稀疏自编码器,推理时修复 前序问题:同一风格或属性在大多数对象上能生成,却会对少数对象稳定失败。这类“对象依赖的概念脆弱性”不是换随机种子就能解释,也难从原始去噪特征中定位缺失了哪一条概念证据。 本文贡献:作者把逐步去噪轨迹投到稀疏自编码器空间,对比成功与失败样本,寻找缺失、变弱或出现过晚的概念维度,并从同类成功样本建立概念原型。推理时把失败样本的特征轻量插值到原型方向,用修复效果反证诊断是否抓住了真实缺口。 实验效果:跨多个扩散骨干的风格与属性失败案例中,原型插值显著改善概念一致性、文本保真和修复成功率。分析还显示越深层的去噪表示概念结构越清晰,而越早期介入通常有更强纠正作用。 批判点评:方法先要收集可靠的同类成功样本来构造原型,对长尾概念或没有清晰成功对照的情况较弱。SAE 的稀疏特征并不天然等于人类可读因果概念,插值改善结果也不能完全排除其他相关方向共同起作用。 10. SignRefine:局部适配器把手语手部精度提高30% SignRefine: Adapting Foundational Video Models for Sign Language Generation | 萨里大学 | arXiv:2609.08496 关键词:手语生成,视频扩散,局部适配器,关键点控制 前序问题:通用视频扩散模型主要在口语人物视频上训练,能生成自然人物,却经常把手指、嘴形和眉眼做错;对手语而言,这些小区域正承载语言信息,画质好但动作错仍不可理解。 本文贡献:SignRefine 冻结预训练视频 DiT 主干,只为左手、右手和脸部分别加入带空间掩码的局部适配器,把高分辨率区域条件注入指定 Transformer 层。系统只需二维关键点与一张人物参考图,并使用原生手语视频数据集 NVSign 训练区域控制。 实验效果:相对最强基线,SignRefine 的手部姿态精度指标最高提升 30%;手语用户在视觉质量与可理解性成对比较中超过 80% 的情况下选择 SignRefine。模型还展示了跨人物外观与视觉条件的泛化。 批判点评:二维关键点没有完整编码手形、接触关系和非手部语法,生成可理解性仍取决于关键点质量。当前数据的语言种类、地区变体和签署者覆盖决定了泛化边界,必须持续由聋人社群参与评测。 趋势观察 视频效率开始补齐全局结构 RoLA在90%稀疏下保留旋转位置全局分支,Mask Forcing则从训练分布侧减少自回滚模式坍塌;速度优化正在从少算注意力扩展到稳定学生分布。 条件控制向低维与局部区域收缩 Decoupled SF把音频先落到动作潜变量,SignRefine只强化手脸区域,说明让条件作用于真正相关的表示比全图注入更节省容量。 生成评测进入可回放和跨模态阶段 VI-Bench要求反推提示后重新生成,AV-SafetyBench同时检查画面、音轨及其组合;只看文本相似或单一模态已不足以评价生成系统。 基础设施成为算法可信度的一部分 Miles把回滚、训练和权重同步放在同一套可验证系统里,提醒大规模后训练的算法结论必须连同 on-policy 对齐与运行拓扑一起审查。 人工智能炼丹君 整理 | 2026-09-10 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月10日
22 阅读
0 评论
0 点赞
2026-09-09
AIGC 每日速读|2026-09-09|阿里两步口型配音跑到7.13FPS-TBDub
今日 AIGC 论文速览 今日共 10 篇 重点论文标题列表 TBDub(阿里巴巴淘天集团 TaoLive AIGC):两步口型配音跑到7.13FPS AlignGraft(新南威尔士大学):弱模型一次对齐全家复用 ⚡ SeRV(俄克拉荷马大学、佐治亚大学、马萨诸塞大学阿默斯特分校):375小时数据生成3D手语 PAI-Actor(Utopai Studios、加州大学尔湾分校、南洋理工大学、新加坡国立大学 Show Lab):1080P多角色电影替换 MVWeaver(中国科学院自动化研究所、快手可灵 KlingAI、上海戏剧学院、北京电影学院、康斯坦茨大学):1861支MV教会歌曲转镜头 今日论文速览 1. TBDub:两步口型配音跑到7.13FPS TBDub: Production-Oriented Visual Dubbing | 阿里巴巴淘天集团 TaoLive AIGC | arXiv:2609.06144 关键词:视频编辑,视觉配音,少步蒸馏,口型同步 ⚠️ 前序问题:把原视频语音替换为新音频时,嘴形必须同步,同时还要保住身份、牙齿、光照、遮挡与背景。X-Dub 在干净数据上有效,但面对直播压缩、绿幕素材和上游生成视频时,容易出现嘴部粘连、身份漂移、边界闪烁,并且 30 步采样难以投入生产。 本文贡献:TBDub 先用生产域数据、失败规则、非对称条件退化、干净口腔先验和多层 HuBERT 音频特征,对完整视频 DiT 做任务自适应后训练,得到 30 步教师;再把 DMD/DMD2 改造为条件视频编辑蒸馏,对完整两步轨迹反向传播,并用分区重建监督稳定身份和口腔细节,得到两步学生。 编辑依据论文方法章节重绘;原论文未提供方法框架图。 实验效果:在 38 段 TalkVid 视频上,教师相对 X-Dub 的口型同步、身份一致性和视觉质量 MOS 分别提高 0.14、0.95 和 0.90 分。两步学生在单张 NVIDIA H20、512×512 的端到端计时中达到 7.13 FPS,总延迟降低 13.93 倍,DiT 阶段加速 42.49 倍,同时大体保留教师的画质与音画同步。 论文 Table 4:单张 NVIDIA H20、512×512、VAE-to-VAE 计时边界下的端到端生成吞吐量。 批判点评:38 段视频与单一 H20 配置仍不足以覆盖真实直播中的语言、脸型、遮挡和码率变化;音频前端使用英语 HuBERT,也需要跨语言检验。方法继承 Wan 与 X-Dub 的大部分能力,训练数据和生产过滤规则对结果贡献很大,不能只归因于两步蒸馏。 2. AlignGraft:弱模型一次对齐全家复用 Test-Time Weak-to-Strong Alignment: Transferring Implicit Rewards from Weak to Strong Flow Models | 新南威尔士大学 | arXiv:2609.05968 关键词:测试时对齐,流模型,弱到强迁移,偏好优化 ⚠️ 前序问题:每个新生成模型、检查点和奖励目标都重新做强化学习或偏好优化,成本高且把奖励强度永久写死。现有测试时对齐又常要求奖励函数梯度或另训价值模型,部署仍需保留奖励基础设施。 本文贡献:AlignGraft 保存一个弱模型的“基础版与已对齐版”模型对,把两者在每个采样步的速度差视为隐式奖励方向,再将这段差值加到同潜空间、同前向加噪核的强模型速度上。强模型保持冻结,测试时只用一个标量调节对齐强度,不需要奖励评估、反向传播或新的微调。 实验效果:把 SD3.5-Medium 的 GenEval 对齐迁移到 SD3.5-Large 后,强模型总分从 0.68 升到 0.90,接近源对齐模型的 0.93;位置关系从 0.28 升到 0.91,计数从 0.67 升到 0.84。相同思路也在 FLUX 同族模型和 Wan 1.3B 到 14B 视频模型间提升了多项偏好与对齐指标。 批判点评:迁移要求源模型对能在强模型状态上给出分布内信号,并共享潜空间和噪声过程;跨完全不同架构并非自动成立。弱模型学到的奖励偏差也会被一起移植,强度外推过大可能损害保真度。 3. SeRV:375小时数据生成3D手语 SeRV: Semantic-Aligned Residual Vector Quantization for American Sign Language Generation | 俄克拉荷马大学、佐治亚大学、马萨诸塞大学阿默斯特分校 | arXiv:2609.05742 关键词:手语生成,残差向量量化,动作生成,语义对齐 ⚠️ 前序问题:手语动作令牌器通常只追求姿态重建,未必把文本语义组织进离散空间;后续生成器即使能复原大动作,也可能把承载词义的手形和细粒度关节做错。配对的文本与三维手语动作数据又很稀缺。 本文贡献:SeRV 在残差向量量化器中同时加入句子级动作文本对齐和令牌级文本条件监督,让粗到细的多层码本既可重建动作又可预测语义;随后用分层 GPT 逐级生成身体和手部令牌。团队还从 YouTube-ASL 视频恢复三维动作,构建 375 小时的动作文本基准。 实验效果:在 YouTube-ASL 上,身体与手部 DTW-JPE 分别为 4.98 和 6.70,优于 SOKE 的 5.42 和 7.44;SiBLEU-4 从 2.18 提升到 3.13。在 How2Sign 上身体与手部误差也最低,不过 MaDiS 的 SiBLEU-4 为 4.47,仍高于 SeRV 的 4.12。 批判点评:训练数据来自二维视频重建的三维动作,手指遮挡与视角误差可能被写进码本。DTW-JPE 与 SiBLEU 不能完全代表手语可理解性,仍需由聋人和专业手语者做语义、自然度与文化适切性评测;结论目前也只覆盖美国手语。 4. PAI-Actor:1080P多角色电影替换 PAI-Actor: Cinematic Multi-Character Replacement in Dynamic Scenes | Utopai Studios、加州大学尔湾分校、南洋理工大学、新加坡国立大学 Show Lab | arXiv:2609.05918 关键词:角色动画,视频编辑,多角色生成,自回归蒸馏 ⚠️ 前序问题:角色替换系统多围绕单张人物或单主体展开,面对电影中的多人互动、遮挡、手持物、相机运动和动态光影时,容易改坏背景或让身份漂移;双向视频模型画质高,却难扩展到长片段。 本文贡献:PAI-Actor 把多角色替换改写为结构引导的人体恢复:从电影中抹去原演员,以身体与人脸关联后的骨架和每个角色参考图作为条件,在约 3 万段电影片段上训练 1080P 双向 DiT。随后通过因果适配与 on-policy self-forcing,把双向教师蒸馏为可使用 KV 缓存的自回归视频到视频模型。 实验效果:论文在角色动画子集的大多数指标上优于对比方法,并展示多人身份、背景与姿态一致性。自回归学生可生成约 417 帧、17 秒的 1920×1056 视频,而双向教师因全局注意力不能扩展到该长度。 批判点评:训练三个阶段合计数百 GPU 小时,峰值显存约 114 至 136 GB,生产门槛很高。电影数据还涉及演员肖像、版权与合成滥用风险;失败案例中极端像素位移、复杂遮挡和长时身份漂移仍未解决。 5. MVWeaver:1861支MV教会歌曲转镜头 MVWeaver: A Hierarchical Music Video Generation Agent with a Learned Song-to-Visual Bridge | 中国科学院自动化研究所、快手可灵 KlingAI、上海戏剧学院、北京电影学院、康斯坦茨大学 | arXiv:2609.06478 关键词:音乐视频,生成智能体,分层规划,音画生成 ⚠️ 前序问题:自动音乐视频系统可以拼出漂亮镜头,却常停留在歌词字面联想:整首歌的情绪、人物动机和反复意象没有发展,镜头之间也缺少可追踪的概念与状态。 本文贡献:MVWeaver 先做结构化歌曲分析,再由视觉规划器生成全局概念、段落计划和可执行镜头,最后调用图像与视频模型渲染。关键的 song-to-visual bridge 来自 1861 组真实歌曲与 MV,包含歌曲侧、MV 侧以及教师推导的转译理由,并用 LoRA 微调大语言模型学习从听歌理解到视觉设计的中间桥。 实验效果:在 1 至 5 分评测中,MVWeaver 的歌曲解释、视觉发展、概念连贯和镜头连续得分分别为 4.08、3.63、4.30、4.10,均高于 AutoMV 和去掉桥接模块的版本;与所有对比方法成对比较后的总体用户偏好率为 67.06%,AutoMV 为 30.59%。 批判点评:1861 组真实 MV 的规模、文化分布和版权来源会影响桥接模型学到的视觉惯例。长视频一致性评分仍难覆盖完整观影体验;若歌曲分析出错,层级规划会把错误系统性传播到所有镜头。 6. ToPO:把整图偏好路由到词和像素 ToPO: Token-Conditioned Preference Routing for Attention-Based Latent Diffusion Models | 清华大学、电子科技大学、斯坦福大学 | arXiv:2609.03688 关键词:偏好优化,扩散模型,注意力,空间时间路由 ⚠️ 前序问题:一条成对偏好只说明整张图谁更好,却没有指出哪个提示词、空间位置和去噪时刻该更新。Diffusion-DPO 把全局信号铺到大量局部坐标,容易浪费梯度或修错区域。 本文贡献:ToPO 用冻结参考去噪器比较优选与劣选分支的局部平方残差,构造与小批次相关、停止梯度的可分空间时间路由;再用优选分支交叉注意力把内容词映射回空间,并加入像素中点排序项。整个过程不需要局部标签或另训奖励模型。 实验效果:在 SD-1.5 上,ToPO 的 GenEval 与 T2I-CompBench 平均分为 0.5092 和 0.4123,高于 Diffusion-DPO 的 0.4591 和 0.3521;在 SDXL 上 GenEval 为 0.6168,T2I-CompBench 为 0.4975,与 Diffusion-DPO 的 0.4974 近似持平。300 提示盲测的六组问题中,ToPO 均获得更多原始选择。 批判点评:路由依赖参考模型残差和交叉注意力的可解释性,未证明可直接迁移到所有 DiT 或无交叉注意力架构。盲测只公开聚合计数,不能进行参与者层面的显著性推断;部分 SDXL 自动指标也没有全面领先。 7. Diffuse2Seg:扩散模型零训练造分割标签 Diffuse2Seg: Diffusion Models Can Segment Anything Without Supervision | 柏林工业大学、CARIAD SE(大众汽车集团) | arXiv:2609.06491 关键词:开放世界分割,扩散特征,伪标签,无监督学习 ⚠️ 前序问题:SAM 的开放世界分割能力依赖 1100 万图像和超过 10 亿人工掩码,继续扩大标注极其昂贵。自监督视觉特征生成的伪标签又常偏向前景物体,难覆盖天空、道路等无定形区域。 本文贡献:Diffuse2Seg 不训练扩散模型,而是从文生图模型的自注意力中提取对象结构,将密集点网格通过保边的非线性 p-Laplacian 传播为软掩码,再合并为从部件到完整物体的多粒度实例图,去重后用于训练开放世界分割器。 实验效果:生成伪标签在五个领域的 AR1000 比此前最佳标签生成器高 4.3 至 7.1 个百分点。用这些标签训练的无检测器分割模型在 things 与 stuff+things 上分别提升 7.4 和 7.7 个百分点,并在后者超过检测器式 UnSAM 2.1 个百分点。 批判点评:伪标签会继承文生图训练数据的类别偏差,对小目标、透明物、医学或机器人极端域未必可靠。评测以平均召回为主,边界精度和错误标签对下游安全任务的影响仍需单独检查。 8. OAVC:只改目标不带跑背景 Object-Aware Background-Controlled Editing via Weighted Velocity Guidance | 卡内基梅隆大学、中国科学院计算技术研究所、中国科学院大学 | arXiv:2609.06288 关键词:图像编辑,视频编辑,免训练控制,整流流 ⚠️ 前序问题:免训练编辑通常把源提示与目标提示的速度差全局加到潜空间。目标之外的小残差虽然单步很弱,却会在多步积分中累积,最终带跑背景纹理、反射和物体边界。 本文贡献:OAVC 把“语义残差能在哪里生效”和“如何注入动力学”拆开:先在源提示下建立背景锚点和对象支持区,再用受约束的投影抑制会引发漂移的速度分量,并按时间和边界置信度加权注入目标语义。它不训练或修改预训练模型参数,可接到 SD3.5、FLUX 和视频流编辑器上。 实验效果:在 PIE-Bench 上,FLUX 版本相对 DNAEdit 将结构距离从 18.87 降至 4.07,背景 PSNR 从 24.99 dB 提升到 33.30 dB;SD3.5 版本也从 14.19 降至 4.11、从 26.66 dB 升到 32.64 dB。100 例盲测中,OAVC 赢下 94 个有明确结果的背景保持比较中的 74 个,占 78.7%。 批判点评:默认依赖 SAM3 提供对象支持区,分割遗漏或膨胀会直接限制编辑。它在背景保持上更强,但 CLIP 编辑性分数较低;人工评测也显示编辑实现偏好差异未达 0.05 显著水平,存在保真与改动强度的权衡。 9. AngelFingerprint:水印直接藏进编辑模型权重 AngelFingerprint: A Traceable, Explainable, and White-Box Stealthy Watermark for Text-Guided Image Editing | 台湾大学、日本国立信息学研究所 | arXiv:2609.04709 关键词:生成水印,图像溯源,文本引导编辑,白盒安全 ⚠️ 前序问题:常见生成水印只携带固定 ID,能说明图像来自哪个模型,却无法解释改了什么;水印若由独立编码器或后处理模块写入,在开源白盒场景中又容易被定位和移除。 本文贡献:AngelFingerprint 用 LoRA 把编辑提示的 CLIP 文本嵌入写进扩散模型权重,专用提取器再从像素恢复语义载荷。速度对齐锚点限制水印对编辑结果的扰动,仿照 JPEG 的 DCT 中频掩码避开显眼低频和脆弱高频,让架构、推理代码与计算图保持不变。 实验效果:在 MagicBrush 的 200 候选提示检索中,SD3-Medium 版本 Top-1 为 86.0%、MRR 为 0.917,而提示反演 Top-1 为 20%;UltraEdit 版本 Top-1 为 65.5%。中频滤波版本在水印开关之间得到 PSNR 22.91 dB、SSIM 0.704。 批判点评:把 LoRA 融入权重提高了隐蔽性,却没有证明能抵抗模型再训练、合并、剪枝或蒸馏等强白盒攻击。200 路封闭检索和单一编辑数据集规模有限;语义载荷也会带来隐私与滥用提示暴露问题。 10. Srijika:生成66套可安装印度字体 Srijika: OpenType-Layout-Reusing Font Restyling for Nine Indic Scripts | Loopdesk Technologies LLP | arXiv:2609.05661 关键词:字体生成,扩散模型,OpenType,印度文字 ⚠️ 前序问题:印度婆罗米系文字包含大量合字、半形和元音附标。只生成漂亮字形位图并不能得到可用字体,因为 cmap、GSUB 替换闭包、GPOS 定位和锚点关系必须共同满足排版引擎契约。 本文贡献:Srijika 不从零生成字体,而是保留完整模板字体的字符映射与替换闭包,用约 650 个开放许可字体族的检索系统 Lipika 将自然语言风格落到参考字体,再由参考条件潜扩散逐字重绘轮廓。内容门控、风格协调和排版簇验证会自动回退失败字形,最终重建为 TTF。 实验效果:系统产出 66 个 TTF,包含 57 个预设和 9 个开放词汇示例;全部通过 OpenType Sanitizer,HarfBuzz 与 CoreText 在高难合字探针上复现模板字形 ID 序列,并审计 80,915 个字形与 54,812 个锚点。 批判点评:论文只与无学习基线比较,缺少独立风格指标、人类研究和完整 GPOS 视觉质量审计。检索编码器与评测嵌入的数据并非完全独立,风格提升可能被高估;工程上的回退机制保证可安装,却可能留下大量未真正重绘的字形。 趋势观察 少步与长视频开始接受完整系统计时 TBDub把视觉配音压到两步并报告VAE到VAE的端到端速度,PAI-Actor则诚实披露17秒视频仍需95分钟;生产可用性正在从采样步数口号转向全链路成本。 对齐信号从整图分数走向可迁移局部场 AlignGraft把弱模型对的速度差跨规模移植,ToPO把整图偏好分配到词元、空间和时间,说明生成对齐正从重复微调转向复用和精确分配。 生成系统更重视可验证的结构契约 SeRV用语义码本约束手语,OAVC显式限定对象区域,AngelFingerprint嵌入可恢复提示,Srijika复用OpenType闭包;输出是否可编辑、可追溯、可执行,正与视觉质量同样重要。 人工智能炼丹君 整理 | 2026-09-09 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月09日
39 阅读
0 评论
0 点赞
2026-09-08
AIGC 每日速读|2026-09-08|蚂蚁从零训6B开源生图-LLaDA-Image
今日 AIGC 论文速览 今日共 10 篇 重点论文标题列表 LLaDA-Image(Inclusion AI AGI Research Center):从零训练开放生图模型 DSAQuant(Robbyant、浙江大学、香港理工大学、香港科技大学):按去噪阶段做视频量化 ⚡ DM-Align(清华大学、快手科技、哈尔滨工业大学(深圳)、北京邮电大学):四步视频同时对齐与蒸馏 RA-GRPO(清华大学、快手科技):用反思轨迹稳定生成对齐 VoRTeC(清华大学深圳国际研究生院、哈尔滨工业大学(深圳)、北京大学):用生成流做一步视频解码 今日论文速览 1. LLaDA-Image:从零训练开放生图模型 LLaDA-Image: Building Strong Image Generators with Fully Open Training Recipes | Inclusion AI AGI Research Center | arXiv:2609.03796 关键词:图像生成,开放模型,扩散语言模型,模型蒸馏 ⚠️ 前序问题:高质量图像生成模型常依赖不透明的数据配方、训练细节或已有模型权重,研究者难以复现从零训练过程;把理解、生成和编辑统一起来也容易牺牲其中一项能力。 本文贡献:作者从零训练一个 6B 参数 DiT,并接入冻结的 LLaDA2.0-Mini 视觉语言理解模块。训练先用纯图像预训练建立视觉先验,再做中期训练和图文统一训练;全流程使用 2.2 亿样本,其中 98% 为真实图像,并公开权重、代码和训练配方。团队还用 TwinFlow 将模型蒸馏为 2 至 4 步推理的 Turbo 版本。 实验效果:LLaDA-Image 在 Qwen-Image-Bench 英文与中文轨分别得到 53.53 和 53.38,领先当时其余开源模型;LongText-Bench 英文、中文得分为 0.923 和 0.913。编辑基准 GEdit-Bench 的英文、中文总分为 7.336 和 7.294,说明统一模型已具备较强的生成、文字渲染与编辑能力。 批判点评:2.2 亿样本的收集、清洗和训练成本仍然很高,公开配方也不会自动解决数据授权与可追溯性问题。报告覆盖模块很多,但部分组件的独立贡献和跨架构可迁移性仍需更多消融验证。 2. DSAQuant:按去噪阶段做视频量化 DSAQuant: Denoising-Stage-Aligned Quantization-Aware Training for Video Generation | Robbyant、浙江大学、香港理工大学、香港科技大学 | arXiv:2609.04031 关键词:视频生成,量化感知训练,低比特推理,部署优化 ⚠️ 前序问题:视频扩散模型压到 W4A4 或 W3A3 后,通常还能保住提示词语义、构图与粗粒度运动,却会明显丢失纹理、锐度和局部细节。传统量化训练把所有去噪时刻一视同仁,没有利用早期规划结构、后期补细节的分工。 本文贡献:DSAQuant 按去噪阶段切换监督目标:早期保持教师蒸馏以稳定全局结构与运动,后期逐渐转向目标驱动的细节重建;推理时在最后阶段关闭分类器自由引导,避免量化误差被 CFG 放大为高频伪影。方法同时覆盖 Wan 与 CogVideoX 系列。 实验效果:在 Wan2.1-1.3B 的 W4A4 设置下,DSAQuant 的 VBench 平均分为 67.21,高于 BF16 模型的 66.28 和 QVGen 对称量化的 63.56;在更激进的 W3A3 下,相对当时量化训练基线最高提升 6.60 分。 批判点评:论文重点验证生成质量,没有把端到端延迟、显存、能耗和不同硬件内核的实际收益放在同等位置;量化感知训练本身也有额外成本。后期关闭 CFG 可能改变文本对齐,需要在更广的提示与长视频任务上验证。 3. DM-Align:四步视频同时对齐与蒸馏 Joint Alignment and Distillation for Video Generation via Sample-Guided Distribution Matching | 清华大学、快手科技、哈尔滨工业大学(深圳)、北京邮电大学 | arXiv:2609.04283 关键词:视频生成,偏好对齐,分布匹配,少步蒸馏 ⚠️ 前序问题:视频生成的偏好对齐与少步蒸馏通常分成两段:先强化学习再蒸馏计算昂贵,先蒸馏再做强化学习又容易让模型坍塌。两段流程还要重复运行多步奖励评估,并在 ODE 与 SDE 轨迹间转换。 本文贡献:DM-Align 在一次分布匹配训练中同时叠加两种梯度:DMD2 梯度缩小真实模型与学生模型的分布差距,偏好梯度则利用成对偏好或组内探索,把生成分布推向人类偏好的样本。它把类似 DPO 与 GRPO 的信号写进同一训练目标,直接产出 4 次函数评估的视频模型。 实验效果:在 Wan2.1-T2V-1.3B、5 秒 832×480 视频上,组内模式以 4 NFE 得到 VBench 平均分 84.40、动态度 80.19;成对模式为 82.78。人工比较中,成对模式相对原模型净偏好提升 48%,相对单独 DMD2 提升 32%。 批判点评:实验集中在 1.3B 基模、5 秒 480p 视频,尚不足以说明长视频与更大模型也能稳定受益。样本引导仍依赖奖励或偏好数据,奖励偏差与奖励投机只是减轻,不能视为消失。 4. RA-GRPO:用反思轨迹稳定生成对齐 Step Back to Move Forward: Reflection-Aware Preference Optimization for Visual Generation | 清华大学、快手科技 | arXiv:2609.04282 关键词:偏好对齐,扩散模型,强化学习,奖励投机 ⚠️ 前序问题:生成模型用策略梯度对齐人类偏好时,探索常被局部最优牵引:奖励上升了,语义忠实度或真实感却可能下降。常规 GRPO 只从当前前向采样学习,很难主动修复已经偏离高概率数据流形的中间状态。 本文贡献:RA-GRPO 在训练中加入“向后反思”。Diffusion Reflection 在随机中间时刻用较弱估计器反演并校正潜变量,再由 Counterfactual Path Synthesis 把校正后的路径蒸馏回策略。反思只发生在优化阶段,因此部署时没有额外采样开销。 实验效果:在 FLUX.1-dev 与 HPSv2.1 提示集上,以 HPS 为奖励时,RA-GRPO 的 HPSv2.1、ImageReward、HPSv3 分别为 0.378、1.417、15.324,均高于论文复现的 DanceGRPO 与 MixGRPO;多目标 HPS+CLIP 训练也取得更均衡的自动指标。 批判点评:验证主要围绕 FLUX.1-dev、HPS 提示和自动奖励模型。弱估计器、指导强度与反思时刻的选择会影响稳定性;只看自动奖励仍可能漏掉新的投机模式,需要更大规模人工偏好与跨模型复核。 5. VoRTeC:用生成流做一步视频解码 VoRTeC: Taming Foundation Flow for One-step Real time Video Compression | 清华大学深圳国际研究生院、哈尔滨工业大学(深圳)、北京大学 | arXiv:2609.02291 关键词:视频压缩,流模型,实时解码,超低码率 ⚠️ 前序问题:传统神经视频压缩在超低码率下容易模糊,而扩散式生成压缩通常需要多步采样,难以实时运行。如何借用强视频生成模型的先验,又不复制其昂贵迭代过程,是部署瓶颈。 本文贡献:VoRTeC 冻结 Wan2.1 流模型,只训练紧凑潜码与轨迹位置预测器,用多尺度先验把一次解码对齐到生成流。跨帧组复用尾帧,并缓存生成先验,以降低连续视频的重复计算;训练不需要访问基础流模型的参数或梯度,可在单张 A6000 上完成。 实验效果:论文报告在相近感知质量下可节省 58.12% 至 73.25% 码率,并达到低于 0.01 bpp;推理相对多步生成压缩加速 3 至 197 倍,720p 达 13 fps、480p 达 32 fps。 批判点评:速度依赖具体显卡、分辨率与缓存条件,不能直接外推到移动设备。对取证、医疗、遥感等要求像素真实性的场景,生成先验可能引入不可接受的幻觉,需要独立的保真约束与错误标记。 6. Editable Visual Design:让视觉设计真正可编辑 Editable Visual Design | 腾讯混元、中山大学、清华大学、香港中文大学、上海交通大学 | arXiv:2609.04034 关键词:视觉设计,智能体,图像生成,HTML CSS ⚠️ 前序问题:文生图可以快速给出海报或信息图,但输出通常是一张扁平位图,文字、图标和布局无法继续精确编辑;纯代码生成又容易缺少视觉想象与审美反馈。 本文贡献:该系统让视觉语言模型充当创意大脑、图像生成器充当视觉世界模拟器,先想象整体效果,再把素材隔离为独立资产并用原生 HTML/CSS 重建文字、层级与布局。Agent Design Replay 学习专业设计轨迹,智能体通过截图反馈持续比较和修改。 实验效果:论文用海报、信息图、营销物料和长文本版式等案例展示:输出中的文字保留为真实文本,元素可以用鼠标拖动,图层与样式可继续修改。论文当前以定性案例证明可编辑工作流,没有给出可横向比较的统一量化分数。 批判点评:缺少大规模用户研究、任务完成时间和跨基线量化评测,使“更专业”仍难精确判断。流程依赖图像生成和代码智能体的能力,素材版权、网页代码安全与复杂版式的兼容性也需要产品级约束。 7. Temporal Context Routing:把脚本精确路由到时间轴 The Missing Temporal Link: Temporal Context Routing for Script-Driven Audio-Video Generation | 北京大学、Qwen Applications、香港科技大学、香港中文大学、上海交通大学 | arXiv:2609.02367 关键词:音视频生成,时间控制,脚本驱动,多模态生成 ⚠️ 前序问题:脚本驱动的音视频生成会同时处理镜头、对白、动作和音效,但全局文本条件不知道某条指令应该在哪一秒生效,常出现切镜过早、对白错位或动作与声音不同步。 本文贡献:Temporal Context Routing 先把脚本事件映射到音频与视频共享的时间轴,再将每段提示的引导信号只路由到匹配的时空位置。它给现有联合音视频模型补上显式时间链接,而不用让所有帧共同接受整段脚本。 实验效果:在 200 条测试脚本上,镜头边界平均绝对误差从 1.11 秒降到 0.042 秒,下降约 96%;对白在 0.5 秒容差内的准确率从 28.3% 提升到 84.1%,同时视觉质量与音画同步指标保持相近。 批判点评:实验规模仍有限,长叙事、重叠对白、快速多事件和镜头外音源会让路由更复杂。用户研究偏好不能替代对叙事连贯性与错误恢复的长期评估。 8. Unreal Engine World Data:用虚幻引擎规模化造数据 Building Pretraining Data for World Models: An Unreal Engine-Based Pipeline for Action-Conditioned Video Generation | Joy Future Academy、京东、清华大学、香港科技大学 | arXiv:2609.03557 关键词:世界模型,合成数据,虚幻引擎,动作条件视频 ⚠️ 前序问题:动作条件世界模型需要既有可控动作轨迹、又有高质量画面的长视频数据。直接在游戏引擎中边运行物理、边实时渲染,容易因帧率波动破坏动作与画面对齐,也难在数百 GPU 上稳定扩展。 本文贡献:作者把流程拆成两段:PIE 先按真实物理运行并记录角色、控制和相机状态,MRQ 再离线重放轨迹并高质量渲染。系统加入缓存感知的任务分片、节点槽位、场景筛选、亮度与审美过滤,以及失败恢复、上传和健康检查。 实验效果:在 25 台服务器、共 200 张 RTX 5090 上,系统从 2384 个资产包整理出 429 个关卡与 40 个类人角色,生成 2691 小时 1080p 和 6076 小时 720p 动作条件视频,并用于 EchoWM 数据建设。 批判点评:合成场景仍有引擎域偏差,审美和亮度过滤可能进一步删掉困难样本;资产许可、人物动作覆盖和 200 GPU 的成本也决定了复现门槛。数据规模不能替代真实世界验证。 9. Structured-Prior Inpainting:给交通标志注入物理先验 Structured-Prior-Guided Diffusion Inpainting with Physical Consistency for Traffic Sign Augmentation | 高德地图、阿里巴巴集团 | arXiv:2609.02348 关键词:图像修复,合成数据,交通标志,物理一致性 ⚠️ 前序问题:稀有交通标志样本不足,但普通文生图或修复模型容易生成错误文字、色彩和边缘。视觉上“像标志”还不够,训练检测器需要类别语义、模板几何与法规颜色都准确。 本文贡献:方法把三类结构先验送入扩散修复:JSON 语义提示描述类别,正视矢量图通过 IP-Adapter 提供测量颜色,仿射对齐的矢量模板通过 ControlNet 约束几何;训练再加入 CIELAB 颜色 L1 损失和 Sobel 边缘损失,强化物理一致性。 实验效果:在 TT100K2021 零样本测试中,OCR 完全匹配率为 91.1%,而 12B 参数 FLUX.1 Fill 为 44.2%;基于 SD1.5 的方案推理时间约为其十四分之一。把合成图加入训练后,稀有类别 AP50 提升到原来的 1.23 至 7.40 倍。 批判点评:公开验证集中在一种交通标志数据源,检测增益会受合成比例、地区法规、拍摄距离和天气影响。用于道路安全前,还需跨国家模板、夜间、遮挡和极端退化测试,并保留可审计的生成记录。 10. Pitch-class Steering:用潜空间探针控制旋律 Pitch-class Steering for Diffusion-based Music Generation via Latent-space Probes | 卡内基梅隆大学、独立研究者 | arXiv:2609.04516 关键词:音乐生成,扩散模型,旋律控制,潜空间探针 ⚠️ 前序问题:文本能描述音乐风格,却很难要求扩散音乐模型严格跟随指定旋律。重新训练完整模型或改架构成本高,而 MIDI 条件又不一定能直接接入现有生成器。 本文贡献:作者用配对音频与 MIDI 训练一个 12.5 万参数卷积探针,从 Stable Audio Open 的 VAE 潜变量逐帧解码音高类别。生成时冻结基础模型,把探针的可微损失作为引导信号,在每步去噪中推动潜变量靠近目标旋律,不修改生成模型结构。 实验效果:在 9 个提示词与 3 条旋律组成的 27 次试验中,引导生成的旋律一致性相对无引导基线提升 2.4 倍;Wilcoxon 检验给出 p<1e-5。论文已被 IEEE MLSP 2026 接收。 批判点评:27 次试验规模很小,统计显著不等于覆盖多样音乐风格。每步反向传播引导会增加推理开销,配对 MIDI 数据的偏差也可能限制泛化;还需听感盲测和更长曲目验证。 趋势观察 生成训练开始公开到数据与优化器层级 LLaDA-Image不仅开放权重,还披露2.2亿样本、纯图像预训练、Muon与少步蒸馏配方,竞争焦点正从模型接口转向可复现的完整训练系统。 视频部署优化必须贴合去噪阶段 DSAQuant按阶段分配量化监督,DM-Align把偏好对齐和少步蒸馏并成一次训练,VoRTeC则预测生成流位置完成一步解码;三者都在利用生成轨迹的内部结构减少成本。 显式控制信号重新进入生成链路 时间路由、交通标志模板与音高探针分别把时间、物理几何和旋律注入生成过程,显示开放式文本提示正在与可验证、可定位的结构条件结合。 人工智能炼丹君 整理 | 2026-09-08 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月08日
16 阅读
0 评论
0 点赞
2026-09-08
AIGC 基本功|策略梯度与 PPO 基础-PPO
策略梯度与 PPO 基础 所属方向:对齐与强化学习 | 难度:核心必修 | 前置知识:无 关键词:策略梯度、REINFORCE、优势函数、GAE、PPO、裁剪、KL 约束 01. 为什么需要它 先看一个很容易把模型训坏的场景。 你有一个已经做过监督微调的语言模型,给同一个问题采样了若干回答,奖励模型认为其中一条更好。最直接的想法是:让模型提高这条回答的概率。于是你把它的对数概率乘上奖励,连续更新十轮。训练日志里的 reward 不断上升,重新采样时却发现模型开始反复输出奖励模型偏爱的句式,内容变长,语言能力下降,最后连原来会答的问题也答不好。 问题不只在奖励。至少有三笔账同时失控了: 信用分配:一个回答只得到一个总分,到底哪些 token 值得鼓励? 估计噪声:这条回答得 8 分,是动作真的好,还是题目本来就容易? 更新幅度:数据由旧策略采出,新策略反复使用同一批数据后已经变了,为什么还能继续把旧结论当真? 策略梯度解决第一笔账:把“提高期望奖励”变成对可采样策略的梯度。价值函数和优势估计解决第二笔账:把状态本身的难易扣掉,只保留“这个动作比预期好多少”。PPO 的裁剪目标处理第三笔账:允许一批昂贵样本做多轮更新,同时阻止单个样本把新旧概率比推得过远。 这三层关系决定了后面的算法谱系。DPO 改写优化问题,GRPO 换掉价值网络,RLOO 换基线,很多 RLHF 系统再加入参考模型 KL、奖励归一化和长度处理。名字不断变,问题仍可追溯到三个量:优势怎么估、概率比怎么算、策略走多远。 02. 最小可用理解 先记住四句话: 策略梯度会提高“优势为正”的动作概率,降低“优势为负”的动作概率。 优势 $A(s,a)$ 是采取动作 $a$ 后的回报,相对状态 $s$ 下平均预期的超额部分。 GAE 用参数 $\lambda$ 在低方差但依赖 critic 的一步 TD,与高方差但依赖较少的完整回报之间插值。 PPO-Clip 比较新旧策略的动作概率比 $r_t$;一旦更新已经朝有利方向超过 $1\pm\epsilon$,该样本不再继续提供奖励。 把一次语言模型生成看成一条轨迹也很直观:状态是 prompt 加已经生成的 token,动作是下一个 token,策略是词表上的概率分布,终局奖励来自奖励模型。critic 预测“从当前前缀继续生成,平均还能拿多少分”,优势则问“刚才选的这个 token,让结局比平均预期好还是差”。 PPO 的 clip 不是把梯度值裁小,也不是保证 KL 一定不超过某个阈值。它裁的是替代目标里的概率比收益。这个区别是理解所有变体的入口。 03. 数学推导 3.1 从期望回报到策略梯度 考虑一个马尔可夫决策过程。$s_t$ 是时刻 $t$ 的状态,$a_t$ 是动作,$r_t$ 是环境在这一步给出的奖励,$\gamma\in[0,1]$ 是折扣因子。策略 $\pi_\theta(a_t\mid s_t)$ 由参数 $\theta$ 控制。一条长度为 $T$ 的轨迹记作 $\tau=(s_0,a_0,r_0,\ldots,s_T)$,折扣回报为: $$R(\tau)=\sum_{t=0}^{T-1}\gamma^t r_t$$ 训练目标是让轨迹的期望回报最大: $$J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}[R(\tau)]$$ 轨迹概率由初始状态分布 $p(s_0)$、策略和环境转移 $p(s_{t+1}\mid s_t,a_t)$ 连乘得到: $$p_\theta(\tau)=p(s_0)\prod_{t=0}^{T-1}\pi_\theta(a_t\mid s_t)p(s_{t+1}\mid s_t,a_t)$$ 对 $J$ 求梯度,并使用恒等式 $\nabla p=p\nabla\log p$: $$\nabla_\theta J(\theta)=\mathbb{E}_{\tau\sim\pi_\theta}[R(\tau)\nabla_\theta\log p_\theta(\tau)]$$ 环境转移不依赖 $\theta$,因此它在对数梯度中消失,只剩策略项: $$\nabla_\theta J(\theta)=\mathbb{E}\left[R(\tau)\sum_{t=0}^{T-1}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\right]$$ 这就是 REINFORCE 的骨架。还可以利用“未来动作不能影响过去奖励”,把整条轨迹回报换成从 $t$ 开始的 reward-to-go: $$G_t=\sum_{l=0}^{T-t-1}\gamma^l r_{t+l}$$ 于是每个动作只为它之后的结果负责: $$\nabla_\theta J(\theta)=\mathbb{E}\left[\sum_{t=0}^{T-1}\gamma^t G_t\nabla_\theta\log\pi_\theta(a_t\mid s_t)\right]$$ 这里的 $\gamma^t$ 不能漏:本文从固定初始状态、折扣总回报 $J$ 出发,$G_t$ 的折扣却从当前步重新计起。只有 $\gamma=1$,或把该权重吸收到折扣状态访问分布时,才能省略显式 $\gamma^t$。实际 PPO 常把 rollout 的时间步均匀平均,这是常用替代目标,不应与上面的精确有限时域梯度混同。 如果 $G_t$ 总为正,采到的每个动作都会被提高概率,区别只是力度大小。这种估计虽然无偏,方差却很大。我们需要一个不改变期望梯度的参照物。 3.2 基线为什么可以减 从回报减去任何只依赖状态、不依赖本次动作的基线 $b(s_t)$,期望梯度不变。因为对固定状态 $s$: $$\mathbb{E}_{a\sim\pi_\theta}[b(s)\nabla_\theta\log\pi_\theta(a\mid s)]=b(s)\nabla_\theta\sum_a\pi_\theta(a\mid s)=0$$ 最常见的基线是状态价值函数: $$V^\pi(s_t)=\mathbb{E}_\pi[G_t\mid s_t]$$ 动作价值函数把本次动作也作为条件: $$Q^\pi(s_t,a_t)=\mathbb{E}_\pi[G_t\mid s_t,a_t]$$ 两者之差就是优势函数: $$A^\pi(s_t,a_t)=Q^\pi(s_t,a_t)-V^\pi(s_t)$$ $A>0$ 表示这个动作比该状态下的平均动作好,$A<0$ 表示更差。Actor 通过优势更新策略,critic 通过回归回报学习 $V$,所以这类方法叫 actor-critic。 3.3 从 TD 残差到 GAE 真实 $Q$ 和 $V$ 都不知道,只能估计。最短视的估计是一步 TD 残差: $$\delta_t=r_t+\gamma(1-d_t)V_\phi(s_{t+1})-V_\phi(s_t)$$ $V_\phi$ 是参数为 $\phi$ 的 critic,$d_t\in\{0,1\}$ 表示这一步后轨迹是否真正终止。若 $d_t=1$,就不能再 bootstrap 到下一个状态。critic 准确时,$\delta_t$ 是优势的低方差估计;critic 有系统误差时,它也会把误差直接传给 actor。 把未来多个 TD 残差加进来,会得到不同步数的优势估计。GAE 用指数权重把它们合在一起: $$\hat A_t^{\mathrm{GAE}(\gamma,\lambda)}=\sum_{l=0}^{T-t-1}(\gamma\lambda)^l\delta_{t+l}$$ 实际代码不需要为每个 $t$ 再套一层求和。由上式直接得到从后向前的递推: $$\hat A_t=\delta_t+\gamma\lambda(1-d_t)\hat A_{t+1}$$ 两个极端很关键。$\lambda=0$ 时,$\hat A_t=\delta_t$,只看一步,方差小但强依赖 critic。$\lambda=1$ 且轨迹正确终止时,TD 项会望远镜式相消,得到 $G_t-V(s_t)$,对未来 critic 误差不再敏感,但把后续所有随机奖励都带了进来。常见的 $\gamma=0.99,\lambda=0.95$ 是经验起点,不是定律。 训练 critic 时通常使用 value target: $$\hat V_t^{\mathrm{target}}=\hat A_t+V_\phi(s_t)$$ 实现时要区分 terminated 和因时间上限触发的 truncated。真正终止的状态没有未来价值;时间截断通常仍应 bootstrap。把两者都当 done=1,会在每段 rollout 尾部制造系统性低估。 3.4 为什么需要新旧策略概率比 采样成本高,所以 PPO 会冻结采样策略 $\pi_{\theta_{\mathrm{old}}}$,用同一批轨迹对当前策略 $\pi_\theta$ 做多轮小批量更新。数据来自旧策略,目标却要描述新策略,动作重要性比在固定旧策略状态上校正动作分布;它不校正整条轨迹的状态访问分布,所以以下是局部替代目标: $$r_t(\theta)=\frac{\pi_\theta(a_t\mid s_t)}{\pi_{\theta_{\mathrm{old}}}(a_t\mid s_t)}=\exp(\log\pi_\theta-\log\pi_{\theta_{\mathrm{old}}})$$ 未裁剪的替代目标是: $$L^{\mathrm{PG}}(\theta)=\mathbb{E}_t[r_t(\theta)\hat A_t]$$ 刚开始新旧策略相同,$r_t=1$。如果 $\hat A_t>0$,增大该动作概率会使目标变大;如果 $\hat A_t<0$,减小概率会使目标变大。但在同一批数据上更新多轮后,某些比率可能冲到 1.8、0.2,旧数据已不能可靠描述新策略附近的行为。 3.5 PPO-Clip 的 min 到底裁了哪一边 PPO-Clip 的核心目标只有一行: $$L^{\mathrm{CLIP}}(\theta)=\mathbb{E}_t\left[\min\left(r_t\hat A_t,\mathrm{clip}(r_t,1-\epsilon,1+\epsilon)\hat A_t\right)\right]$$ 这里的 min 取较悲观的收益。它必须与优势的符号一起看: 当 $\hat A_t>0$,把好动作的概率比推到 $1+\epsilon$ 以上不再得分;但若概率比跌到 $1-\epsilon$ 以下,损失仍继续变差,算法不会保护错误方向。 当 $\hat A_t<0$,把坏动作的概率比压到 $1-\epsilon$ 以下不再得分;但若坏动作反而变得更可能,惩罚仍继续加重。 所以 clip 是单侧的乐观收益上限。它不会把所有比率强行夹回区间,也不会保证一次优化后每个样本都满足区间约束。一个 batch 内不同样本共享参数,更新某个样本可能把另一个样本推得更远。 PPO 通常最小化总损失,因此策略项前面带负号,再加 critic 的均方误差和熵奖励: $$\mathcal{L}_{\mathrm{total}}=-L^{\mathrm{CLIP}}+c_v\mathbb{E}_t[(V_\phi(s_t)-\hat V_t^{\mathrm{target}})^2]-c_e\mathbb{E}_t[\mathcal{H}(\pi_\theta(\cdot\mid s_t))]$$ $c_v$ 控制价值损失权重,$c_e$ 控制探索强度,$\mathcal H$ 是策略熵。LLM 对齐还常加入相对参考模型 $\pi_{\mathrm{ref}}$ 的 KL 惩罚: $$r_t^{\mathrm{RLHF}}=r_t^{\mathrm{task}}-\beta\left(\log\pi_\theta(a_t\mid s_t)-\log\pi_{\mathrm{ref}}(a_t\mid s_t)\right)$$ 注意这里有两个不同的“旧模型”。$\pi_{\theta_{\mathrm{old}}}$ 是本轮采样快照,用来计算 PPO ratio;$\pi_{\mathrm{ref}}$ 通常是固定的 SFT 参考模型,用来限制长期漂移。把两者混成一个模型,会把更新稳定性和行为保持两个问题混在一起。 3.6 把公式还原成一轮训练 一轮 PPO 可以按下面的顺序执行。顺序很重要,因为每个张量对应的策略版本不同。 第一步,冻结当前 actor 为 $\pi_{\theta_{\mathrm{old}}}$,用它与环境交互,保存每一步的状态、动作、奖励、old_logprob、critic value、终止标记。语言模型场景还要保存 completion mask,明确哪些位置真的是策略采出的动作。 第二步,在 rollout 末端决定是否 bootstrap。若轨迹真正终止,next_value=0;若只是采样窗口用完,则由 critic 估计最后状态价值。然后从后向前计算 $\delta_t$ 和 GAE。此时优势应视作固定训练标签,actor 更新不能反向穿过 GAE 进入旧 value。 第三步,用 $\hat V_t^{\mathrm{target}}=\hat A_t+V_{\mathrm{old}}(s_t)$ 构造 critic 目标。这里加的是采样时保存的旧 value。如果一边更新 critic 一边用新 value 重算 target,目标本身会追着模型移动。 第四步,打乱 rollout,切成 minibatch。当前 actor 对已经采过的动作重新计算 new_logprob,然后用对数概率之差求 ratio。直接先算概率再做除法容易在大词表和低概率动作上出现下溢。 第五步,分别计算未裁剪和裁剪后的 policy surrogate,逐样本取 min,再按有效动作 mask 求平均。同时计算 value loss、entropy bonus,以及可选的 reference KL。 第六步,反向传播并做梯度范数裁剪。一个 rollout 通常会被重复使用若干 epoch;每轮都用同一份 old_logprob,但 new_logprob 随参数更新而变化。若 approximate KL 超阈值,就提前结束剩余 epoch。 第七步,丢弃这批 on-policy 数据,用更新后的 actor 重新采样。此时新策略成为下一轮的 old policy。PPO 能复用的是“一轮之内的有限次数”,并没有把数据永久变成离线训练集。 用张量形状检查这套流程也很有效。经典控制任务常见 reward/value/advantage/logprob 都是 [T, N],其中 $T$ 是 rollout 长度,$N$ 是并行环境数;语言模型常见 [B, L],其中 $B$ 是回答数,$L$ 是序列长度。只要其中一个量偷偷变成 [B] 并发生广播,训练可能不会报错,却会让整条回答的每个 token 共享一个本不该共享的系数。 3.7 手算一条两步轨迹 用一个最小数字例子把 GAE 和 clip 接起来。设两步奖励为 $[0,1]$,critic 预测为 $[0.4,0.7]$,第二步后真正终止,$\gamma=0.9$。最后一步的 TD 残差是 $\delta_1=1-0.7=0.3$;第一步是 $\delta_0=0+0.9\times0.7-0.4=0.23$。当 $\lambda=0.95$ 时: $$\hat A_0=0.23+0.9\times0.95\times0.3=0.4865$$ 对应的 value target 为 $0.4865+0.4=0.8865$,接近完整 Monte Carlo 回报 $0+0.9\times1=0.9$。若 $\lambda=0$,target 只有 $0.23+0.4=0.63$,它完全相信 critic 对下一状态的 0.7 估计。这几个数把“依赖 critic”和“纳入远期真实奖励”的差别直接展开了。 再设旧策略给第一步动作的概率是 0.25,新策略更新后变为 0.30,则 ratio 为 $0.30/0.25=1.2$。若该动作优势为 0.4865,正好到 $\epsilon=0.2$ 的上边界;继续把概率推到 0.35 时,未裁剪收益会按 ratio=1.4 计算,裁剪收益仍只按 1.2 计算,min 选择后者。若优势改为负数,1.4 一侧不会被保护,因为提高坏动作概率应该继续受到惩罚。 这个例子也说明两个超参数并不独立。$\lambda$ 改变优势的大小和噪声,进而改变样本多久撞上 clip;$\epsilon$ 决定同一批优势可以推动概率多远。只调其中一个而不观察 ratio 分布,往往解释不了训练曲线。 04. 代码实现 4.1 逐步算 GAE code/gae_minimal.py 只依赖 NumPy。它先对一条长度为 4 的固定轨迹从后向前递推,再模拟 20000 条随机轨迹,比较不同 $\lambda$ 下 value target 对真实 $V(s_0)$ 的偏差和方差。固定轨迹的真实输出是: rewards.shape=(4,), values.shape=(4,) lambda=0.00 delta=[0.1445 0.143 0.597 0.2 ] A=[0.1445 0.143 0.597 0.2 ] lambda=0.50 delta=[0.1445 0.143 0.597 0.2 ] A=[0.3858 0.4875 0.696 0.2 ] lambda=0.95 delta=[0.1445 0.143 0.597 0.2 ] A=[0.9734 0.8814 0.7851 0.2 ] lambda=1.00 delta=[0.1445 0.143 0.597 0.2 ] A=[1.0652 0.93 0.795 0.2 ] 同一行的 delta 不随 $\lambda$ 变化,因为它只由一步奖励和 critic 决定;$\lambda$ 改变的是未来残差往前传播的强度。最后一步已经终止,所以四组优势都等于 0.2。 随机实验故意给 critic 加入固定误差,结果是: episodes=20000, true_V0=4.2083, critic_V0=4.5083 lambda mean bias std mse 0.00 3.3133 -0.8950 0.7941 1.4315 0.50 3.8265 -0.3818 0.9201 0.9924 0.95 4.1767 -0.0316 1.8754 3.5181 1.00 4.2130 0.0048 2.2029 4.8529 $\lambda$ 从 0 增大到 1,偏差从 -0.8950 降到接近 0,标准差却从 0.7941 增至 2.2029。这个设定里 $\lambda=0.5$ 的均方误差最低;换一个 critic 误差和奖励噪声,最优点也会移动。这正是“偏差—方差折中”的可观测含义。 图 1:同一随机环境与 critic 误差下,$\lambda$ 改变了偏差和方差的配比。曲线由 make_figures.py 根据 20000 条固定随机种子轨迹生成。 4.2 看懂裁剪的符号 code/ppo_clip_minimal.py 先列出单样本裁剪表。下面四行足以解释 min: ratio A ratio*A clip(ratio)*A min clipped? 1.35 1.0 1.350 1.200 1.200 yes 0.65 1.0 0.650 0.800 0.650 no 1.35 -1.0 -1.350 -1.200 -1.350 no 0.65 -1.0 -0.650 -0.800 -0.800 yes 第一行是好动作已经涨太多,因此收益停在 1.2。第二行是好动作被错误地下调,目标仍取更差的 0.65。第三行是坏动作被错误地上调,惩罚保留 -1.35。第四行才是坏动作下降过多后停止继续奖励。clip 只截断“继续沿正确方向冲得更远”的激励。 图 2:蓝色阴影是 $[1-\epsilon,1+\epsilon]$。正优势在右侧形成平台,负优势在左侧形成平台,另一侧继续保留惩罚。 脚本还构造了一个两臂老虎机:旧策略给好、坏动作各 0.5 概率,同一批数据更新 40 轮。不裁剪时,好动作概率一路升到 0.9492,新旧策略 KL 达 0.8231;PPO-Clip 在第三轮越过 1.2 附近后梯度归零,停在 0.6097,KL 为 0.0246: mode epoch p(good) ratio_good grad KL(old||new) unclipped 3 0.6097 1.2193 0.4890 0.0246 unclipped 40 0.9492 1.8984 0.0990 0.8231 PPO-Clip 3 0.6097 1.2193 0.4890 0.0246 PPO-Clip 40 0.6097 1.2193 0.0000 0.0246 为什么停在 1.2193 而不是精确的 1.2?因为脚本用有限学习率做离散更新,第三步从区间内跨到了区间外,跨过以后才失去梯度。真实神经网络也会出现这种越界,所以还要监控 approximate KL,并在过大时提前停止 epoch。 05. 工业级实现对照 参考实现以 2026-09-08 的上游主分支为准。知识树原来记录的 huggingface/trl/trl/trainer/ppo_trainer.py 已经不在 TRL 当前主分支;当前 TRL 的 trainer 目录以 GRPO、DPO、RLOO 等实现 为主。因此本文把仍在维护、能直接核对 PPO 细节的 Stable-Baselines3 PPO.train 作为代码锚点,同时用 TRL GRPOTrainer 观察 LLM 对齐算法如何改写这些组件。 最小脚本与工业实现的差别主要有六处: rollout buffer:工业实现保存 observation、action、old log-prob、value、reward、termination mask,并在采样结束后统一算 GAE。old log-prob 必须冻结,不能在每个 epoch 重算。 优势标准化:常见实现按 minibatch 或整批做 $(A-\mu)/(\sigma+\varepsilon)$。它通常改善数值尺度,却会让一个样本的梯度依赖同批其他样本;batch 太小还可能产生不稳定统计量。 多轮 minibatch:Stable-Baselines3 的默认参数明确包含 n_epochs=10、gamma=0.99、gae_lambda=0.95、clip_range=0.2。这些是基准默认值,不应脱离任务直接复制。 价值函数处理:actor 与 critic 常共享 backbone,并用 vf_coef 合并损失;一些实现还裁剪 value 更新。value clipping 的尺度受奖励缩放影响,不能把 policy clip 的 $\epsilon$ 无脑复用。 额外护栏:除了 ratio clip,还会使用梯度范数裁剪、熵正则、approximate KL、target KL early stop、学习率退火和数值异常检查。Stable-Baselines3 的参数说明也明确指出,clip 本身不足以保证更新一定很小。 LLM 的 token mask:prompt token、padding 和 completion token 必须分开。策略损失通常只落在生成 token 上;序列末端奖励要变成 token 级回报,KL 往往逐 token 计算。错误的 mask 会把 padding 当动作,或者让 prompt 本身参与优化。 在 RLHF 里还要额外记录 reward/score、reward/non_score_reward、policy/approxkl、policy/clipfrac、loss/value、熵、响应长度和终止比例。只看总 reward 上升无法判断是任务能力提高、KL 惩罚变化,还是模型学会钻奖励与长度的空子。 5.1 指标应该怎样联读 clipfrac 必须先确认实现口径:常见日志统计 $|r_t-1|>\epsilon$,但真正进入目标平台还要满足“正优势且 ratio 过大”或“负优势且 ratio 过小”。越界比例不等于梯度被截断比例。它长期接近 0,可能说明学习率过小、epoch 太少、优势太弱,也可能只是策略已经接近局部平稳;它突然接近 1,说明新旧动作概率已大幅偏离,应结合优势符号与 KL 判断;错误方向的越界样本仍有纠正梯度。单独追求某个“漂亮”的 clipfrac 没有意义,应与 KL、entropy 和 reward 一起看。 approximate KL 快速增大而 reward 没有改善,通常先检查学习率、更新 epoch、优势尺度和 mask。如果 KL 很小、entropy 很快下降,则可能是分布变化集中在少数关键 token,平均 KL 把局部坍缩稀释了,需要再看 token 级分位数或最大值。 critic loss 下降也不一定是好消息。若 explained_variance 仍接近 0,critic 可能只学会了回报均值;若训练 loss 很低而新 rollout 上的 value error 很高,critic 在记忆同批噪声。此时 actor 收到的优势基线并不可靠。可以检查优势均值、标准差、与 return 的相关性,并把 value 网络的学习轮数与 actor 分开调节。 语言模型还有一个常见组合信号:任务 reward 上升、KL 惩罚绝对值变大、回答长度持续增加、人工质量不升。它常意味着奖励模型偏好长度或某种格式,策略在用分布漂移换分。解决顺序应是先按长度和题型切片评估奖励,再检查 EOS 奖励与 truncation,最后才调整 $\beta$。只增大 KL 系数会把症状压住,却不能修复有偏的反馈。 5.2 一个最小验收清单 正式放大训练前,可以用小 batch 做四个不依赖最终 reward 的验收。新旧模型完全一致时,所有有效位置的 ratio 应接近 1,approximate KL 应接近 0;把优势全设为 0 后,policy loss 对 actor 的梯度应为 0;交换优势正负号后,选中动作的更新方向应反转;只改变 padding 内容而保持 mask 不变时,损失应不变。这四项能抓住大部分 silent broadcasting、旧概率未冻结和 mask 泄漏问题。 06. 代价与边界 PPO 的优点是实现直接、可对 actor 和 critic 使用普通一阶优化器、同一批 rollout 可以复用多个 epoch。它的代价也很具体。 第一,PPO 仍是 on-policy 算法。ratio 能容忍有限的策略变化,却不能把很久以前的 replay data 变成可靠的当前策略数据。生成模型的 rollout 很贵,这也是许多对齐算法试图绕开在线 PPO 的原因。 第二,critic 会占显存、计算和调参预算。GAE 的质量由奖励噪声、value 误差、终止处理共同决定。critic 拟合得太慢,优势带偏;拟合得太快,又可能记住同一批高噪声回报。 第三,clip 是代理目标的启发式约束。它不等价于 TRPO 的显式 trust region,也不保证真实期望回报单调上升。大 batch、较小学习率、较少 epoch 和 target KL 能降低风险,仍需用新 rollout 验证。 第四,奖励尺度会渗透到整个系统。优势标准化能消除一部分尺度问题,critic loss、value clipping、梯度竞争和终止奖励仍受影响。LLM 的序列长度还会改变 token 级 KL 总量,导致长回答受到更大惩罚或获得更多优化机会。 以下情况不适合直接上 PPO:没有可信在线奖励或无法持续采样;动作空间可枚举且能直接做监督式偏好优化;离线数据远多于在线交互预算;安全约束必须严格满足而不能只靠软惩罚;环境极端稀疏奖励且 critic 没有可学习信号。此时应先解决反馈、数据或约束建模,而不是把希望寄托在 clip 上。 调试时也应先分清“估计坏了”还是“优化走远了”。前者常表现为优势高噪声、critic 解释方差差、不同随机种子更新方向不稳定,应检查奖励、bootstrap 和 GAE;后者常表现为前几个 minibatch 正常,随后 ratio、KL、clipfrac 一起升高,应减少学习率、epoch 或启用 KL early stop。两类问题都会造成 reward 抖动,但修复手段完全不同。 还要保留旧策略下的原始 rollout 指标。只比较更新后的 loss 无法回答“策略是否真的更好”;每轮更新后用新策略重新采样,并按任务、长度和难度切片比较回报,才能排除同一批数据上的代理目标过拟合。至少运行多个随机种子,因为一次 rollout 的偶然高分足以让小样本实验得出相反结论。 07. 经典论文脉络 REINFORCE:Williams 在 1992 年的 Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning 给出基于采样回报和 log-derivative 的经典策略梯度形式,优点是通用,主要问题是方差高。 TRPO:Trust Region Policy Optimization(2015)用 KL 约束和二阶近似限制策略更新,为“旧数据上走多远”给出更严格的处理,但实现复杂。 GAE:High-Dimensional Continuous Control Using Generalized Advantage Estimation(2015)把 TD($\lambda$) 思想用于优势估计,明确控制 bias 与 variance。 PPO:Proximal Policy Optimization Algorithms(2017)用 clip 或 KL penalty 构造易实现的一阶替代目标,让同一批数据可做多轮 minibatch 更新。 InstructGPT:Training language models to follow instructions with human feedback(2022)展示了 SFT、奖励模型和 PPO 组合成语言模型 RLHF 流水线的代表性实践,也让参考模型 KL 成为对齐工程中的常见组件。 这条演进线并不是“新论文淘汰旧论文”。REINFORCE 给出梯度来源,GAE 改善估计,TRPO/PPO 限制更新,RLHF 再把状态、动作、奖励和约束映射到序列模型。后续算法通常只替换其中一到两块。 08. 常见误解 误解一:优势为正就说明奖励为正 优势是相对量。一个回答奖励为 -2,如果当前 prompt 下平均只能拿 -5,它的优势仍可能为正;一个回答奖励为 9,如果该状态平均是 9.5,它的优势反而为负。策略更新比较的是条件基线,不是绝对分数。 误解二:把优势乘常数不会影响训练 纯策略梯度方向不变,但真实 PPO 还有固定学习率、clip、value loss、熵和 KL 项。优势尺度改变后,各损失的相对权重、越过 clip 边界的速度都会改变。优势标准化是训练定义的一部分,不能只当日志美化。 误解三:ratio 超出区间后一定没有梯度 只有“超出区间且方向有利”的样本会被截断。好动作概率下降得太多、坏动作概率上升得太多时,目标仍保留梯度去纠正。04 节的四行表比背公式更可靠。 误解四:PPO clip 就是 KL trust region clip 在采样动作上限制替代收益,KL 衡量整个动作分布的变化。一个低概率 token 的概率可以相对变化很多而对平均 KL 贡献有限;许多小变化也可能累积出较大 KL。工程实现常同时监控 ratio、clip fraction 和 KL。 误解五:episode 截断等于终止 死亡、成功等真实终止意味着后续价值为零;时间上限只是观察窗口结束,底层状态可能仍有价值。两者都清零 bootstrap 会使 rollout 尾部的 value target 偏低。在固定最大生成长度的 LLM 训练中,这一点对应 EOS 与被长度上限截断的区别。 误解六:old policy 和 reference policy 是同一个概念 old policy 是一轮 PPO 的行为策略快照,几轮 minibatch 后就会更新;reference policy 是长期锚点,通常在 RL 开始时冻结。前者服务于重要性采样,后者服务于行为约束。 09. 动手验证 先在仓库根目录运行: python3 outputs/fundamentals_files/policy_gradient/code/gae_minimal.py python3 outputs/fundamentals_files/policy_gradient/code/ppo_clip_minimal.py 接着做三个小改动,每次只改一个变量并记录输出。 把 gae_minimal.py 的 critic_error 全部设为 0。你会看到 $\lambda=0$ 的偏差大幅下降;奖励噪声不变时,小 $\lambda$ 的低方差优势变得更有吸引力。 把奖励噪声标准差从 0.8 改为 0.1。完整 Monte Carlo target 的方差会明显下降,$\lambda=1$ 的代价随之减小。 把 ppo_clip_minimal.py 的学习率从 0.3 改为 0.03。PPO-Clip 会更接近 ratio=1.2 后才停住,说明 clip 边界不是参数投影,离散优化仍会跨界。 最后给脚本加入 target_kl=0.02 的提前停止条件:每轮更新后计算 KL(old||new),超过阈值就停止。比较它与 ratio clip 的停止轮数。你会看到两种护栏观察的是不同量,也会理解工业实现为什么常把它们同时保留。 10. 延伸阅读 读完这篇可以继续看: 从 DPO 到 GRPO:去掉价值网络:比较偏好优化、组内相对优势与 PPO critic,追踪它们分别改了哪一项。 RLHF 工程实践:继续研究 token mask、参考模型 KL、奖励白化、长度偏置与分布式 rollout。 视频生成中的强化学习与奖励模型:把策略梯度和相对优势迁移到扩散与 flow matching 生成过程,观察奖励黑客如何出现。 回到开头那三个问题,现在可以逐项检查任何新对齐算法:它用什么分配信用,用什么基线或优势降低噪声,用什么机制约束策略变化。只要这三项说清楚,新名词就不会遮住算法真正改变的地方。 附录:完整代码 09 节用到的脚本全文如下(gae_minimal.py、make_figures.py、ppo_clip_minimal.py)。复制到本地存成同名文件,按各脚本开头的依赖说明准备环境后即可运行。 gae_minimal.py #!/usr/bin/env python3 """用 NumPy 展示 GAE 递推,以及 lambda 的偏差—方差折中。 依赖:numpy。运行:python3 gae_minimal.py """ import numpy as np def generalized_advantage_estimate(rewards, values, dones, next_value, gamma, lam): """返回 TD 残差、GAE 优势和 value target,输入均为 shape [T]。""" rewards = np.asarray(rewards, dtype=np.float64) values = np.asarray(values, dtype=np.float64) dones = np.asarray(dones, dtype=np.float64) advantages = np.zeros_like(rewards) deltas = np.zeros_like(rewards) gae = 0.0 for t in reversed(range(len(rewards))): value_next = next_value if t == len(rewards) - 1 else values[t + 1] not_done = 1.0 - dones[t] deltas[t] = rewards[t] + gamma * not_done * value_next - values[t] gae = deltas[t] + gamma * lam * not_done * gae advantages[t] = gae return deltas, advantages, advantages + values def fixed_trajectory_demo(): rewards = np.array([0.0, 0.0, 1.0, 0.5]) values = np.array([0.40, 0.55, 0.70, 0.30]) dones = np.array([0, 0, 0, 1]) gamma = 0.99 print("=== 固定轨迹 ===") print(f"rewards.shape={rewards.shape}, values.shape={values.shape}") for lam in (0.0, 0.5, 0.95, 1.0): deltas, advantages, targets = generalized_advantage_estimate( rewards, values, dones, next_value=0.0, gamma=gamma, lam=lam ) print( f"lambda={lam:>4.2f} delta={np.round(deltas, 4)} " f"A={np.round(advantages, 4)} target={np.round(targets, 4)}" ) def bias_variance_demo(seed=7, episodes=20000): """比较 GAE value target 对真实 V(s_0) 的偏差、标准差和均方误差。""" rng = np.random.default_rng(seed) gamma = 0.99 reward_means = np.linspace(0.2, 0.9, 8) horizon = len(reward_means) dones = np.zeros(horizon) dones[-1] = 1.0 true_values = np.zeros(horizon) for t in reversed(range(horizon)): future = 0.0 if t == horizon - 1 else true_values[t + 1] true_values[t] = reward_means[t] + gamma * future # 故意给 critic 加一组固定误差,使短视的 TD target 有偏。 critic_error = np.array([0.30, -0.90, 0.35, -0.25, 0.20, -0.15, 0.10, -0.05]) approx_values = true_values + critic_error rewards_batch = rng.normal(reward_means, 0.8, size=(episodes, horizon)) print("\n=== lambda 的偏差—方差折中(估计 V(s_0))===") print(f"episodes={episodes}, true_V0={true_values[0]:.4f}, critic_V0={approx_values[0]:.4f}") print("lambda mean bias std mse") for lam in (0.0, 0.5, 0.95, 1.0): estimates = np.empty(episodes) for i, rewards in enumerate(rewards_batch): _, advantages, targets = generalized_advantage_estimate( rewards, approx_values, dones, next_value=0.0, gamma=gamma, lam=lam ) estimates[i] = targets[0] bias = estimates.mean() - true_values[0] mse = np.mean((estimates - true_values[0]) ** 2) print(f"{lam:>6.2f} {estimates.mean():>8.4f} {bias:>8.4f} {estimates.std():>8.4f} {mse:>8.4f}") if __name__ == "__main__": fixed_trajectory_demo() bias_variance_demo() make_figures.py #!/usr/bin/env python3 """生成本文的 GAE 偏差—方差图与 PPO 裁剪曲线。 依赖:numpy、matplotlib。运行:python3 make_figures.py 图片写入相邻的 figures/ 目录。 """ from pathlib import Path import matplotlib.pyplot as plt import numpy as np from gae_minimal import generalized_advantage_estimate from ppo_clip_minimal import clipped_surrogate OUT_DIR = Path(__file__).resolve().parent.parent / "figures" def gae_tradeoff_figure(seed=7, episodes=20000): rng = np.random.default_rng(seed) gamma = 0.99 means = np.linspace(0.2, 0.9, 8) dones = np.zeros(len(means)) dones[-1] = 1.0 true_values = np.zeros(len(means)) for t in reversed(range(len(means))): true_values[t] = means[t] + gamma * (0.0 if t == len(means) - 1 else true_values[t + 1]) approx_values = true_values + np.array([0.30, -0.90, 0.35, -0.25, 0.20, -0.15, 0.10, -0.05]) reward_batch = rng.normal(means, 0.8, size=(episodes, len(means))) lambdas = np.array([0.0, 0.25, 0.5, 0.75, 0.95, 1.0]) bias, std, mse = [], [], [] for lam in lambdas: estimates = [] for rewards in reward_batch: _, _, targets = generalized_advantage_estimate( rewards, approx_values, dones, 0.0, gamma, lam ) estimates.append(targets[0]) estimates = np.asarray(estimates) bias.append(estimates.mean() - true_values[0]) std.append(estimates.std()) mse.append(np.mean((estimates - true_values[0]) ** 2)) fig, ax = plt.subplots(figsize=(10, 5.3)) ax.plot(lambdas, np.abs(bias), "o-", linewidth=2.5, label="Absolute bias") ax.plot(lambdas, std, "s-", linewidth=2.5, label="Standard deviation") ax.plot(lambdas, mse, "^-", linewidth=2.5, label="Mean squared error") ax.set(xlabel="GAE lambda", ylabel="Error scale", title="GAE: less bias usually costs more variance") ax.grid(alpha=0.25) ax.legend(frameon=False) fig.tight_layout() path = OUT_DIR / "gae_bias_variance.png" fig.savefig(path, dpi=180, facecolor="white") plt.close(fig) return path def ppo_clip_figure(): ratio = np.linspace(0.4, 1.6, 500) fig, axes = plt.subplots(1, 2, figsize=(11, 4.8), sharex=True) for ax, advantage in zip(axes, (1.0, -1.0)): raw, clipped, objective = clipped_surrogate(ratio, np.full_like(ratio, advantage)) ax.plot(ratio, raw, linestyle="--", linewidth=2, label="Unclipped") ax.plot(ratio, objective, linewidth=3, label="PPO objective") ax.axvspan(0.8, 1.2, color="#2f6df6", alpha=0.08) ax.axvline(1.0, color="black", linewidth=1, alpha=0.5) ax.set_title(f"Advantage = {advantage:+.0f}") ax.set_xlabel("new / old probability ratio") ax.grid(alpha=0.2) axes[0].set_ylabel("Per-sample surrogate") axes[0].legend(frameon=False) fig.suptitle("PPO-Clip is one-sided and depends on the advantage sign", fontsize=14) fig.tight_layout() path = OUT_DIR / "ppo_clip_sign.png" fig.savefig(path, dpi=180, facecolor="white") plt.close(fig) return path if __name__ == "__main__": OUT_DIR.mkdir(parents=True, exist_ok=True) for output in (gae_tradeoff_figure(), ppo_clip_figure()): print(f"saved: {output} ({output.stat().st_size / 1024:.1f} KiB)") ppo_clip_minimal.py #!/usr/bin/env python3 """用 NumPy 拆解 PPO-Clip,并在两臂老虎机上复用同一批数据更新多轮。 依赖:numpy。运行:python3 ppo_clip_minimal.py """ import numpy as np def clipped_surrogate(ratio, advantage, epsilon=0.2): ratio = np.asarray(ratio, dtype=np.float64) advantage = np.asarray(advantage, dtype=np.float64) unclipped = ratio * advantage clipped = np.clip(ratio, 1.0 - epsilon, 1.0 + epsilon) * advantage objective = np.minimum(unclipped, clipped) return unclipped, clipped, objective def clipping_table(): ratios = np.array([1.35, 0.65, 1.35, 0.65, 1.10, 0.90]) advantages = np.array([1.0, 1.0, -1.0, -1.0, 0.5, -0.5]) raw, clipped, objective = clipped_surrogate(ratios, advantages) print("=== 单样本裁剪表 ===") print(" ratio A ratio*A clip(ratio)*A min clipped?") for r, a, u, c, o in zip(ratios, advantages, raw, clipped, objective): flag = "yes" if not np.isclose(u, o) else "no" print(f" {r:>4.2f} {a:>4.1f} {u:>7.3f} {c:>7.3f} {o:>6.3f} {flag}") def sigmoid(x): return 1.0 / (1.0 + np.exp(-x)) def bandit_objective(theta, clipped): """旧策略两动作概率各 0.5;动作 1 优势 +1,动作 0 优势 -1。""" p_good = sigmoid(theta) ratios = np.array([p_good / 0.5, (1.0 - p_good) / 0.5]) advantages = np.array([1.0, -1.0]) if clipped: return clipped_surrogate(ratios, advantages)[2].mean() return np.mean(ratios * advantages) def finite_difference_gradient(theta, clipped, h=1e-5): return (bandit_objective(theta + h, clipped) - bandit_objective(theta - h, clipped)) / (2 * h) def bernoulli_kl(old_p, new_p): return old_p * np.log(old_p / new_p) + (1.0 - old_p) * np.log((1.0 - old_p) / (1.0 - new_p)) def optimize_same_batch(clipped, steps=40, learning_rate=0.3): theta = 0.0 snapshots = [] watch = {0, 1, 2, 5, 10, 20, 39} for step in range(steps): grad = finite_difference_gradient(theta, clipped) theta += learning_rate * grad if step in watch: p_good = sigmoid(theta) ratio_good = p_good / 0.5 snapshots.append((step + 1, p_good, ratio_good, grad, bernoulli_kl(0.5, p_good))) return snapshots def repeated_update_demo(): print("\n=== 在同一批旧策略数据上更新 40 轮 ===") print("mode epoch p(good) ratio_good grad KL(old||new)") for mode, clipped in (("unclipped", False), ("PPO-Clip", True)): for epoch, p_good, ratio, grad, kl in optimize_same_batch(clipped): print(f"{mode:<10} {epoch:>5d} {p_good:>7.4f} {ratio:>7.4f} {grad:>7.4f} {kl:>7.4f}") if __name__ == "__main__": clipping_table() repeated_update_demo() 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月08日
7 阅读
0 评论
0 点赞
2026-09-07
AIGC 每日速读|2026-09-07|腾讯3B活跃参数逼近万亿代理-WeAgent
今日 AIGC 论文速览 今日共 10 篇 重点论文标题列表 WeAgent-MMGenEdit(腾讯微信 AI(Weixin AI, Tencent)):3B活跃参数逼近万亿代理 PriorEdit3D(北京航空航天大学、中央财经大学、VAST、北京市智能创意内容生成与沉浸体验重点实验室):7秒完成无配对3D编辑 ⚡ ReaDiT(伊利诺伊大学厄巴纳-香槟分校(UIUC)):一个DiT块控制图像与视频 EditVid(伊利诺伊大学厄巴纳-香槟分校(UIUC)):免训练视频编辑跃升19分 FlashRender(EverEx、延世大学、高丽大学):4步完成相机轨迹重拍 今日论文速览 1. WeAgent-MMGenEdit:3B活跃参数逼近万亿代理 WeAgent-MMGenEdit: A Full-Stack Recipe for Multimodal Agentic Image Generation and Editing | 腾讯微信 AI(Weixin AI, Tencent) | arXiv:2609.05171 关键词:代理式图像生成,多模态检索,视觉证据验证,多参考编辑,强化学习,双语基准,WeAgent ⚠️ 前序问题:知识密集型图像生成真正难的不是把搜索接口接到模型上,而是让正确证据进入最终像素。现有代理常凭标题或元数据选图,没有逐张检查视觉内容;同一个策略又要规划、筛选并背着不断增长的上下文,容易混淆实体;即便找到了正确文字和图片,松散附件也没有明确绑定人物、属性和空间位置。结果是代理能说对事实,却仍会在信息图、多人物组合或时事更新中画错对象与版式。 本文贡献:WeAgent-MMGenEdit 给出一套从运行时、数据、基准到双侧后训练的完整配方。WeAgent-Harness 按“检索—验证—整合—交付”组织七类工具,把证据以稳定 ID 存入持久工作区,并用独立视觉工具显式验图;通过代码把核实后的文字、图片和布局编成稠密视觉载体,再交给生成器。数据管线构造约 2.3 万条 SFT 轨迹和 1.47 万个 RL 任务,每个任务都带代理链、生成输入和最终图像三层清单。策略侧先 SFT 再做清单约束 RL,图像侧也用多参考 SFT 和多目标 RL 训练。 实验效果:自建 WeBench-MMGenEdit 含 300 个经人工审核的中英双语任务,生成与编辑、中文与英文各占一半,94% 的任务需要至少五跳检索,69.3% 的编辑任务含多张用户图片。在同一 Harness 和 GPT-Image-2 后端下,30B 总参数、3B 活跃参数的 WeAgent-RL 相对同规模 Qwen3-VL 基线,生成加权均分提高 12.45 分,编辑加权均分提高 16.72 分;其表现接近 1T 总参数的 Kimi-K2.6 代理。 批判点评:这篇最有价值的设计是把证据量与策略上下文解耦:图片和网页留在持久工作区,策略只传稳定引用,需要时再验,这比把所有像素塞进上下文更适合长轨迹。三层清单也能把“搜索错了”“提示没带全”和“后端没画对”分开归因。代价是整套系统依赖搜索、视觉检查、代码渲染、图像生成和多名裁判,成本与故障面都不小;对网页时效、来源可信度和恶意内容的防护也没有被一个高分基准自动解决。 2. PriorEdit3D:7秒完成无配对3D编辑 Learning 3D Editing without Paired Supervision via Generative Prior Distillation | 北京航空航天大学、中央财经大学、VAST、北京市智能创意内容生成与沉浸体验重点实验室 | arXiv:2609.04942 关键词:3D编辑,生成先验蒸馏,无配对监督,分布匹配,多视图一致性,前馈模型,PriorEdit3D ⚠️ 前序问题:指令驱动 3D 编辑缺少高质量的编辑前后成对资产。测试时优化方法每个对象都要重新迭代,速度慢;用复杂管线制造伪配对数据又容易把 2D 编辑器的结构漂移和几何伪影写进监督。只在主视角追求文本对齐还会出现“正面看起来对、转到侧面就塌掉”的投影欺骗,因此需要在没有成对 3D 真值的条件下同时约束指令、身份和三维几何。 本文贡献:PriorEdit3D 用可微渲染把三种已训练基础模型的先验直接蒸馏进前馈 3D 编辑器:主编辑视角由 2D 图像编辑模型提供像素视觉目标;新视角由视觉语言模型判断指令遵循与源对象身份;3D-aware Distribution Matching 则在图生 3D 教师的 latent 流形内约束编辑结果,阻止单视角监督导致几何坍塌。整个方法无需反演、无需局部掩码,也不依赖真实的成对 3D 编辑数据。 实验效果:在作者的 PriorEdit3D 测试集上,方法达到 24.37 PSNR、0.94 SSIM、71.96 FID,LLM 身份保持率 93.13%、指令遵循率 86.92%,单个编辑在 A100 上约 7 秒;对比的 Nano3D 为 19.90 PSNR、103.50 FID、14 秒。迁移到 ABO 与 GSO 后,方法的 FVD 为 168.78、LLM 指令遵循率 68.41%,也优于表中对比项。 批判点评:把视觉、语义和几何先验拆给三个教师是合理的,因为单一 2D 教师无法提供背面约束。消融也显示 VLM 与 3D 分布匹配各自补不同缺口。不过教师的偏差会层层传递:图像编辑器决定风格,VLM 决定语义容忍度,图生 3D 教师决定几何流形;遇到教师不熟悉的物体、透明材质或拓扑大改时,前馈速度优势可能换来保守编辑。 3. ReaDiT:一个DiT块控制图像与视频 ReaDiT Guidance: Control for Image and Video Generation using Diffusion Transformer Features | 伊利诺伊大学厄巴纳-香槟分校(UIUC) | arXiv:2609.04649 关键词:Diffusion Transformer,空间控制,特征读出,深度控制,姿态控制,视频运动控制,ReaDiT ⚠️ 前序问题:ControlNet 一类适配器能给扩散模型加入深度、姿态或边缘条件,但通常复制大块网络,需要大量成对数据;扩展到视频时参数和训练成本进一步放大。完全免训练的特征引导虽然轻,却可能只支持单一骨干或单一模态。问题因此变成:能否不让生成模型在前向时直接吃控制图,只从其内部表征读出空间误差,再反向调整噪声 latent。 本文贡献:ReaDiT 从冻结 DiT 的单个中间块提取特征,用一个带时间步条件的多尺度读出器预测深度、姿态或边缘,再把预测与目标控制图之间的损失梯度施加到当前 latent。生成骨干不直接接收控制条件,这种隐式条件化让同一思路可以覆盖图像和视频;在视频上还能用光流或相机轨迹目标控制运动。其图像版本约 53M 参数,远小于论文估算的 1.487B 参数 ControlNet 图像适配器。 实验效果:图像实验中,ReaDiT 在生成图控制条件上取得深度 RMSE 0.2492、姿态 PCK@0.2 0.5380、姿态 mAP 0.3709 和边缘 ODS 0.6968,多数指标优于 1.487B 参数的 ControlNet。视频空间控制中,它把 RG 的深度 RMSE 从 0.4610 降到 0.4225,姿态 PCK 从 0.1892 提到 0.3651,边缘 ODS 从 0.5304 提到 0.6101。 批判点评:只读一个 DiT 块就能跨图像与视频工作,说明预训练生成特征里已经包含可用空间信息;这比为每种骨干复制一套大适配器更容易维护。它的限制也来自同一点:读出器知道“当前画面离目标多远”,却不一定知道最稳定的生成路径,强梯度在遮挡、快速运动或互相冲突的控制图下可能牺牲画质。工程采用前应同时测控制误差、生成质量和额外反向传播的延迟。 4. EditVid:免训练视频编辑跃升19分 One Editor, Many Edits: A Unified Training-Free Framework for Diverse Video Editing | 伊利诺伊大学厄巴纳-香槟分校(UIUC) | arXiv:2609.04190 关键词:视频编辑,免训练方法,稀疏因果记忆,身份保持,latent混合,多参考编辑,EditVid ⚠️ 前序问题:逐帧调用图像编辑器会造成闪烁、身份漂移和背景误改;专用视频编辑模型又需要昂贵训练,并常被限定在指令编辑或主体替换中的一种。一个统一框架必须同时解决相邻帧局部连续、远距离身份一致和编辑区域边界三件事,还要保留现代图像 MM-DiT 的多种编辑能力。 本文贡献:EditVid 冻结图像 MM-DiT,在推理期组合三个机制:稀疏因果记忆复用上一帧选定的注意力键值,保持局部连续;基于对应关系的后注意力 token 注入把锚帧身份带到远帧;软 latent 混合让目标区域接受编辑,同时保护背景。相同框架覆盖风格迁移、属性修改、对象插入、局部编辑和主体替换,也支持指令与参考图两种条件。 实验效果:在 FiVE 基准上,EditVid 达到 78.16 FiVE-Acc,最强的已评估免训练基线为 58.95,提升 19.21 分;在 IVEBench 上取得有竞争力的结果。面对 7 个对比方法的用户研究中,EditVid 获得 51.8% 的总体偏好率。 批判点评:三个机制分别对应短期、长期和空间局部性,职责划分清楚,且能复用强图像编辑器的新能力。风险在于对应关系是整个系统的支点:快速运动、长期遮挡或主体外观剧变会让锚帧 token 注入错误位置,造成“身份保持”反而覆盖合理变化。软混合也依赖编辑区域估计,细发丝、透明物体和反射场景会更难处理。 5. FlashRender:4步完成相机轨迹重拍 FlashRender: Few-Step Generative Rendering via Camera-Controlled Video MeanFlow | EverEx、延世大学、高丽大学 | arXiv:2609.03563 关键词:生成式渲染,相机控制,MeanFlow,少步采样,视频重拍,在策略蒸馏,FlashRender ⚠️ 前序问题:生成式渲染要把源视频沿新的相机轨迹“重拍”。传统多步扩散不仅慢,而且相机条件在不同采样步的作用不一致,这种离散化误差会弯曲去噪轨迹;直接做少步蒸馏时,学生还会在自己的 rollout 状态上积累误差,导致几何和画质同时下降。 本文贡献:FlashRender 先用 Representation Transformation and Alignment(RETA)把源视频隐藏表征对齐到冻结视觉几何模型提取的目标视角特征,把相机变换直接编码进源流,使控制在各采样步更一致。随后用 MeanFlow 目标拟合曲率更低的轨迹,最后用 on-policy flow-map distillation 针对学生自己的固定少步 rollout 修正误差。模型基于 Wan2.1-1.3B-CamCtrl,只需 4 次函数评估。 实验效果:论文报告在视频质量和几何一致性上可匹配多步基线,同时把采样成本降低 25 倍,并在分布外目标相机轨迹上取得更好的可控性。示例以 480×832 分辨率、单张 NVIDIA B200 测速,可在数秒内完成任意长度输入视频的目标轨迹重拍。 批判点评:方法最有启发的是先修控制不一致、降低轨迹曲率,再做少步蒸馏,而不是让学生同时吞下几何误差和时间离散误差。它仍依赖冻结几何模型提供可靠目标视角特征;反射、透明物体、动态遮挡和非刚体场景可能让几何先验失真。4 步设定很适合交互预览,但影视生产还需要评估细纹理和长镜头接缝。 6. PRISM-Bench:35项细则专门考生成音频 PRISM-Bench: An Audio-Centric Diagnostic Benchmark for Text-to-Audio-Video Generation | 上海人工智能实验室、美团 | arXiv:2609.04867 关键词:音视频生成,评测基准,音频质量,跨模态同步,MLLM裁判,屏内声源,PRISM-Bench ⚠️ 前序问题:文本到音视频评测通常把音频当成视频质量的附属项,或把声音单独拿出来测,无法回答模型究竟是声音本身差、声源和画面对不上,还是提示词中的音乐与对话没被执行。屏内声源需要精确同步,屏外环境声又不能被错误绑定到可见对象,两者混在总分里会掩盖失败类型。 本文贡献:PRISM-Bench 以音频为中心,把 900 个经人工核验的样本沿两条正交轴拆分:音频类型分语音、音乐和一般声音,声源可见性分屏内与屏外;再从音画一致、音频质量、表现力和提示遵循四个维度定义 35 项细粒度标准。评估采用相对真值参考的盲测并排比较,由增强的多模态大模型裁判执行,避免只给单个生成结果打绝对分。 实验效果:该裁判协议与人类评审的平均一致率超过 70%。对近期文本到音视频系统的测试显示,前沿闭源模型与开源模型之间仍有明显差距;各系统更容易优化总体感知保真度,却在复杂的音画 grounding 与控制上失分,尤其是音乐生成和需要同步的屏内声源。论文已被 ACM Multimedia 2026 接收。 批判点评:按音频类型与声源可见性做二维切片,比继续堆一个总分更能指导模型改进,特别适合发现“画面对了但声音错了”的情况。局限是音频体验高度依赖耳机、响度校准、语言和音乐文化,35 项标准越细,标注一致性和裁判稳定性越难保证;报告结果时应保留分项雷达图,不宜只引用单一排名。 7. WorldReward:分块裁判同时看动作和画质 WorldReward: Reward Modeling for Camera-Conditioned World Models | 复旦大学、腾讯混元、上海创智学院、上海交通大学、上海人工智能实验室 | arXiv:2609.03952 关键词:世界模型,奖励模型,相机控制,视频偏好,视觉语言模型,强化学习,WorldReward ⚠️ 前序问题:相机条件世界模型既要执行移动和旋转指令,又要保持外观、几何和运动自然。几何奖励能估轨迹,却看不出画面是否崩坏;图像奖励能看单帧质量,却忽略动作和时序。把整段长视频与完整动作序列一次交给 VLM,又会让短暂的局部动作证据淹没在长上下文中。 本文贡献:WorldReward 把成对视频按动作边界切成小块,每块整理为源图、帧网格与四个动作面板组成的六图证据,让 VLM 分别判断动作一致性和视觉质量,再由投票聚合成视频级偏好。训练数据由前沿 VLM 生成结构化理由,经工具代理审计与定向人工复核;作者另建 WorldReward-Bench,覆盖平移、旋转与复合相机轨迹。 实验效果:在人工标注的三分类偏好一致率上,WorldReward 的动作、外观和运动三项分别为 77.63%、81.32% 和 73.03%,比 GPT-5.5 高 3.42、1.45 和 3.56 个百分点。用于 HY-WorldPlay 1.5 的强化学习后,约 381 帧长时域的基础动作准确率从 WorldCompass 的 76.56% 提到 78.84%,HPSv3 质量分从 3.72 提到 3.94。 批判点评:按动作切块是解决长上下文稀释的直接方法,而且把动作和画质分开投票,避免高画质掩盖不听指令。投票也会丢掉动作间的因果关系:单块都判断正确,不代表整条轨迹的累计位姿闭环正确。下一步更需要把局部裁判与全局状态估计结合,并验证奖励模型是否会被生成器找到视觉捷径。 8. Puffin-World:1600万样本统一原生3D状态 Puffin-World: Scaling a Unified Multimodal Model with Native 3D World States | 南洋理工大学 S-Lab、密歇根大学、北京交通大学、ACE Robotics | arXiv:2609.04196 关键词:世界模型,3D生成,物理理解,深度重建,相机表示,多模态模型,Puffin-World ⚠️ 前序问题:世界模型常把物理理解、相机控制、图像生成、深度估计和 3D 重建拆成多个离线模块。模块间坐标定义与误差不一致,闭环探索时会累积漂移;模型只生成外观而没有重力、尺度和几何等显式状态,也很难判断新的视图是否仍处在同一个物理世界。 本文贡献:Puffin-World 在一个多模态架构中联合建模三类原生世界状态:物理状态包含重力场与纬度,几何状态为深度,外观状态为图像;统一 Omni-Camera 表示支持不同自由度与相机动作。模型既把物理动力传播到未来帧,也在同一生成过程中耦合外观与几何,从而让自由视角生成同时输出可重建的底层结构。训练集 Puffin-16M 包含 1500 万视觉-语言-相机三元组和 100 万条挑战性运动轨迹。 实验效果:论文展示统一模型可执行相机到世界的物理理解、自由视角空间模拟、3D 世界生成和重建,并支持模仿与自校准探索等交错闭环应用。作者公开了代码、模型和数据;摘要层面没有给出单一总分,而用多任务结果证明同一原生状态表示能覆盖此前分离的能力。 批判点评:把深度和图像一起生成、把相机属性锚定到真实坐标,是走向闭环 3D 世界模型的正确方向;显式重力还能约束“看起来合理但物理方向错了”的画面。最大疑问在数据标定:重力、纬度、深度和相机真值的噪声分布不同,大规模混合后谁主导训练并不透明。模型还能生成稳定视图,不等于已经学会接触、质量和材料等完整动力学。 9. EraseSAE:单义特征做视频概念手术 EraseSAE: Surgical Concept Erasure in Text-to-Video Diffusion Models via Sparse Autoencoders | 中国科学技术大学、安徽省数字安全重点实验室、HiDream.ai | arXiv:2609.03629 关键词:概念删除,视频扩散,稀疏自编码器,单义特征,时空掩码,生成安全,EraseSAE ⚠️ 前序问题:视频扩散模型从松散数据学习到版权角色、不安全内容等概念。现有删除方法直接改权重或用粗粒度方向抑制,但概念在 DiT 激活中分散且与背景、动作和风格纠缠,容易出现删不干净或把无关内容一起毁掉的问题。视频还多一层时间一致性要求,逐帧独立干预会产生闪烁。 本文贡献:EraseSAE 采用“分解—归因—删除”流程。Partitioned Convolutional Sparse Autoencoder 以分区双分支卷积把稠密时空激活拆成更可解释的稀疏单义特征;对目标提示和硬负提示做对比对数比归因,离线锁定概念核;推理时再按时间步生成时空掩码,只在概念真正激活的区域调制 classifier-free guidance,尽量保留其他对象和背景。 实验效果:在 CogVideoX 的三档裸体概念测试中,EraseSAE 的生成率为 2.62%、7.13% 和 77.80%,对比 T2VUnlearning 为 2.88%、10.89% 和 51.98%;其主体一致性为 94.30%,推理约 3.66 秒/帧。在 HunyuanVideo 上 Ring-A-Bell 裸体率为 5.13%,低于 T2VUnlearning 的 9.95%,主体一致性为 96.04%。Flux.1 的 I2P 显式内容总量也从原始 605 降到 160。 批判点评:以单义稀疏特征定位概念,比全局权重擦除更容易解释和审计,时空掩码也适合视频。不过“单义”来自稀疏自编码器的近似分解,不保证一个核只表达一个人类概念;对隐喻、组合提示或跨文化表达,硬负提示可能覆盖不足。部署时应同时报告删除率、误删率、绕过攻击和不同语言提示,不能只看平均主体一致性。 10. SVDtrunc:FLUX保留68%参数近乎无损 Importance-Aware Low-Rank Distillation of Diffusion Transformers | 海德堡大学、Zuse School ELIZA、达姆施塔特工业大学、hessian.AI | arXiv:2609.04646 关键词:Diffusion Transformer,模型压缩,低秩分解,知识蒸馏,FLUX,参数效率,SVDtrunc ⚠️ 前序问题:DiT 已成为高质量文生图骨干,但参数规模让显存、加载和部署成本居高不下。直接对所有投影矩阵用相同比例截断 SVD,忽略了不同块的重要性;大语言模型上的经验还让工程师担心低秩压缩会突然崩溃。需要先判断 DiT 的冗余分布,再在全局参数预算下决定哪些块可以多压。 本文贡献:作者发现 FLUX.dev 的 SVD 截断退化较平滑,冗余分散在全网络投影矩阵,而不是集中在少数 Transformer 块。SVDtrunc 先分别压缩每个块并生成探测图像,以相对原模型的质量变化给块排序;随后在全局预算下给不重要块分配更低秩,最后对全部块做模块化知识蒸馏与 rectified-flow 微调。该方法还能与减少采样步数的蒸馏叠加。 实验效果:SVDtrunc 在 GenEval、HPSv2 和 DPG 三个基准的综合比较中,在各压缩档位都优于论文纳入的竞争方法。FLUX.dev 保留 68% 原参数时接近完整模型性能,保留 57% 时仍有竞争力;实验覆盖保留 40% 至 90% 参数的区间,且无需微调的版本也保持较强结果。 批判点评:先用生成质量探测块重要性,比按权重范数或统一秩分配更贴近最终目标;发现 DiT 对低秩截断呈平滑退化也为工程压缩提供了有用经验。代价是每个块都要构造探测模型并生成一批图,前期搜索成本高,而且重要性依赖提示分布。若部署域与探测集差异大,原先被判定不重要的块可能正负责罕见概念。 趋势观察 代理式生成开始补上“证据进入像素”的最后一公里 WeAgent-MMGenEdit 不满足于给图像模型接一个搜索框,而是把外部证据拆成检索、逐图核验、结构化整合和最终交付四步,并让策略端与图像端分别做 SFT 和强化学习。PriorEdit3D 与 ReaDiT 也在降低监督门槛:前者从图像编辑器、视觉语言模型和图生 3D 教师蒸馏三类先验,后者只读一个 DiT 中间块,就用 53M 参数支持图像与视频的多类空间控制。 视频生成的竞争焦点转向控制稳定性与可核算效率 EditVid 用稀疏因果记忆、跨帧对应注入和软 latent 混合,把免训练视频编辑的 FiVE-Acc 从 58.95 提到 78.16。FlashRender 先修复不同采样步之间的相机控制不一致,再用 MeanFlow 和在策略蒸馏压到 4 次模型评估,采样成本降低 25 倍。SVDtrunc 则按块重要性给 FLUX 分配低秩预算,保留 68% 参数时仍接近完整模型性能。 评测与安全正在从单一总分转向可诊断的局部证据 WorldReward 按动作切分长视频并分别判断动作一致性与画质,避免局部指令证据被长上下文稀释。PRISM-Bench 把音频类型与声源是否可见交叉拆分,用 35 项细则暴露音乐和屏内同步声源的薄弱点。EraseSAE 也把概念删除落到稀疏单义特征和时空掩码上,不过最难的一档概念仍有 77.80% 生成率,说明精细归因并不等于问题已经解决。 人工智能炼丹君 整理 | 2026-09-07 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月07日
5 阅读
0 评论
0 点赞
2026-09-06
AIGC 周末专题|2026-09-06|长视频世界模型的记忆与状态概览
AIGC 周末专题深度解读:长视频世界模型的记忆:存得下、找得回、更新得对 人工智能炼丹君 整理 | 2026年9月6日(周日) 覆盖时间:双周覆盖 2026-08-24—2026-09-06(含首尾,共 14 天);原论文首发 2026-08-26—2026-09-02,PAWBench 采用 2026-09-03 v3 本期概述 本期 AIGC 周末专题聚焦长视频世界模型的记忆:存得下、找得回、更新得对方向,精选 7 篇代表性论文进行深度解读。 给一个模型一张街景图,再让你用方向键走开、转弯、返回原地。理想输出不仅是连续的视频,还应当保住原来的门窗与路口。如果你在离开前把一件物品放进抽屉,返回时抽屉里的内容也应正确。这正是本期要拆开的两种记忆:见过什么,以及后来发生了什么。 过去的滑动窗口(只让当前块看到最近一段历史)解决了生成开销随视频增长的问题,却容易忘掉远处内容;全历史缓存扩大了记忆,又带来存储成本。于是本期两周窗口内的研究沿三个方向展开:让有限历史更有用、让历史按几何或任务结构组织、让评测能识别“画面合理但状态错误”。 本期为双周专题,检索与综合窗口为 2026 年 8 月 24 日至 9 月 6 日,含首尾共 14 天。复核这两周的候选与论文索引后,保留七篇与历史记忆、状态更新及其评测直接相关的工作;它们的首发日期为 8 月 26 日至 9 月 2 日,另纳入 PAWBench 在 9 月 3 日更新的 v3。部分论文曾在工作日速读中出现,本期重新研读并作主题综合。下文的数值均为论文报告,未独立复现实验;跨论文联系与研究建议为本文分析。 两周进展怎样衔接:第一周(8 月 24—30 日)的 WALL-SS、DensityKV、LayerRecall 与 Matrix-Game 3.5,分别从视觉—动作配对、容量控制、按层读取和几何重访组织历史;同周首发的 PAWBench 则把概率分布纳入评测。第二周(8 月 31 日—9 月 6 日),Shell Game 将问题收紧到遮挡期间的隐藏状态更新,SolarWM 提供长时生成的数据与训练配方,PAWBench v3 进一步明确条件分数与场景通过率。时间上的接续不意味着这些同期工作相互继承。 双周观察:第一周较集中地回答“历史如何保存和读取”,第二周的入选工作补上“长时训练如何组织、保存的历史是否足以支持状态推理”。因此本期的横向比较同时区分存储预算、外观恢复、动作后果和不确定性,不能仅按生成时长判断能力。 先看四个趋势: 从保存容量转向读取效率。 DensityKV 决定哪些历史留下,LayerRecall 决定当前问题读取什么、送到哪层。 从时间距离转向结构关系。 Matrix-Game 3.5 用三维位置找回图块,WALL-SS 把视觉和动作按尺度共同保存。 从长视频样例转向可复现配方。 SolarWM 把数据与训练接口开放,便于将能力差异与工程配置差异分开。 从外观连续转向状态与分布。 Shell Game 检查遮挡期间的状态更新,PAWBench 检查固定条件下可能未来的概率。 方向分布: 历史压缩与读取 2 篇 (DensityKV, LayerRecall) 几何与动作记忆 2 篇 (Matrix-Game 3.5, WALL-SS) 开放训练配方 1 篇 (SolarWM) 状态与概率评测 2 篇 (Shell Game, PAWBench) 本期按机制比较,未将预印本排版模板或拟投会议视为已录用信息。 技术路线与时间线 把历史变成可管理的资源(2026-08-26—08-28) 描述:WALL-SS、DensityKV 与 LayerRecall 分别从尺度、容量、读取策略组织历史;这是同期不同路线,时间先后不表示相互继承。 关键节点: 08-26:WALL-SS:视觉—动作配对与时间—尺度记忆。 08-28:DensityKV 与 LayerRecall:在线去冗余与按层检索。 把记忆放入可交互生成流程(2026-08-30—09-02) 描述:Matrix-Game 3.5 细化几何场景召回,SolarWM 统一多源数据和因果训练配方。 关键节点: 08-30:Matrix-Game 3.5:patch 云、位姿编码与动静分离。 09-02:SolarWM:开放数据接口与长时推演。 检验记忆究竟保证了什么(2026-08-27—09-03) 描述:PAWBench 与 Shell Game 从概率与隐藏状态提出互补评测问题,并非上述方法已经全部接受过这些测试。 关键节点: 08-27 / 09-03:PAWBench 首发 / v3 更新:同时报告条件分数与场景通过率。 08-31:Shell Game:分开检查画质和交换链状态准确率。 1. DensityKV:给历史库去重,先守住显存预算 论文: DensityKV: Density-Guided KV Cache Compression for Long Video Generation arXiv: 2608.27922 机构: Manifold AI + 清华大学 关键词: 长视频生成, KV缓存, 免训练压缩 1.1 研究动机 核心问题: 在固定容量下,如何减少重复历史而保留有用状态? 自回归视频生成会把已经生成的内容继续当条件。只留最近几帧容易忘掉旧角色;把所有历史键值缓存(KV,即注意力读取的索引与内容)留下,又会让显存随时长增长。真正需要保存的,是历史里不容易被其他状态替代的信息。 前序工作及局限: 滑动窗口:上下文开销有界,但远处历史被直接逐出。 LongLive-RAG:按需读取历史,存档本身仍会增长。 与前序工作的本质区别: 将历史压缩建模为 post-RoPE key 空间的在线密度控制。 1.2 方法原理 Overview of historical-memory construction and use. Left: sliding-window generation discards states outside the active context; LongLive-RAG stores discarded history and retrieves selected blocks; DensityKV instead maintains a bounded token-level history that is attended together with the local window. Right: at every Transformer layer, clean historical K/V states update independent per-head banks. Admission and rejection are determined by Soft-Riesz density over post-RoPE keys, while each value remains exactly paired with its original key. Current queries access the retained history through the backbone's native attention. 图源:论文原图。图注译文:历史记忆的构建与使用概览。左:滑窗生成丢弃活动上下文以外的状态;LongLive-RAG 保存被逐出的历史并检索选定块;DensityKV 维护有界的 token 级历史,与局部窗口一起被读取。右:每层中,干净历史 K/V 更新各注意力头独立的库;根据 post-RoPE key 的 Soft-Riesz 密度决定接纳或拒绝,value 与原 key 严格配对,当前查询通过原生注意力访问保留历史。 DensityKV 在每层的每个注意力头分别维护历史库,在施加旋转位置编码(RoPE)后的 key 空间计算 Soft-Riesz 密度:附近已有很多相似 key,意味着这片邻域重复得较多。每条新入库状态都保存当时的密度基线,后续更新限制相对入库时的密度增长,而不是拿一个绝对密度阈值把所有密集区域一刀切掉。这样能区分“这一块本来就由一组完整视觉状态构成”与“后来反复加入几乎一样的历史”。原始 key 和 value 始终成对保存,当前块仍通过骨干原有注意力读取它们。 这套机制把压缩决策放在存储侧,既不新增训练任务,也不要求模型先说清自己将来要问什么。但它仍然是有限容量的历史覆盖方案:罕见细节是否被保留下来,依赖 key 空间中的邻域关系,不能由“密度低”直接推导出“任务上重要”。 1.3 核心创新 按注意力头独立管理历史,适配不同头的投影空间。 保留入库密度基线,限制后续冗余增长,同时维持原始 K/V 配对。 1.4 实验结果 Persistent temporal-state storage versus generation length. LongLive-RAG grows linearly, whereas Deep Forcing and DensityKV remain bounded. 图源:论文原图。图注译文:持久时序状态存储随生成长度的变化:LongLive-RAG 线性增长,Deep Forcing 与 DensityKV 保持有界。图中 120 秒时三者分别为 128.5、3.76、3.28 GiB;横轴为生成视频时长,纵轴采用对数刻度。 在论文的 M=9,360 配置下,历史库及元数据为 1.67 GiB;加上首帧锚点和五帧局部窗口,总持久时序状态为 3.28 GiB。这不是模型运行时的整机峰值显存。 同一存储统计中,LongLive-RAG 在 30/60/120 秒为 32.1/64.3/128.5 GiB;Deep Forcing 为 3.76 GiB。DensityKV 相对后者的存储优势远小于相对全历史存档的优势。 论文使用 128 个 MovieGenBench 提示词,分别测试三种骨干和 30/60/120 秒。表中部分基线分数引用 LongLive-RAG 原报告;不能把这组数字与另一篇自建提示集直接拼榜。 1.5 关键洞察 我的判断:有现成自回归模型、首先卡在历史库增长时,值得优先评估。重点监控压缩后的物体重现与运动幅度,避免高一致性只是画面变得更静。它解决“存什么”,尚未解决“哪一层应该读取这些信息”,与下一篇在职责上互补;两者组合是否有效仍需实验。 技术演进定位: 面向部署预算的历史库管理。 可能的后续方向: 固定峰值显存后比较重现准确率与运动质量。 检查稀有物体细节在长时淘汰中的保留情况。 2. LayerRecall:记忆不仅要选对,还要送对层 论文: LayerRecall: A State-Conditioned Memory Router for Long-Horizon Consistency in Video Generation arXiv: 2608.28460 机构: 浙江大学 + 香港大学 关键词: 视频DiT, 长时记忆, 跨镜头一致性 2.1 研究动机 核心问题: 有历史可访问,为什么仍不能稳定恢复旧属性? 人物离场后再次出现,模型可能仍记得“有一个人”,却把衣服换了。给所有层都塞入远处历史也未必有效:不同层对当前、近处、远处信息的偏好不同,错误注入可能扰乱正在进行的动作。 前序工作及局限: LongLive-2.0:保留局部连续性,远距离重现仍可能漂移。 全层记忆注入:扩大历史访问会干扰部分层的局部功能。 与前序工作的本质区别: 当前块的隐藏特征负责生成查询,块摘要只用于打分,检索载荷仍是完整 K/V;层集合则依据目标骨干的时间偏好预先确定,两种选择具有不同的动态性。 2.2 方法原理 Overview of LayerRecall. Given the current chunk, the router retrieves finite historical K/V candidates from layer-indexed memory banks and scores which memories are relevant to the next generation step. Retrieved states are injected only into profiled memory-sensitive layers, while the remaining layers keep the original sink, sliding-window, and current-chunk attention context. K/V denotes key-value states. 图源:论文原图。图注译文:LayerRecall 概览:给定当前块,路由器从按层索引的记忆库中检索有限历史 K/V 候选,并评价哪些记忆与下一步生成相关。检索状态只注入经分析选出的记忆敏感层;其余层保留原有 sink、滑动窗口与当前块注意力上下文。K/V 指 key-value 状态。 LayerRecall 把记忆使用拆成两个决策。首先,由当前块的隐藏状态生成查询,用它与每层历史块摘要计算相似度,选出有限数量的完整 K/V 块;摘要来自位置编码前的 key,而真正送入注意力的是已编码的 K/V。其次,只让预先分析得到的记忆敏感层接收检索结果,其余层保留原来的局部注意力。这里“检索内容”随当前状态改变,“注入层集合”则是对每种骨干固定的策略,不能理解为每次推理都自由选择全部层。 路由器通过跨跨度预测匹配(CHPM)训练。教师与学生共享同一个冻结骨干,教师拥有更长上下文,学生在有限记忆下对齐教师的去噪预测;训练只更新路由器。学生用自己生成的历史继续推进,梯度在块间截断,既暴露真实推理中的误差,又避免整段长视频反向传播。 2.3 核心创新 把“找哪段历史”与“在哪层用”同时纳入设计。 长上下文教师提供预测监督,无需人工标注每一块应读取哪段历史。 2.4 实验结果 Memory-guided self-correction in a three shot sequence. The subject wears a solid blue inner garment in Shot 1, leaves the scene in Shot 2, and initially reappears with a mismatched pattern in Shot 3. LayerRecall later recalls the earlier blue garment while preserving the subject's identity, gray cardigan, ongoing action, and scene structure, illustrating localized attribute recovery without a global visual reset. 图源:论文原图。图注译文:三镜头序列中的记忆引导自我纠正。主体在第一镜头穿纯蓝色内搭,在第二镜头离场,在第三镜头最初以错误花纹重新出现。随后 LayerRecall 恢复先前的蓝色衣服,同时保持人物身份、灰色开衫、正在进行的动作和场景结构,展示无需全局重置画面的局部属性恢复。 100 个评测提示词上,MemoBench 总分由 LongLive-2.0 的 0.513 提升至 0.548,MovieBench 从 0.546 到 0.578;三项 VBench-Long 指标均值均为 0.978。 主配置 30 层中有 10 层使用记忆;注意力可见预算为 32 个潜在帧,物理 K/V 库为 80 个潜在帧。可见预算不能当成全部存储占用。 匹配 H100 设置下,端到端时间从 305.9 秒/视频变为 309.4 秒/视频,对应 5.22 与 5.16 FPS。 2.5 关键洞察 我的判断:最有价值的是“层的职责”这一设计依据。原图中的衣服会先出现错误花纹,随后恢复纯蓝色,说明自我纠正并不等于从不出错。做长镜头或广告身份一致性时,应同时测错误出现次数、恢复延迟和恢复是否打断动作。记忆敏感层需要针对骨干分析,迁移成本不能只看训练参数量。 技术演进定位: 由历史存储走向选择性记忆使用。 可能的后续方向: 报告重现失败后的恢复时间。 与固定容量压缩库组合时重新分析层策略。 3. Matrix-Game 3.5:把旧场景按三维位置拼回当前视角 论文: Matrix-Game 3.5: Enhancing Real-Time Streaming Interactive World Models with Patch Memory arXiv: 2608.29910 机构: 昆仑万维 Skywork 关键词: 交互世界模型, 几何记忆, 相机控制 3.1 研究动机 核心问题: 如何在相机重访时找到位置正确的历史证据? 相机离开街角再回来,画面应该还是同一栋楼。整帧检索很难表达“这张旧图只有右上角对当前视角有用”,纯语义相似性也不能保证窗户落在正确的位置。 前序工作及局限: 整帧历史记忆:有用与无用区域绑定在同一读取单位。 MosaicMem:提供局部图块的几何记忆思路。 与前序工作的本质区别: 组合几何 patch 检索、位姿编码、动静分离与实时蒸馏。 3.2 方法原理 The patch-memory mechanism. (a) Lift to 3D: historical latent patches are back-projected into a common 3D space using metric depth together with camera intrinsics and poses. (b) Frustum query: the target camera frustum queries this patch cloud, and a z-buffer under the target view keeps, for every target latent location, only the surface closest to the camera while discarding occluded candidates. (c) Patch memory frame: the selected patches are scattered into an aligned memory canvas under the target viewpoint; regions that are occluded or have never been observed are left empty (black) and dropped from the memory token sequence; the diffusion model synthesizes them from the current latent, text prompt, and surrounding context. 图源:论文原图。图注译文:Patch 记忆机制。(a) 升维到三维:历史潜在图块借助度量深度及相机内外参反投影至共同三维空间。(b) 视锥查询:目标相机查询 patch 云,目标视角的 z-buffer 在每个潜在位置只保留离相机最近的表面,剔除被遮挡候选。(c) 记忆画布:选中 patch 散射成对齐目标视角的记忆;被遮挡或从未观察的区域留黑,并从记忆 token 序列中移除,由扩散模型结合当前潜在表示、文本和周围上下文生成。 Matrix-Game 3.5 采用 patch 记忆:把历史潜在图块结合度量深度、相机内外参反投影到三维空间,再由目标相机的视锥查询。投影到同一目标位置的候选由 z-buffer 选最近可见表面,遮挡、不可靠投影和未见区域被剔除;留下的 patch 按当前视角散射成一张有空洞的记忆画布。空洞交给生成器补全,既保留证据,也显式暴露“这里没有看过”。 相机几何通过 tiled PRoPE 叠加在原时空 RoPE 上,避免切掉视频骨干用于时间建模的通道。静态场景依赖几何 patch,动态主体则有参考 token 维持身份,另有上下文记忆提供未扭曲的历史观测。最后用感知流匹配完成因果适配,再对自生成轨迹做分布匹配蒸馏(DMD),逐步纳入引导、相机控制与记忆条件。 3.3 核心创新 将场景召回粒度细化到图块,并按目标视角对齐。 静态几何与动态主体分开处理,减少把移动物体错误固定到旧位置的风险。 3.4 实验结果 Tiled PRoPE and the native RoPE act together in one attention kernel: temporal structure is preserved, and pose similarity is rewarded. We use two synthetic trajectories here to illustrate the preservation (bottom row), and calculate frame-by-frame attention logits for heatmap visualization (top row). (a) RoPE only (camera term off): the purely temporal kernel, banded in frame offset. (b) Straight walk with tiled PRoPE: the map is nearly indistinguishable from (a) --- the maximum change is empirically 1.3% of (a)'s dynamic range --- adding the camera does not disrupt the frame-to-frame attention structure. (c) S-curve with tiled PRoPE: frames with similar heading light up in blocks far from the diagonal, and opposite-heading frames darken. The camera raises attention exactly where views are geometrically close, while the temporal ordering of (a) survives untouched. This analysis was performed on the model fine-tuned from Wan2.2-TI2V-5B. 图源:论文原图。图注译文:Tiled PRoPE 与原生 RoPE 在同一注意力核中共同作用,保留时间结构并提高位姿相近帧的注意力。下排为两条合成轨迹,上排为逐帧 attention logits 热力图。(a) 关闭相机项时,RoPE 形成沿帧偏移的带状结构。(b) 直线行走时加入 tiled PRoPE,最大变化约为原图动态范围的 1.3%。(c) S 形轨迹中,相近朝向在远离对角线处变亮,相反朝向变暗,同时原时序顺序保留。分析使用从 Wan2.2-TI2V-5B 微调的模型。 论文的 SANA-WM 一分钟简单轨迹测试中,蒸馏前 Matrix-Game 3.5 的旋转误差为 1.63°、重访 SSIM 为 0.439;Matrix-Game 3.0 对应 12.96°、0.326。两者均为 720p,但推理 GPU 数不同,分别为 1 和 8。 困难轨迹上旋转误差为 2.70°,重访 SSIM 为 0.414。这些指标分别描述相机跟随与相同位姿下的外观恢复。 主对比表明确使用蒸馏前模型,不能把表中质量与蒸馏后实时模型的速度拼成同一工作点。 3.5 关键洞察 我的判断:场景漫游比纯文本长视频更适合显式几何检索。代价是深度、相机与动态分割错误会进入记忆链路。长期产品需要考虑错误 patch 的失效与纠正,否则每次“回忆”都可能强化最初的几何误差。论文中的几何组件不新增可学习参数,不代表整套系统免训练或没有计算成本。 技术演进定位: 由时间索引扩展为三维空间索引。 可能的后续方向: 评测深度错误对长期记忆污染的影响。 给历史 patch 增加可信度与失效条件。 4. WALL-SS:历史变粗时,动作也要一同保留 论文: WALL-SS: Scaling Long-horizon World Models via Next-Scale Autoregression arXiv: 2608.26239 机构: 自变量机器人 (X Square Robot) 关键词: 机器人世界模型, 下一尺度自回归, 动作条件 4.1 研究动机 核心问题: 有限历史里怎样同时保住外观与交互后果? 机器人看见的是画面,执行的是动作。如果把历史只压成外观,模型可能记得杯子长什么样,却忘记它刚被放进了哪个篮子。这里需要保留动作及其后果的对应关系。 前序工作及局限: 下一尺度视觉生成:提供由粗到细的表示,但不自动保证动作因果关系。 只保留最近片段:容易丢失更早交互造成的持久状态。 与前序工作的本质区别: 视觉与动作按时间和尺度对齐,并联合参与历史状态管理。 4.2 方法原理 Overall framework of WALL-SS. WALL-SS unifies action-conditioned next-scale visual prediction, streaming long-horizon state propagation, and on-policy alignment of autoregressive visual dynamics. 图源:论文原图。图注译文:WALL-SS 总体框架:统一动作条件的下一尺度视觉预测、流式长时状态传播,以及自回归视觉动力学的 on-policy 对齐。图中时间—尺度 KV 记忆把最近精细状态、较远粗状态和初始锚点共同提供给因果 Transformer,动作记录与视觉历史配对。 WALL-SS 采用下一尺度自回归:先生成粗尺度视觉状态,再逐步细化,每个尺度都读取同一时间区间、同一视角且尺度对齐的动作条件。长时记忆反过来利用这套层次:最近交互保存精细状态,较远的历史只留较粗状态,并让视觉记录始终与对应动作条目成对存在。固定的历史年龄—尺度调度决定何时读取和淘汰,因而存储能够保持有界。首帧身份锚点只提供外观与全局布局参照,不能代替滚动的动态状态。 训练通过随历史年龄变化的扰动和模型自己生成的上下文减少误差累积。后训练把视觉生成器视为可优化策略:动作保持为输入条件,奖励调整给定动作下视觉未来的概率。这个区别很关键——该阶段优化的是世界预测,而不是顺便学一个更会做任务的机器人控制器。 4.3 核心创新 复用多尺度生成状态管理长历史,无需另外重建一套 RGB 压缩器。 保存动作—视觉因果配对,在自己的 rollout 上对齐动作跟随与长期一致性。 4.4 实验结果 Qualitative comparison of long-horizon video rollouts. Rows correspond to Wan2.1-1.3B, Wan2.2-14B, Infinity-8B, and our model, while columns show snapshots at 5, 30, and 60 seconds. The left task requires sorting tabletop objects into the corresponding baskets, and the right task requires pouring water into a cup. The comparison highlights each model’s ability to preserve scene geometry, object identity, and coherent task progression over extended horizons. 图源:论文原图。图注译文:长时视频 rollout 定性比较。各行依次为 Wan2.1-1.3B、Wan2.2-14B、Infinity-8B 和本文模型;各列为 5、30、60 秒快照。左侧任务按形状把桌面物体放入对应区域,右侧任务向杯中倒水并放下水壶。对比展示长时几何、物体身份与任务进程的保持情况。 受控后训练消融中,动作跟随从 0.264 到 0.290,轨迹准确率从 0.512 到 0.539,跨片段边界误差从 0.118 降至 0.104。均为该论文内部协议。 论文展示了 5、30、60 秒的物体分类与倒水任务;图像证据用于观察物体身份、几何与任务进展,不能替代真实机器人成功率。 其闭环比较设计包含 6 个留出任务、5 个策略检查点、20 个匹配初态,共 600 对生成—真实 rollout,评测对象已经超出单帧画质。 4.5 关键洞察 我的判断:值得关注动作与视觉一起压缩的设计。它仍有任务相关的取舍:很小的按钮状态可能对成功至关重要,却在粗尺度历史里不显眼。若把它用于策略筛选,需要观察是否保持各策略的成功率排序;看起来更流畅的模拟器,未必更准确地评价了控制策略。 技术演进定位: 从视频连续性推进到具身交互的可用性。 可能的后续方向: 测试细小但决定任务成败的状态能否跨尺度保留。 增加长任务下模拟器与真实策略排名的一致性检验。 5. SolarWM:短序列训练撑起长推演,证据要分层看 论文: SolarWM: Open Data and Scalable Training for Long-Horizon Video World Models arXiv: 2609.02886 机构: 香港中文大学(深圳)、SLAI、新加坡国立大学、香港中文大学、香港科技大学、香港科技大学(广州)、NVIDIA、UCLA、微软亚洲研究院 关键词: 长时世界模型, 开放数据, 分布匹配蒸馏 5.1 研究动机 核心问题: 怎样减少数据与骨干耦合,并稳定训练可扩展的因果世界模型? 换一个视频骨干,经常连数据时间轴、相机单位、潜在帧率和训练目标都要重做。SolarWM 关注这个系统问题:把数据准备、相机控制与因果训练整理成可复用的统一接口。 前序工作及局限: 直接混合多源数据:时间、几何、质量标准不一致,监督信号容易相互冲突。 只用教师强制训练:推理时自身历史带来的误差未被充分覆盖。 与前序工作的本质区别: 把数据、相机接口与三阶段因果训练整理为统一而保留骨干差异的框架。 5.2 方法原理 Overview of the SolarWM-5B training pipeline and hour-scale inference results 图源:论文原图。图注译文:SolarWM-5B 训练流程及小时级推演概览。图上方为双向训练、使用教师强制和 AnyFlow 的自回归训练、使用 DMD 的四步蒸馏;三阶段均使用五秒序列。下方展示教室与街区场景的长时交互画面。 SolarWM 将 10 个数据集中的 143 万个规范片段整理为逐帧对齐的视觉、度量相机、文本、质量信息和来源记录;源数据处理与训练混合比例分开,使数据选择可追溯。统一接口并不强行抹平骨干差异:Wan、LTX 与 H3 的潜在表示、首帧条件和目标函数被分别保留,相机条件通过适配器接入原有注意力。 三阶段训练先做双向相机条件适配,再用教师强制的 AnyFlow 损失直接得到少步因果初始化,最后用 DMD 在学生自生成的上下文上训练,缓解训练看到真值、推理只能看到自身预测的分布差异。论文的长推演始终固定场景提示词,外部变化来自给定相机轨迹。理解这个控制条件,才能判断“小时级”结果究竟验证了什么。 5.3 核心创新 统一可追溯数据约定,同时保留骨干原生表示与训练目标。 把少步因果初始化并入第二阶段,再用自生成轨迹做分布匹配。 5.4 实验结果 Hour-scale world rollout generated by the SolarWM-wan2.2-5B-fast causal student. Sparse frames are sampled throughout a single uninterrupted autoregressive session initialized with a real first frame from the held-out validation pool, spanning the initial observation to the 60-minute endpoint. The scene prompt remains fixed and the model follows a predetermined camera trajectory. 图源:论文原图。图注译文:SolarWM-wan2.2-5B-fast 因果学生的小时级世界推演。从留出验证集的一帧真实初始观测开始,在一次不中断的自回归会话中稀疏采样,覆盖初始时刻至 60 分钟端点。场景提示词保持固定,模型遵循预先给定的相机轨迹。 模型家族覆盖 5B—33B 四条路线;各路线保留组件不同,LTX 路线移除了音频相关模块,不能据此声称四个版本都输出音视频。 因果实验使用 4 个采样步,视频时间轴为 16 FPS。这里的 16 FPS 是输出帧率,不能直接当成端到端生成吞吐。 wan2.2-5B-fast 的图示从 5 秒训练窗口扩展到不中断的 60 分钟推演;论文长时结果主要是定性样例,尚不能据此认定任意一小时前的状态都能正确恢复。 5.5 关键洞察 我的判断:它的价值是把实验基础设施和配方公开,方便在相近数据条件下比较不同模型。对小时级样例,接下来最需要补的是统一的重访轨迹、任务状态探针和随时间变化的失败率。持续产出合理的新画面,与反复回到同一世界仍保持同一事实,是两种不同的验收要求。 技术演进定位: 长时世界模型的复现实验底座。 可能的后续方向: 在相同数据与硬件预算下做骨干对比。 增加小时级定量重访与状态正确性指标。 6. Shell Game:杯子画得再真,也可能不知道球在哪 论文: Can Video World Models Track Unobserved World States? arXiv: 2608.30692 机构: 首尔国立大学 + Roblox 关键词: 隐藏状态, 视频世界模型评测, 测试时训练 6.1 研究动机 核心问题: 能回忆旧画面,是否就能更新从未直接显露的状态? 五个相同杯子盖住一个球,再按动作序列交换位置。输入是初始画面和每次交换动作,输出是最后揭杯的视频;正确结果必须让球出现在真正的那个杯子下。中间看不见球,任务刻意把渲染能力与隐藏状态追踪分开。 前序工作及局限: 画质与身份一致性评测:无法判断遮挡物体经过动作后位于何处。 追加式KV历史:保留证据,但状态组合仍需每次重新推导。 与前序工作的本质区别: 实验在球不可见时保持画面简洁,并固定动作交换与生成块的对应关系;观察最终揭杯位置,就能单独量化架构是否正确组合了整条动作链。 6.2 方法原理 The visual shell game construction. An episode first reveals the ball and lowers the cups, then applies a sequence of swaps while the ball remains hidden, and finally reveals its position. 图源:论文原图。图注译文:视觉 Shell Game 的构造:先揭示小球并放下杯子,再在小球不可见的情况下执行一串杯子交换,最后揭示小球位置。图中每次交换对应一个生成块;球在整个交换阶段始终不可见。 Shell Game 用约 200M 参数、相近规模的模型比较时间混合机制,视觉骨干和压缩表示尽量一致。训练只包含 5 次交换,测试把链条延长到 30 次。像素损失在遮挡阶段不会告诉模型球在哪里,因而它必须在架构内部携带并更新状态;追加历史的 KV 缓存让模型重新从历史推导答案,却不等同于一份会原地更新的状态表。 两个有效方向分别是允许状态转移具有负特征值的线性注意力,以及更新非线性快速权重的测试时训练(TTT)。前者可表达交换所需的反射操作,后者能随着新动作修改读取自身状态的特征映射。单纯增加可读写 scratchpad token 并没有在长链上同样成功,因此“有一个记忆模块”这个标签本身没有解释力,要看它究竟能执行何种状态变换。 6.3 核心创新 用隐藏小球的动作条件视频控制渲染难度,直接测试状态组合。 同时比较长度外推与去噪步数,区分画质改善和状态计算能力。 6.4 实验结果 Length extrapolation of mechanisms that enable state tracking. All variants share the same SWA1 backbone, with the temporal mechanism added on top. The bare backbone alone (SWA1, $M{=}0$ in (C)) never rises above chance, failing even at the in-distribution length $N{=}5$, so it serves as the natural chance-level control. (A) Extending the transition eigenvalue range from $[0,1]$ to $[-1,1]$ improves state accuracy across linear-attention variants. (B) LaCT extrapolation improves with the number of fast-weight heads $H$. (C) Adding explicit per-layer read/writable scratchpad tokens improves extrapolation through $N{=}10$ but fails by $N{=}20$. 图源:论文原图。图注译文:可支持状态追踪的机制之长度外推。各变体以同一 SWA1 骨干为基础,添加不同时间机制。裸骨干,即 (C) 中 M=0 的 SWA1,连训练内 N=5 都未超过随机水平,因此作为自然对照。(A) 将转移特征值从 [0,1] 扩大至 [-1,1] 改善线性注意力状态准确率。(B) 增加快速权重头数 H 改善 LaCT 外推。(C) 每层加入可读写 scratchpad token 能改善至 N=10,但到 N=20 仍失败。 训练集为 30,000 段五杯、五次交换序列;随机猜球位置的准确率为 20%,测试最长 30 次交换。 在 10 次交换时,把采样步数从 4 增加到 50 并未改善状态准确率;高 PSNR 可以与接近随机的状态判断共存。 扩展线性状态转移特征值范围、增加 LaCT 快速权重头数能明显改善外推;显式 scratchpad 在 20 次交换附近仍出现失效。 6.5 关键洞察 我的判断:这篇给前面几种记忆方法提出了很好的压力测试,但没有逐一测试本期所有新模型,所以不能宣称 LayerRecall、Matrix-Game 或 SolarWM 已在该任务失败。人工构造的交换任务也不能直接代表全部真实世界能力;它的强项是让某一种能力缺口变得可定位、可复现。 技术演进定位: 为长时生成建立可证伪的状态诊断。 可能的后续方向: 在大规模预训练模型上检验同类受控任务。 同时报告状态正确率、渲染质量和外推长度。 7. PAWBench:同一起点多推演几次,概率也要对 论文: PAWBench: How Far Are We from Probabilistically Aligned World Modeling? arXiv: 2608.27345 机构: 上海交通大学、上海 AI Lab、Krea AI、Hugging Face、上海创智学院、通义实验室、香港大学 关键词: 概率对齐, 世界模型评测, 分布校准 7.1 研究动机 核心问题: 多次生成是否恢复正确的可能结果及其概率? 一个模型能画出硬币正面和反面,还不够。如果对称条件下大多数时候都落在同一面,它虽然有多样性,却没有学对结果分布。用于规划的世界模型需要知道哪些未来可能发生,以及它们各有多大可能。 前序工作及局限: 单条视频合理性:一条合理轨迹无法说明整体概率分布。 仅看多样性:覆盖多种结果,不代表频率与物理过程相符。 与前序工作的本质区别: 作者把终局分类、无效结果筛选与分布统计明确拆开,对可校准概率和只能枚举结果的场景分别评分,避免把所有多样性混为一种能力。 7.2 方法原理 PAWEval turns repeated rollouts into a distributional test. In this PAW-Calibration example, a rubric-based judge maps each readable, in-schema coin-toss rollout to Head or Tail. Aggregating these labels yields the empirical outcome distribution, which is compared with the reference probabilities rather than matching generated videos frame by frame. 图源:论文原图。图注译文:PAWEval 将重复 rollout 转为分布检验。这个 PAW-Calibration 例子中,按评分规则工作的裁判把每条可读且符合结果定义的抛硬币视频归为正面或反面;汇总后形成经验结果分布,再与参考概率比较,而不是逐帧匹配生成视频。 PAWBench v3 将 50 个场景分为两轨。25 个校准场景有解析或对称性导出的参考概率;另外 25 个覆盖场景只确定有效结果集合,不强行假定每种结果等概率。对固定初始图像和动作,每个模型重复生成 50 次,PAWEval 按场景评分规则读取终局,然后比较结果分布。校准使用总变差距离(TVD,即两分布差异绝对值之和的一半),覆盖使用有效结果被观察到的比例。 无法读取或不符合结果定义的视频单独记录;某场景至少有 20 条可读、合法结果才通过门槛。论文同时报告通过场景上的条件分数,以及全部场景中通过的比例 SPR。把两个指标放在一起很必要:只在少量容易场景上得到好分数,不能当成整体可靠。相比单视频打分,它还区分了概率错配、可能结果遗漏和无法完成物理过程三类问题。 7.3 核心创新 从单次轨迹合理性推进到重复采样的结果分布。 校准和覆盖分开,并同时披露结果读取门槛与场景通过率。 7.4 实验结果 Models underreact to physically causal interventions and overreact to non-causal cues. Upper and lower bars show outcome distributions before and after intervention; panels (b) and (d) show the paired scenes. The pencil tilt is causal because it changes the physical transition, whereas the Galton-board text is non-causal because it leaves the transition unchanged. 图源:论文原图。图注译文:模型对物理因果干预反应不足,对非因果提示反应过强。上下条带为干预前后的结果分布,(b) 与 (d) 展示成对场景。铅笔倾斜会改变物理转移,因此是因果干预;高尔顿板旁的文字未改变转移,因此是非因果干预。 v3 在 11 个系统上评测;Cosmos 3 Super I2V 校准 TVD×100 为 20.5,但校准 SPR 为 80%;LTX-2.3 覆盖率为 71.7%,对应覆盖 SPR 为 72%。 相同参考为 50/50 时,模型产生 70/30 分布的 TVD×100 等于 20,而不是 40。 主实验 K=50;扩大采样预算可以找到更多结果,但不保证修正相对频率。作者对 888 条双方均能明确读取的视频做人类一致性检查,自动判定与明确人类标签一致 722 条,即 81.3%。 7.5 关键洞察 我的判断:v3 最值得保留的是分母意识:条件分数、场景通过率与采样预算必须一起看。自动裁判也有误差,且参考概率来自受控机制假设,不能无限外推到真实开放世界。概率对齐并非“每次都生成同一个正确答案”;确定性隐藏状态与随机未来分布应采用不同测试。 技术演进定位: 在记忆与状态之后检验世界模型的不确定性。 可能的后续方向: 固定采样预算并报告无效样本与SPR。 对关键任务做人工裁判复核与干预对照。 横向对比与技术脉络总结 七篇论文分别回答哪一个问题 论文 核心对象 关键证据 不能据此推出 DensityKV 逐头历史K/V库 固定配置3.28 GiB持久状态 整机显存仅3.28 GiB LayerRecall 历史检索与注入层 MemoBench 0.548;MovieBench 0.578 任意长历史均可恢复 Matrix-Game 3.5 静态几何与主体记忆 一分钟重访与相机误差 蒸馏前质量等于实时模型质量 WALL-SS 动作—视觉时序状态 动作跟随与边界误差消融 已掌握全部隐藏状态推理 SolarWM 数据与因果训练接口 五秒训练;小时级定性推演 一小时内所有事实始终正确 Shell Game 不可见状态的组合更新 五次训练、三十次交换外推 全部大模型和记忆方法均失败 PAWBench v3 重复推演的结果分布 双轨25+25场景;每场景50次 单个条件均分代表全面可靠 核心技术趋势 压缩和路由可以分工,但组合必须重新验证 DensityKV 压缩 post-RoPE 的逐头 K/V,LayerRecall 用块摘要挑选历史并按层注入,两者读取粒度并不相同。将它们拼接,需要先定义“一个历史块在被逐头裁剪后还是否完整”,以及教师监督看到的历史与压缩后历史是否一致。仅凭模块职责互补,不能推导出性能叠加。 记忆需要区分持久属性与会变化的状态 衣服颜色可以长时保持,物体位置与容器内容却可能随动作改变。把早期图像长期作为锚点,有时会帮助身份一致性,有时可能把世界拉回过时状态。几何记忆应知道哪些对象移动了,语义记忆也需要决定旧事实何时失效。 自生成上下文训练与可更新状态解决不同问题 LayerRecall、Matrix-Game 3.5、WALL-SS、SolarWM 都以不同方式让训练接近推理的自生成历史。这能缓解误差积累;Shell Game 则提醒我们,有些任务还受架构可表达的状态变换限制。更多 rollout 训练是否足以弥补该限制,需要受控外推实验,不能只看模型是否经过蒸馏。 长时系统应同时报告运行预算与能力失效 一次运行持续多久、能保留多久以前的外观、能组合多少次隐藏动作、能覆盖多少未来分支,分别描述不同能力。将这些指标拆开,才能分辨是容量用尽、读取失败、状态更新失效,还是概率分布偏置。 技术路线全景图 需求 → 先定义验收 外观重现 → 存储预算(DensityKV)→ 读取位置(LayerRecall) 相机重访 → 几何证据(Matrix-Game 3.5) 动作后果 → 时间—尺度配对(WALL-SS) 训练底座 → 数据与因果配方(SolarWM) 共同验收 → 隐藏状态外推(Shell Game)+结果分布(PAWBench) 仍然缺少哪些关键实验 四大核心难点 1. 旧事实如何失效 应构造“物体被移动后再回访”和“物体只是暂时离场”两组场景,检查记忆能否分别更新位置与维持身份。 2. 比较的预算如何对齐 同时报告物理缓存、注意力可见长度、模型与中间张量的峰值显存,以及包含解码和检索的端到端耗时。 3. 不同能力怎样联合验收 画质、重现、状态和分布应分列,不能用一个总分把某项严重失败平均掉。 4. 受控结论怎样扩展到真实场景 交换杯子的探针便于定位机制,真实开放世界还包含观测噪声、对象数量变化与动作歧义;需要逐级增加难度。 总结与展望 同一评测协议下,先看哪些数字可信 下面摘取 LayerRecall 论文主表中的同一组 100 个评测提示词结果。VBench-Long 此处是主体一致性、背景一致性、运动平滑度三项均值;不是所有 VBench 维度的总分。各基线的输入适配、分辨率及采样配置见原文附录,因此该表适合观察指标之间的差异,不是等算力排行榜。 方法 VBench-Long 三项均值 ↑ MemoBench 总分 ↑ MovieBench 总分 ↑ LongLive-2.0 0.978 0.513 0.546 MemFlow 0.981 0.531 0.542 SkyReels-V2 0.992 0.466 0.508 LayerRecall 0.978 0.548 0.578 来源:LayerRecall 主表与实验设置。加粗为本表四行中的最优值。SkyReels-V2 的三项平均更高,记忆专项却较低;这正说明通用视觉连续性不能代替长时记忆评测。 PAWBench 的另一组数据属于不同问题,单列如下。TVD×100 越低越好,覆盖率越高越好;两项均值只在通过读取门槛的场景上计算。每轨 25 个场景、每场景 50 次生成,SPR 是全部 25 个场景中的通过比例。 模型 校准TVD×100 ↓ 校准SPR 覆盖率 ↑ 覆盖SPR Cosmos 3 Super I2V 20.5 80% 55.2% 92% MiniMax H3 24.2 68% 48.7% 92% LTX-2.3 30.1 24% 71.7% 72% Seedance 2 30.5 100% 50.9% 84% 来源:PAWBench v3 表1。加粗仅表示本表四行中的最优值。LTX-2.3 的高覆盖均值与较低场景通过率应一起看;不同模型通过的场景集合也可能不同。它与上一张表无法直接比较。其余论文的机器人任务、相机轨迹和时长设置也不同,本期不把七篇排成统一名次。 实操与分层阅读 30 分钟理解主题:先看导语与七篇对照,再读 Shell Game 的杯子交换图。试着分别写出“外观没变”“状态正确”“概率合理”各自需要怎样的证据。 半天精读:选择与你的瓶颈匹配的一条路线。显存受限读 DensityKV;跨镜头属性恢复读 LayerRecall;相机回访读 Matrix-Game 3.5;机器人动作模拟读 WALL-SS。沿每篇 arXiv 页面访问作者官方项目入口,复现时固定论文版本和实验配置。 一周动手研究:先用 SolarWM 的数据与训练设计作为对照思路,选定一个可运行骨干;固定初图、动作、随机种子和预算,分别测试“走开再回来”“移动物体后再回来”“遮挡时连续交换”。然后对同一随机物理场景重复采样,记录终局分布与无法判读的比例。建议把每种失效单独存档,再决定需要更好的缓存、读取器还是状态更新机制。 这七篇共同带来的研究机会,是把历史记忆、动态状态和不确定性放进同一套可检查的生成流程。具体模块的组合效果仍待验证;选择方案时,应从你要保住的事实和可测的失效出发。 专题排期:本栏目自本期起每两周的周日发布一次。下一期为 2026 年 9 月 20 日,覆盖 9 月 7—20 日;工作日论文速读照常。 今日讨论 如果模型能保持一小时画质,却无法在物体移动后恢复正确位置,你会先增加历史容量,还是先测试记忆更新机制? 人工智能炼丹君 整理 | 数据来源:arXiv 双周覆盖 2026-08-24—2026-09-06(含首尾,共 14 天);原论文首发 2026-08-26—2026-09-02,PAWBench 采用 2026-09-03 v3 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月06日
12 阅读
0 评论
0 点赞
2026-09-05
AIGC 基本功|序列并行与 Ring Attention-SP
序列并行与 Ring Attention 所属方向:分布式训练 | 难度:高阶 | 前置知识:张量并行与流水线并行、注意力显存账本、FlashAttention 关键词:序列并行、Ring Attention、长序列、通信与计算重叠、Ulysses 01. 为什么需要它 一个视频或长文被编码成 131072 个 token,hidden size 为 8192,仅一个 BF16 的 $[L,d]$ 张量就占 2 GiB。Transformer 每层不只保存一个这样的张量,还要保存归一化输入、Q/K/V、MLP 中间量、dropout 状态等;标准 attention 若显式保存 $[L,L]$ 分数矩阵,单头 BF16 就是 32 GiB,根本无法进入反向。 数据并行沿 batch 切,每个 rank 仍要处理完整序列;张量并行沿 hidden/head 切,序列长度 $L$ 仍完整复制;流水线并行沿层切,某一层的长序列峰值仍在。长上下文把瓶颈推到第四个维度:必须沿 sequence 切 token。 但“每卡拿一段 token”并不自动成立。MLP 和 LayerNorm 对每个 token 独立,本地就能算;self-attention 中,每个 query 必须看到所有 key/value。若 rank 0 只拿前 1/8 的 K/V,它算出的就成了局部 attention,数学结果已经改变。序列并行的核心问题,是怎样在不复制全部长序列、不近似 attention 的前提下交换必要信息。 目前最常见的两类答案是 Ulysses 与 Ring Attention。Ulysses 先按 sequence 分片,再用 all-to-all 把布局变成按 attention head 分片,让每个 rank 在少量 head 上看到完整 sequence;算完后再 all-to-all 变回来。Ring Attention 则让每个 rank 保留本地 query,K/V block 沿环传递,经过 $P$ 轮后本地 query 恰好见过全序列。 即使尚未阅读FlashAttention 文章,因此先补最小背景:FlashAttention 并不近似 softmax,它把 Q/K/V 分块,并用在线 softmax 的最大值、分母和加权和递推,避免把完整 $L\times L$ 注意力矩阵写回 HBM。Ring Attention 把同一个分块思想扩展到多设备:块不只从显存搬到片上 SRAM,也沿网络搬到下一个 rank。 本文预算脚本给出:$L=131072,d=8192,P=8$ 时,一个 BF16 序列张量从每卡 2 GiB 降到 0.25 GiB,理想降低 8 倍;每层每 rank 绕环接收 K/V 的单向数据约 3.5 GiB。显存不是白省的,它被换成了通信与 $P$ 轮依赖。 02. 最小可用理解 三句话建立框架: 序列并行把 $[B,L,d]$ 沿 $L$ 切成 $P$ 份,使 LayerNorm、dropout、MLP 等序列形激活每卡近似降为 $1/P$。 Ulysses 用 all-to-all 在 sequence shard 与 head shard 间转置;Ring Attention 让 K/V block 绕环流动,本地 Q 用在线 softmax逐块累积精确结果。 两者没有把全注意力的 $O(L^2d)$ 算术复杂度变成线性,只是把计算与内存分散到多卡,并用通信重叠争取接近线性扩展。 如果只记一个区别:Megatron 风格的 sequence parallel 主要切 LayerNorm/dropout 等非 TP 区域的激活;Ulysses/Ring Attention 属于长上下文的 attention 并行,真正处理完整 sequence 上的全局注意力。很多系统把后者称为 context parallel,以免名称混淆。 03. 数学推导 3.1 标准 attention 的账本 令 $Q,K,V\in\mathbb{R}^{L\times d}$,为简洁省略 batch 与 head 维。scaled dot-product attention: $$O=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt d}\right)V$$ 分数矩阵 $S=QK^\top/\sqrt d$ 有 $L^2$ 个元素,算力约为 $O(L^2d)$。若将序列均分到 $P$ 个 rank,每卡持有 $Q_r,K_r,V_r\in\mathbb{R}^{L/P\times d}$。逐 token 的 MLP 可以直接本地算,但 attention 的本地输出需要: $$O_r=\operatorname{softmax}\left(\frac{Q_r[K_0;K_1;\ldots;K_{P-1}]^\top}{\sqrt d}\right)[V_0;V_1;\ldots;V_{P-1}]$$ 也就是说,本地 query 仍必须与所有 rank 的 K/V 相遇。区别只在“把所有 K/V 一次聚齐”还是“逐块流过”。 3.2 在线 softmax:Ring 的数学底座 对一行 query,把 key/value 分成若干块。处理前 $t$ 个块后,保存行最大值 $m_t$、指数和 $\ell_t$ 与未归一化加权和 $u_t$。新块分数为 $s$,块内最大值为 $m_b=\max(s)$,更新全局最大值: $$m_{t+1}=\max(m_t,m_b)$$ 为了把旧累计量换到新的指数基准,定义 $\alpha=\exp(m_t-m_{t+1})$,则: $$\ell_{t+1}=\alpha\ell_t+\sum_j\exp(s_j-m_{t+1})$$ $$u_{t+1}=\alpha u_t+\sum_j\exp(s_j-m_{t+1})v_j$$ 处理完所有块后: $$o=\frac{u_T}{\ell_T}$$ 每次最大值变大时,旧分母与旧分子同时乘 $\alpha$,所以比值语义不变。算法只需保存 $m,\ell,u$ 和当前 score tile,不需保存全矩阵。它与减最大值的稳定 softmax 完全等价,而不是近似。 3.3 Ring Attention 的 $P$ 轮 第 $r$ 个 rank 固定本地 $Q_r$,初始持有 $K_r,V_r$。第 0 轮计算本地块,第 1 轮把 K/V 发给下一个 rank并接收上一个 rank 的块,如此循环。第 $t$ 轮 rank $r$ 处理来源 $(r-t)\bmod P$ 的 K/V;$P$ 轮后每个 $Q_r$ 看过所有块。 本地计算量近似: $$C_{\mathrm{rank}}=O\left(\frac{L}{P}\cdot L\cdot d\right)=O\left(\frac{L^2d}{P}\right)$$ 每 rank 需要接收 $P-1$ 次大小约 $2(L/P)d\,b$ 的 K/V,其中 $b$ 是每元素字节数: $$V_{\mathrm{ring}}=2\frac{P-1}{P}Ldb$$ 当 $L$ 与 $P$ 同比例增长、每卡本地 token 数保持不变时,单轮的 Q/KV block 大小、计算量和传输量近似不变,增长的是轮数和每卡总计算量。是否能覆盖通信取决于单轮 block 是否足够大、有效算力与链路带宽;弱扩展本身不会自动改善单轮的重叠条件。若本地 block 太小、网络慢或 kernel 没有异步双缓冲,通信会裸露出来。 训练反向不能只把前向环倒放那么简单:每个 rank 还要计算对本地 Q、流动 K/V 的梯度,并把属于原拥有者的 dK/dV 沿环累积或归还。checkpoint 与重计算还能减少保存量,但增加计算。 3.4 因果 mask 如何穿过环 自回归 attention 要求 query 位置 $i$ 只能看 key 位置 $j\le i$。分块后,根据全局位置判断: K/V block 完全位于 Q block 未来:整块跳过; 完全位于过去:无需 mask; 与 Q block 重叠:块内施加三角 mask。 跳过未来块可省计算,但不同 rank 的有效工作量会不均。某些实现使用 zigzag 或重新排列 token,使每卡同时持有前后位置,平衡 causal attention 工作量。若只看非因果公式估算吞吐,部署到 causal LLM 时可能偏差很大。 3.5 Ulysses 的 all-to-all 转置 设输入布局是 sequence-sharded: $$[B,L/P,H,D_h]$$ $H$ 是 head 数,$D_h$ 是每头维度。Ulysses all-to-all 把它转成: $$[B,L,H/P,D_h]$$ 每卡序列完整、head 只剩 $H/P$,于是能在本地执行普通 attention;输出再 all-to-all 回 sequence shard。它通常要求 $H$ 能被 $P$ 整除,若 GQA 只有很少 KV heads,约束会更紧。Ring 不要求按 head 数切,但要经历 $P$ 个顺序环步骤。 Ulysses 的 collective 容易利用成熟 all-to-all,但跨节点 all-to-all 对网络争用敏感;Ring 只与邻居点对点通信,更贴合环形拓扑,也更容易细粒度重叠。没有一种方法在所有硬件和 head 配置上恒优。 3.6 Megatron Sequence Parallel 不等于长上下文 attention 传统 TP 的 column/row parallel 边界往往让某些激活在 TP rank 上复制。Megatron sequence parallel 把 LayerNorm、dropout 等逐 token 操作沿 sequence 切分,并用 reduce-scatter 与 all-gather 衔接 TP 区域,使这些激活内存近似降为 $1/P$。它与 TP process group 绑定,主要减少非 TP 区域的重复激活。 但 attention 若仍按 head 做 TP,每个 head 仍可能看到完整 sequence。因此配置项 sequence_parallel=true 并不等于已经支持百万 token。需要进一步的 context parallel、Ulysses 或 Ring Attention 才能沿 attention 的上下文维扩展。 一个序列张量的每卡存储随 P 下降,而完整前向绕环接收的 K/V 字节增加并趋于上限。右图是接收量,不重复计发送量,尚未包含反向通信。 04. 代码实现 ring_attention_sim.py 只用标准库,实现完整 softmax attention 与分块在线递推。Q/K/V 均为 $[4,2]$,每个 K/V block 两行,相当于两轮 ring: Q=K=V shape=(4, 2), kv_block=2, ring_steps=2 full[0]=[1.713718770, 1.717687378] ring[0]=[1.713718770, 1.717687378] max_abs_diff=0.000e+00 本组小样本在打印精度内相同;算法等价性来自第 3.2 节的不变式,浮点实现一般仍存在求和顺序引起的舍入差异。脚本没有真正启动多进程;它把 K/V block 依次喂给同一递推器,模拟每个 rank 收到环上块后的本地数学。生产实现还要异步 send/recv、双缓冲、causal mask 与 backward。 sp_budget.py 对 $L=131072,d=8192,H=64,P=8$ 输出: L=131072, d=8192, heads=64, sp=8, dtype_bytes=2 one [L,d] tensor: replicated=2.00 GiB, sequence-sharded/rank=0.25 GiB ideal memory reduction for sequence-shaped activations=8.0x Ulysses head-divisible=True (64//8=8 heads/rank) Ring Attention rounds=8, local query tokens=16384 Ring K/V traffic per rank per layer (one direction, ideal)=3.50 GiB 2 GiB 只是一个张量,不是整层总显存;0.25 GiB 是理想静态 shard,也没算当前通信块、输出、梯度与工作区。3.5 GiB 对应 $2(P-1)Ldb/P$,是每层、每 rank、单方向的 K/V 接收量。实际网络还包含反向与协议开销。 05. 工业级实现对照 以 2026-09 为准,DeepSpeed 的 deepspeed/sequence/layer.py 中 DistributedAttention 用自定义 all-to-all 在 scatter 轴与 gather 轴间转换 Q/K/V,调用 local_attention 后再变回去。源码明确检查总 head 数必须能被 sequence parallel size 整除,并提供 stream 与 overlap handle 管理通信重叠。 这个工业实现比最小公式多处理 batch 维位置、不同 Q/K/V 布局、rotary position embedding、异步 stream、autograd 的反向 all-to-all 与进程组。布局索引错一位可能 shape 仍合法但语义错误,所以系统必须统一采用明确的张量维约定。 Megatron-LM 的模型并行配置中 sequence_parallel 用于并行 LayerNorm 与 dropout;context_parallel_size 则面向上下文切分。当前 Megatron Core 还支持多种 context parallel 通信方式。读配置时不要只看“SP”缩写,要追到具体张量在哪个轴分片以及 attention 内部采取哪种交换。 Ring Attention 的工业 kernel 通常建立两个 K/V buffer:当前块参与计算时,下一个块在独立通信 stream 接收;计算结束交换 buffer。要真正隐藏通信,必须满足: $$T_{\mathrm{attention\ block}}\ge T_{\mathrm{send/recv}}$$ 此外还要确保计算与 NCCL 没争抢同一资源到互相拖慢。仅在代码里使用 async op 不代表 timeline 上已经重叠,必须用 profiler 验证。 FlashAttention 提供单卡块级 IO 优化,Ring/Ulysses 提供多卡数据布局。两者不是竞争关系:每个 rank 的 local attention 往往正由 FlashAttention kernel 完成。前者减少 HBM 读写,后者减少单卡需要常驻的全局序列。 checkpoint 也必须保存并行元数据。若训练时改变 SP/CP 度,参数本身或许未沿 sequence 切,但 optimizer、随机数状态和位置相关缓存可能变化。恢复前应由框架的 distributed checkpoint 层重新映射,而不是直接让每个 rank 读取旧编号文件。 06. 代价与边界 序列并行省的是序列形激活,不一定省参数和优化器状态;它通常要与 ZeRO/FSDP、TP、PP 组合。完整世界规模可能写成 $W=d_p t_p p_p c_p$,其中 $c_p$ 是 context parallel 度。每多一根轴,都新增 process group、拓扑映射与整除约束。 Ring Attention 保留全注意力的二次计算量。卡数增加能把每卡计算降到 $1/P$,但集群总 FLOPs 仍为 $O(L^2d)$;当上下文翻倍、卡数不变时,总计算约四倍。它突破的是单卡内存和 wall-clock 可扩展性,不是算法复杂度。 通信也不是“免费”。Ring 的每 rank 字节量随 $L$ 线性增长且有 $P$ 轮延迟链;Ulysses 有前后 all-to-all,容易受跨节点网络与并发任务干扰。若 $L$ 尚短,通信与布局转换可能比 attention 本身更贵,普通 TP 更合适。 常见边界包括: Ulysses 的 head 或 KV head 不能被 SP 度整除,GQA/MQA 尤其容易受限; causal mask 造成各 block 计算不均,需要 load-balanced ring; position encoding 必须使用全局位置,不能把每 rank 的局部 token 从 0 重新编号; dropout 的随机数要在切分前后保持统计与重算一致,否则并行度改变会造成难解释的差异; variable-length packed sequence 需要携带边界,不能让不同样本互相 attention; 视频 token 在时间、空间上的排列会影响 causal 或局部结构,切块策略不能只按连续内存方便决定。 在低带宽以太网集群上,增加 context parallel 度可能只是把 OOM 变成通信瓶颈。应先用 activation checkpoint、FlashAttention、减小 microbatch 等单机方法,确认仍由单卡序列容量限制,再引入跨设备 SP。 6.1 从单张量扩展到整层激活账本 一个 $[L,d]$ BF16 张量占 $2Ld$ 字节,但训练层内可能同时存在 residual、norm 输入、Q/K/V、attention output 与 MLP 中间值。设所有与序列线性相关且必须保存到反向的张量合计为 $cLd$ 个元素,序列分片后的理想每卡保存: $$M_{\mathrm{linear/rank}}\approx\frac{cLdb}{P}$$ $c$ 由架构、融合 kernel 与 checkpoint 策略决定,不能用固定常数套所有模型。SwiGLU 会产生门控与 value 两个支路;视频 DiT 还可能有条件分支、cross-attention 与调制参数。最可靠方法是从 profiler 的 allocation timeline 识别跨 backward 存活的张量。 attention tile 与通信 buffer 是额外峰值。Ring 双缓冲至少需要当前和下一份 K/V block;FlashAttention kernel 还需要 score tile、softmax statistic 和 workspace。于是: $$M_{\mathrm{peak/rank}}=M_{\mathrm{linear/rank}}+M_{\mathrm{local\ attention}}+M_{\mathrm{double\ buffer}}+M_{\mathrm{runtime}}$$ 当 $P$ 继续增加时,第一项下降,但 buffer、runtime 和最小 kernel workspace 不会等比下降,显存收益逐渐偏离 $1/P$。用总 allocated 除卡数预测极限会过于乐观。 6.2 反向为何比前向更难 前向中,本地 Q 只需依次看过所有 K/V block。反向要得到 $dQ_r$、$dK_j$ 与 $dV_j$。当来源 $j$ 的 K/V 到达 rank $r$ 时,本地可计算它对 $dQ_r$ 的贡献,也会产生属于来源 rank $j$ 的 $dK_j,dV_j$ 部分。后两者必须跨所有 query shard 求和并归还拥有者。 因此每个块需要身份信息,环中既可能传 K/V,也可能传对应梯度累计。为了减少前向保存,backward 常重算局部 score 与概率,依赖前向保存的行最大值和归一化分母。若随机 dropout 参与 attention,重算还必须恢复相同随机 mask。 理论通信量必须同时列前向与反向。只用 $2(P-1)Ldb/P$ 报告 K/V 前向流量会低估训练网络负担;真实实现还包括 dK/dV、可能的 dQ 归约、控制同步和其他模块的 collective。性能分析应以 profiler 中每层总通信字节与裸露时间为准。 6.3 通信重叠需要满足哪些条件 把一个本地 query block 与一个 K/V block 的 attention 计算时间记为 $T_c$,邻居传输一个 K/V block 的时间记为 $T_n=\alpha+S/\beta$,其中 $\alpha$ 是链路延迟,$\beta$ 是有效带宽,$S$ 是消息字节。双缓冲后的理想每轮时间: $$T_{\mathrm{round}}\approx\max(T_c,T_n)$$ 只有 $T_c\ge T_n$,网络才大部分隐藏。减小 block 能降低临时显存,却增加轮数和延迟占比;增大 block 提高 GEMM 效率,却增大 buffer。block size 是计算、带宽、延迟与显存的共同旋钮。 实现还需避免隐式同步。例如在循环中把 GPU 标量取回 CPU、过早 wait 通信 handle、复用尚未完成接收的 buffer,都会把异步流水串行化。正确做法是独立 stream、event 依赖与 ping-pong buffer,并在 GPU timeline 上确认 send/recv 与 attention kernel 真正重叠。 环的物理顺序同样重要。逻辑 rank 相邻却跨交换机,会让每轮走慢链路;合理 ring 应优先沿 NVLink 域,再通过少量跨节点边连接。多维集群还可以分层:节点内用 Ulysses all-to-all,节点间用 Ring,或反过来根据硬件选择,这正是统一序列并行方法的动机。 6.4 长度、head 与并行轴的联合约束 设 context parallel 度为 $c_p$、tensor parallel 度为 $t_p$。若 TP 已把 head 切为 $H/t_p$,Ulysses 再沿 head 分 $c_p$,就需要本地可见 head 数继续可分: $$H\ \bmod\ (t_pc_p)=0$$ 具体约束取决于框架是在同一 head 轴叠加还是采用不同布局。GQA 中应将 $H_{KV}$ 单独代入;只有 8 个 KV head 的模型很难做大 head-parallel。某些系统复制 K/V 以放松整除,但通信和显存模型随之改变。 sequence length 通常也要求能被 $c_p$ 与 block size 整除。不整除时可以 padding 或不等长 shard。padding 实现简单但会浪费二次 attention 计算;不等长 shard 又使通信消息与计算不均。对长度差异大的数据,先按 token 数分桶往往比依赖动态不等长 ring 更稳定。 TP 与 CP 同时使用还会出现多种 collective。attention 投影可能在 TP 组 all-reduce,context attention 在 CP 组 send/recv,层外梯度还在 DP 组 reduce-scatter。若各组在不同 rank 上以不一致顺序发起 collective,可能死锁。框架必须给跨组通信建立确定顺序或独立 stream 依赖。 6.5 视频与多模态序列的特殊问题 视频 token 常按时间、空间高、空间宽展平。连续切 sequence 可能让每个 rank 持有若干完整帧,也可能持有同一帧的空间条带;两种布局对位置编码、局部 attention、数据增强和负载平衡影响不同。若模型有 temporal attention 与 spatial attention 分解结构,最优切分轴也可能随层变化。 全局位置必须从原始坐标生成。RoPE 若把每个 rank 的局部索引重新从 0 开始,不会报 shape 错,却让不同块位置混叠。二维或三维 RoPE 更要携带时间与空间坐标,而不是只传一个线性 offset。跨模态序列还要保持文本、图像、视频 segment 的 mask 与边界。 视频长度和分辨率经常动态变化。同一 global batch 内若 token 数差异大,padding 使最长样本决定所有 rank 工作量;packed sequence 可减少浪费,却要求 block 不跨样本做 attention。调度系统最好按总 token 数而非样本数组 batch,并把实际有效 token 纳入 loss normalization。 因果结构也不总是标准下三角。视频生成可能使用双向视觉 attention、文本到视频 cross-attention 或分块因果时间 mask。Ring 优化中“未来块可跳过”的判断必须来自真实 mask 结构,不能硬编码 LLM 假设。 6.6 正确性验收与故障定位 第一层验收是 shape:每个边界记录 global shape、local shape、分片轴、global offset、padding 与拥有者。第二层是数学:小尺寸 FP64 单卡作为 oracle,逐项比较 forward 和 dQ/dK/dV。第三层是随机性:开启 dropout 与 checkpoint 后,在固定 seed 下比较统计和可复现范围。 输出不一致时,可按轮 dump 每个 rank 处理的 K/V 来源编号。若少一个或重复一个,是 ring 调度;若所有来源齐全但数值错,检查在线 softmax 的旧累计重标定;若仅 causal 错,检查全局位置与块分类;若 forward 对而 backward 错,检查 dK/dV 归还与跨 query shard 求和。 OOM 时不要只减 block。先区分 persistent activation、通信双 buffer、kernel workspace 与碎片。若 activation 占主导,提高 CP 或 checkpoint 有效;若 buffer 占主导,减 block 才有效;若碎片主导,可调分配器或稳定 shape。错误手段可能降低吞吐却完全不改变峰值来源。 性能验收同时做 strong scaling 与 weak scaling。strong scaling 固定全局 $L$,增加卡数,观察端到端时间能否下降;容量弱扩展固定每卡 local token,令 $L\propto P$:精确全注意力的每卡计算 $L^2/P$ 此时随 $P$ 线性增长,不能期望每卡时间不变;应比较实测时间与这一增长基线,以及通信隐藏率。Ring Attention 可随设备数扩展可处理上下文,但总计算也随之增加。 最后把精度也纳入验收。在线 softmax 很稳定,但不同 block 顺序改变浮点加法;BF16、FP8 attention 更明显。应比较最终任务指标、loss 轨迹和梯度,而不是要求多卡输出 bitwise 等同。若误差远超单纯归约顺序,再排查 scale、mask 与布局。 6.7 Ulysses、Ring 与混合方案如何选 先看 head 约束。若本地 Q head 与 KV head 都能被目标 SP 度整除,且集群 all-to-all 带宽高,Ulysses 路径直接,local attention 可复用成熟 kernel。若 KV head 很少、SP 度很大,Ring 不沿 head 切,通常更容易扩展。再看拓扑:全连接高速交换更适合 all-to-all;邻接带宽强、跨组带宽弱时,环形点对点更自然。 再看本地块计算。长序列、大 head dimension 使每轮计算足以隐藏 K/V 传输,Ring 受益;较短序列或大量小 head 时,$P$ 轮延迟可能突出。Ulysses collective 次数少,但消息全局交换可能造成拥塞。决策依据应是每轮计算时间、有效链路带宽和 collective 实测,不是理论总字节一项。 混合方案把设备组织成二维网格。例如节点内 8 卡做 Ulysses,节点间若干组做 Ring;这样 head 整除只限制节点内度数,跨节点使用邻接通信。代价是布局更复杂、process group 更多,Q/K/V 需要在两个维度间保持一致顺序。只有单一方案确实受限时才值得引入。 还要把 TP 纳入考虑。如果 TP 已经切 head,Ulysses 可用 head 更少;有时降低 TP、提高 CP 更适合长序列,有时模型单层容量又要求 TP 不能降。最优并行度会随训练长度变化,短序列预训练与长序列继续训练未必使用同一布局。 6.8 推理场景与训练不同 prefill 处理整段 prompt,计算形态接近训练前向,序列并行能分摊长 prompt attention。decode 每步只有少量新 query,却要读取不断增长的 KV cache;此时瓶颈常是 KV 带宽与跨卡延迟,而非大块 GEMM。训练中优秀的 Ring block,在逐 token decode 里可能太细、同步轮数太多。 推理还涉及请求级并发。可以把不同请求分给数据并行副本,也可把一个超长请求沿 context 分片。前者吞吐高、单请求受单卡长度限制;后者支持超长上下文、占用多个设备。调度器应根据请求长度动态选择,而不是所有请求固定占一个 CP 组。 KV cache 的拥有关系必须稳定。若每 rank 保存一段 sequence,新增 token 的 K/V 放在哪一段、何时重平衡、beam search 如何复制,都要定义。Paged KV cache 与 context parallel 叠加时,逻辑页、物理 GPU 与全局位置形成三层映射,错误可能表现为偶发内容质量下降而非崩溃。 因此本文通信公式主要用于训练或 prefill,不能直接拿来预测 decode tokens/s。推理基准要分别报告 time-to-first-token、inter-token latency、并发吞吐、KV cache 容量和长短请求混合表现。 6.9 上线前检查清单 上线前确认:sequence、head、KV head 与 block 的整除或 padding 规则明确;每个 shard 保存全局位置;causal/packed mask 按全局索引生成;每轮 K/V 来源不重不漏;在线 softmax 保存并正确重标定最大值、分母与分子;backward 的 dK/dV 回到原拥有者;dropout 重算保持随机一致。 系统侧确认 ring 物理顺序符合拓扑,通信与计算 timeline 真重叠,buffer 生命周期无覆盖,所有 rank collective 顺序一致,checkpoint 记录分片元数据,变更 CP 度可以恢复。性能侧同时做 strong/weak scaling,并在真实长度分布而非单一最大长度上测试。 最后保留小尺寸 oracle。每次升级 attention kernel、通信库、RoPE 或 mask 实现,都自动生成随机 Q/K/V,与 FP64 单卡结果比较 forward 和全部梯度;再跑包含因果、变长、GQA、极端分数和非整除长度的边界集。长序列错误代价很高,小 oracle 是最便宜的保险。 6.10 最后的边界:更长不等于更有用 系统能够处理百万 token,只说明容量与运行时间可接受,不保证模型会利用远距离信息。长上下文实验还要检查位置外推、训练长度分布、检索准确率与有效注意范围。并行系统解决“算得出来”,数据与模型设计决定“学得会不会”。 因此扩展长度时同时保留短上下文质量基线,按距离分桶评估信息召回,并报告有效 token 而非 padding 后长度。否则可能用大量 GPU 计算模型并未使用的上下文。 07. 经典论文脉络 FlashAttention(arXiv:2205.14135):用 IO-aware tiling 与在线 softmax 实现精确 attention,避免物化完整分数矩阵,是多卡分块 attention 的本地 kernel 基础。 Reducing Activation Recomputation in Large Transformer Models(arXiv:2205.05198):提出 Megatron sequence parallel 与选择性重计算,减少 TP 区域之外的重复激活。 DeepSpeed Ulysses(arXiv:2309.14509):用 all-to-all 在 sequence 与 head 布局间转换,使超长序列 attention 可扩展。 Ring Attention with Blockwise Transformers(arXiv:2310.01889):让 K/V 块沿环流动并与分块计算重叠,把可处理上下文随设备数扩展。 USP(arXiv:2405.07719):统一 Ulysses 与 Ring 两类序列并行,针对模型结构与网络拓扑组合两者。 这条演进线从“单卡不保存 $L^2$ 矩阵”,走到“多卡不复制 $L$ 激活”,再走到按 head 结构和网络拓扑组合通信方式。算法、kernel 与系统三层缺一不可。 08. 常见误解 误解一:序列并行把 attention 复杂度从二次降成线性。 精确全注意力的集群总计算仍为 $O(L^2d)$;它只把工作分摊,并让内存近似随本地 token 数增长。 误解二:每卡切一段 token 后直接做本地 attention。 那只允许 token 看同一分片,会改变模型。必须让 query 见到全局 K/V,或明确接受局部/稀疏近似。 误解三:Ring Attention 是近似注意力。 在线 softmax 递推在精确算术下与完整 softmax 等价;差别来自浮点归约顺序,不是丢弃连接。 误解四:开启 Megatron sequence_parallel 就解决长上下文。 它主要减少 LayerNorm、dropout 等激活复制;长上下文 attention 通常还需 context parallel。 误解五:异步 send/recv 就等于通信被隐藏。 只有计算时间覆盖传输、stream 真能并发且无资源争抢,timeline 上才会重叠。 误解六:Ulysses 的 SP 度只受 GPU 数限制。 head 数、KV head 数与 tensor layout 必须可切;GQA 模型常比标准 MHA 更早碰到上限。 09. 动手验证 先运行 ring_attention_sim.py,把 block_size 改成 1、2、4。预期 max_abs_diff 始终接近机器精度;再把 score 全部加 1000,稳定递推仍有限,而直接 exp(score) 会溢出。这同时验证精确性与减最大值的重要性。 为脚本加入 causal mask,使用 query/key 的全局索引屏蔽 $j>i$。预期分块结果与完整下三角 attention 一致。然后故意用局部索引 mask,会发现后续 rank 错误允许关注未来或错误屏蔽过去,这是真实分布式实现中很隐蔽的 bug。 运行 sp_budget.py,固定每卡 token 为 16384,让 $L$ 与 ranks 同比例从 1、2、4、8 增长。每卡序列张量保持 0.25 GiB,而 ring K/V 流量与全局 $L$ 增长。这个弱扩展实验说明“可放下更长序列”并不等于“通信不增长”,只是计算增长可能覆盖通信。 在真实集群比较 FlashAttention 单卡、Ulysses、Ring/context parallel:固定模型与 global sequence,记录峰值显存、attention kernel 时间、collective/点对点时间、重叠率与 MFU。分别在节点内和跨节点运行;预期最佳方法随 NVLink、InfiniBand、head 数和 local block 大小变化。 最后做数值验收:关闭 dropout,用同一 Q/K/V 比较单卡与多卡输出及 dQ/dK/dV。BF16 下用合理容差,同时单独检查每个 rank 拼接后的全局顺序。输出对而梯度错,通常说明 backward 中流动 K/V 梯度没有正确归还拥有者。 10. 延伸阅读 读懂本文的完整前置路径是: 数据并行与 ZeRO 显存切分:先区分状态分片与计算分片(已发布)。 张量并行与流水线并行:理解 process group、collective、microbatch 与拓扑(已发布)。 自注意力机制的计算与显存账本:理解 $L^2$ 分数矩阵从哪里来。 FlashAttention 为什么不需要存下注意力矩阵:深入单卡在线 softmax 与 IO 复杂度。 DDPM 训练目标与采样流程和 DiT:用 Transformer 替掉 UNet:理解视频 DiT 的时空 token 为何迅速推高注意力成本。 选 Ulysses 还是 Ring,不应从名字出发。先列出 $L,H,H_{KV},d$、网络拓扑、每卡内存与 causal 结构;再计算 local shape、通信字节、轮数和可重叠窗口;最后用 profiler 验证。长上下文系统真正的能力,是让数学等价、内存边界和物理网络三者同时对齐。 附录:完整代码 09 节用到的脚本全文如下(ring_attention_sim.py、sp_budget.py、make_figures.py)。复制到本地存成同名文件,按各脚本开头的依赖说明准备环境后即可运行。 ring_attention_sim.py #!/usr/bin/env python3 """Exact blockwise attention recurrence used by ring-style attention; stdlib only.""" import math def dot(a, b): return sum(x * y for x, y in zip(a, b)) def full_attention(q, k, v): outputs = [] scale = math.sqrt(len(q[0])) for query in q: scores = [dot(query, key) / scale for key in k] peak = max(scores) weights = [math.exp(score - peak) for score in scores] denom = sum(weights) outputs.append([sum(w * value[j] for w, value in zip(weights, v)) / denom for j in range(len(v[0]))]) return outputs def blockwise_attention(q, k, v, block_size): scale = math.sqrt(len(q[0])) peak = [-math.inf] * len(q) denom = [0.0] * len(q) numer = [[0.0] * len(v[0]) for _ in q] for start in range(0, len(k), block_size): kb, vb = k[start:start + block_size], v[start:start + block_size] for row, query in enumerate(q): scores = [dot(query, key) / scale for key in kb] new_peak = max(peak[row], max(scores)) correction = math.exp(peak[row] - new_peak) if peak[row] != -math.inf else 0.0 weights = [math.exp(score - new_peak) for score in scores] denom[row] = correction * denom[row] + sum(weights) numer[row] = [correction * old + sum(w * value[j] for w, value in zip(weights, vb)) for j, old in enumerate(numer[row])] peak[row] = new_peak return [[x / denom[row] for x in numer[row]] for row in range(len(q))] q = [[1.0, 0.0], [0.0, 1.0], [1.0, 1.0], [-1.0, 1.0]] k = [[1.0, 0.0], [0.0, 1.0], [1.0, 1.0], [1.0, -1.0]] v = [[1.0, 2.0], [2.0, 0.0], [0.0, 3.0], [4.0, 1.0]] full = full_attention(q, k, v) streamed = blockwise_attention(q, k, v, block_size=2) max_diff = max(abs(a - b) for ra, rb in zip(full, streamed) for a, b in zip(ra, rb)) print("Q=K=V shape=(4, 2), kv_block=2, ring_steps=2") print("full[0]=[" + ", ".join(f"{x:.9f}" for x in full[0]) + "]") print("ring[0]=[" + ", ".join(f"{x:.9f}" for x in streamed[0]) + "]") print(f"max_abs_diff={max_diff:.3e}") sp_budget.py #!/usr/bin/env python3 """Compare idealized per-rank sequence-memory and method constraints.""" import argparse parser = argparse.ArgumentParser() parser.add_argument("--tokens", type=int, default=131072) parser.add_argument("--hidden", type=int, default=8192) parser.add_argument("--heads", type=int, default=64) parser.add_argument("--ranks", type=int, default=8) args = parser.parse_args() if args.tokens % args.ranks: parser.error("tokens must be divisible by ranks") tensor_gib = args.tokens * args.hidden * 2 / 1024**3 local_gib = tensor_gib / args.ranks print(f"L={args.tokens}, d={args.hidden}, heads={args.heads}, sp={args.ranks}, dtype_bytes=2") print(f"one [L,d] tensor: replicated={tensor_gib:.2f} GiB, sequence-sharded/rank={local_gib:.2f} GiB") print(f"ideal memory reduction for sequence-shaped activations={args.ranks:.1f}x") print(f"Ulysses head-divisible={args.heads % args.ranks == 0} ({args.heads}//{args.ranks}={args.heads // args.ranks} heads/rank)") print(f"Ring Attention rounds={args.ranks}, local query tokens={args.tokens // args.ranks}") print(f"Ring K/V traffic per rank per layer (one direction, ideal)={2*tensor_gib*(args.ranks-1)/args.ranks:.2f} GiB") make_figures.py """Regenerate this article's deterministic teaching figure (numpy + matplotlib).""" from pathlib import Path import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt import numpy as np OUT=Path(__file__).resolve().parents[1]/"figures" OUT.mkdir(exist_ok=True) plt.rcParams.update({"font.sans-serif":["PingFang SC","Arial Unicode MS","DejaVu Sans"],"axes.unicode_minus":False}) p=np.array([1,2,4,8,16,32]); L=131072;d=8192;b=2;g=1024**3 fig,axes=plt.subplots(1,2,figsize=(10,4.4)) axes[0].plot(p,np.full(p.shape,L*d*b/g),"--",label="Replicated") axes[0].plot(p,L*d*b/p/g,"o-",label="Sequence shard") axes[0].set(xscale="log",xlabel="Ranks P",ylabel="One tensor per rank (GiB)");axes[0].legend() axes[1].plot(p,2*(p-1)/p*L*d*b/g,"o-") axes[1].set(xscale="log",xlabel="Ranks P",ylabel="Forward K/V received per rank (GiB)") for ax in axes:ax.grid(alpha=.25) fig.suptitle("Ring attention budget: L=131072, d=8192, BF16");fig.tight_layout() fig.savefig(OUT/'ring_budget.png',dpi=170) plt.close(fig) print(OUT/'ring_budget.png') 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月05日
10 阅读
0 评论
0 点赞
2026-09-05
AIGC 基本功|张量并行与流水线并行-TP-PP
张量并行与流水线并行 所属方向:分布式训练 | 难度:高阶 | 前置知识:数据并行与 ZeRO 显存切分 关键词:张量并行、流水线并行、Megatron-LM、GPipe、通信开销、并行策略 01. 为什么需要它 ZeRO-3 能把参数、梯度和优化器状态切到数据并行 rank 上,但每一层计算时仍要聚合这一层的参数。若单个 Transformer 层、词表投影或大矩阵乘本身就放不进一张卡,单纯增加数据并行度解决不了问题;若层能放下,但整网常驻状态或激活放不下,也可考虑沿网络深度切开;能否仅靠 ZeRO-3 和重计算解决,需要先算峰值。 这对应两把不同的刀。张量并行(Tensor Parallelism,TP)在一层内部切矩阵,让多张卡共同完成同一个 GEMM;流水线并行(Pipeline Parallelism,PP)沿层切模型,让不同设备各自保存连续或交错的一段层。前者解决“这一层太宽”,后者解决“模型太深”。数据并行沿 batch 复制模型,三者切的是三个不同维度。 先看一个浪费现场:4 个 pipeline stage 处理 1 个 microbatch。第 0 段前向时其余三段都空闲;数据流到第 3 段后,前几段又空闲。若把一个 global batch 切成 8 个 microbatch,让不同样本在各 stage 重叠,理想 forward sweep 从 $4\times8=32$ 个串行 stage-slot 压到 11 个时间槽,但仍有填充和排空的“气泡”。本文脚本算出 4 段、8 个 microbatch 的理想利用率只有 72.73%,气泡占 27.27%。 再看 TP:若一个 MLP 的第一层权重为 $[d,4d]$,可沿输出维切成 $p$ 份,每卡算 $[d,4d/p]$;第二层 $[4d,d]$ 再沿输入维与中间激活匹配切分。这样两次 GEMM 都不需要在中间把完整 $4d$ 激活拼回每张卡,只在必要边界做集合通信。这正是 Megatron-LM 的 column-parallel 与 row-parallel 配对。 难点不在“切成几份”,而在切后保持数学等价,并让通信落在高带宽拓扑上。TP 频繁同步,通常限制在 NVLink/NVSwitch 节点内;PP 在相邻 stage 前向传激活、反向传对应梯度,更适合跨节点。若反过来布置,同一套卡数会被网络延迟拖垮。 02. 最小可用理解 三句话建立框架: TP 切一层的隐藏维、输出通道或 attention head,每层都会通信,换来单层权重、激活和计算分摊。 PP 把层分给不同 stage,再把 batch 切成 microbatch 以重叠各段计算;microbatch 越多,气泡越小,但调度和激活管理更复杂。 生产系统通常组成 DP×TP×PP 的三维网格:TP 放在最快链路内,PP 穿过较慢边界,剩余设备做 DP 与 ZeRO/FSDP。 如果只记一句:TP 是“同一个样本的一层由多卡一起算”,PP 是“同一个样本依次经过多卡上的不同层”。它们都属于模型并行,但通信模式完全不同。 设世界规模 $W$,数据并行度为 $d_p$、张量并行度为 $t_p$、流水线段数为 $p_p$,若没有其他并行轴: $$W=d_p\,t_p\,p_p$$ 这不是越均匀越好。TP 度受矩阵维度、head 数、KV head 数和高速互联限制;PP 度受层数、切分均衡与 microbatch 数限制;最后再用 DP 提升全局吞吐。 03. 数学推导 3.1 Column Parallel:沿输出维切 线性层输入 $X\in\mathbb{R}^{n\times d_{\mathrm{in}}}$,权重 $A\in\mathbb{R}^{d_{\mathrm{in}}\times d_{\mathrm{out}}}$,输出为: $$Y=XA$$ 把 $A$ 沿列切为 $p$ 份: $$A=[A_0,A_1,\ldots,A_{p-1}],\qquad A_i\in\mathbb{R}^{d_{\mathrm{in}}\times d_{\mathrm{out}}/p}$$ 第 $i$ 个 rank 计算: $$Y_i=XA_i$$ 完整结果只是拼接: $$Y=[Y_0,Y_1,\ldots,Y_{p-1}]$$ 前向不必通信,只要输入 $X$ 在 TP 组内复制。若下一层能直接消费分片 $Y_i$,连 all-gather 都可省。反向时,每个 rank 产生一份输入梯度贡献 $dX_i=dY_iA_i^\top$,完整 $dX$ 要求和: $$dX=\sum_{i=0}^{p-1}dX_i$$ 因此 column-parallel 的关键通信落在反向输入梯度 all-reduce。 3.2 Row Parallel:沿输入维切 把输入和权重的匹配维切开: $$X=[X_0,X_1,\ldots,X_{p-1}],\qquad A=\begin{bmatrix}A_0\\A_1\\ \vdots\\A_{p-1}\end{bmatrix}$$ 每卡先算局部部分和 $Z_i=X_iA_i$,完整输出是: $$Y=XA=\sum_{i=0}^{p-1}X_iA_i=\sum_{i=0}^{p-1}Z_i$$ 所以 row-parallel 前向需要 reduce 或 all-reduce,反向则能从复制的 $dY$ 本地得到 $dX_i=dYA_i^\top$。Megatron 把 MLP 的第一层做 column parallel,激活函数逐元素地作用在本地 shard;第二层做 row parallel,最后只求和一次。attention 的 QKV 投影与输出投影也能形成类似配对。 这种设计的精髓不是“每个 Linear 都随便切”,而是让相邻层的分片布局衔接,从而避免在每个算子后都 all-gather。若一个自定义层偷偷需要完整 hidden,通信会突然增加。 3.3 TP 的通信账本 设传输张量有 $N$ 个元素、每元素 $b$ 字节,ring all-reduce 在理想带宽模型中每 rank 通信: $$V_{\mathrm{AR}}=2\frac{p-1}{p}Nb$$ $p$ 是 TP 组大小。Megatron 风格的一个 Transformer 层在前向与反向关键边界各发生集合通信;真实实现可用 reduce-scatter、all-gather 与 sequence parallel 改写,但总成本仍与 token 数、hidden size 和 TP 频率有关。TP 每层同步,所以延迟不能忽略:小矩阵、多层和大 TP 度会让消息切得太碎,算力利用率反而下降。 TP 对参数显存理想降为 $1/p$,但并非所有东西都跟着切。LayerNorm 参数很小,可能复制;embedding 与 LM head 有词表切分规则;激活是否分片取决于 sequence-parallel 配置;通信临时 buffer 还会增加峰值。因此应从真实 module state 和 profiler 测量,不可把全显存直接除以 TP 度。 3.4 PP 气泡从哪里来 设有 $p$ 个等耗时 stage,global batch 切成 $m$ 个 microbatch,每个 stage 处理一个 microbatch 的单向计算耗时为一格。第一个 microbatch 需要 $p$ 格到达尾部,之后每格完成一个。完成一个 forward sweep 共: $$T_{\mathrm{sweep}}=m+p-1$$ 其中每个 stage 真正工作 $m$ 格,所以理想效率与气泡比例: $$\eta_{\mathrm{pipe}}=\frac{m}{m+p-1},\qquad f_{\mathrm{bubble}}=\frac{p-1}{m+p-1}$$ 当 $p=4,m=8$,效率 $8/11=72.73\%$。要到 90% 以上,需要 $m\ge9(p-1)$。这也解释了为什么 stage 很多却只有几个 microbatch 时 PP 很差。 公式假设各段等耗时、通信完全隐藏、无数据依赖停顿。真实训练的气泡还包括 stage 不均衡、点对点传输、参数同步、数据加载与尾 batch。最后一段若有巨大词表投影,前面切得再平均也会被它卡住。 3.5 GPipe、1F1B 与交错调度 GPipe 先把所有 microbatch 前向跑完,再统一反向,调度简单但要保存更多未反向的激活。1F1B 在 warmup 后交替执行一次 forward 和一次 backward,使稳态内存更接近少量 microbatch;同步更新语义仍要求一个 global batch 的梯度累积完再 step。 交错 1F1B 让每个物理设备承载多个 virtual stage,把一个大气泡拆细。它可改善负载与气泡,却增加更多通信边界、依赖和调度复杂度。Pipeline 并行的优化对象不只是公式里的 bubble,还包括峰值激活、通信重叠和 kernel 连续性。 均衡同步流水线的理想利用率,按 m/(m+p−1) 计算。增加 microbatch 能摊薄填充与排空气泡;图中不含通信、stage 失衡与小 GEMM 效率变化。 04. 代码实现 tp_linear_sim.py 只用标准库,构造 $X:[2,4]$、$W_1:[4,6]$、$W_2:[6,3]$。先完整计算,再把第一层按列、第二层按行切到两个虚拟 rank: X shape=(2, 4), W1 shape=(4, 6), W2 shape=(6, 3), tp=2 column shards: W1=(4, 3) each, hidden=(2, 3) each row shards: W2=(3, 3) each, partial output=(2, 3) each full output=[[52, 42, 72], [132, 114, 180]] max hidden diff=0, max output diff=0 输出差为 0,验证“按列拼接、按行求和”与完整矩阵乘严格等价。真实浮点并行的归约顺序不同,通常会出现末位误差,不能要求 bitwise 一致,而应设置与 dtype 相称的容差。 pipeline_bubble.py 默认模拟 4 段、8 个 microbatch: stages=4, microbatches=8, ideal_slots_per_sweep=11 pipeline_efficiency=72.73%, bubble_fraction=27.27% forward schedule (slot -> active stage:microbatch) 00: S0:M0 01: S0:M1 S1:M0 02: S0:M2 S1:M1 S2:M0 03: S0:M3 S1:M2 S2:M1 S3:M0 04: S0:M4 S1:M3 S2:M2 S3:M1 05: S0:M5 S1:M4 S2:M3 S3:M2 06: S0:M6 S1:M5 S2:M4 S3:M3 07: S0:M7 S1:M6 S2:M5 S3:M4 08: S1:M7 S2:M6 S3:M5 09: S2:M7 S3:M6 10: S3:M7 最前面三格在填充,最后三格在排空,中间四个 stage 才全部忙碌。用参数改变 stages 与 microbatches,就能看到增加 microbatch 如何摊薄固定气泡。 05. 工业级实现对照 以 2026-09 为准,NVIDIA Megatron-LM 的 tensor_parallel/layers.py 仍提供 ColumnParallelLinear 与 RowParallelLinear。工业实现除切权重外,还管理参数初始化、bias、是否 gather 输出、异步梯度 all-reduce、梯度累积融合、sequence parallel、专家并行组和通信 buffer。最小脚本只证明线性代数,没有模拟 autograd 与 NCCL。 ColumnParallelLinear 的 gather_output 决定输出是否立刻汇总;RowParallelLinear 的 input_is_parallel 表示输入是否已经按最后一维切好。错误组合往往不是数值报错,而是多做一次 gather 或得到错位 shard。审计并行模型时,应给每个边界标清 global shape、local shape、分片轴、复制轴和预期 collective。 PP 代码位于 Megatron Core 的 pipeline_parallel 调度模块。配置中的 pipeline_model_parallel_size 切物理 stage,virtual_pipeline_model_parallel_size 启用交错。系统必须传递前向激活和反向梯度,处理 tied embedding、首尾 stage 特殊 loss、不同张量 shape、激活释放与通信重叠。 Megatron 2021 展示了 TP、PP 与 DP 的组合,并提出交错流水调度。工程上的常见布局是:同一节点内组成 TP 组,邻接节点组成 PP 链,跨副本组成 DP 组。原因是 TP 每层通信而 PP 只在 stage 边界传输;把频繁 collective 放在更快互联上更划算。 生产配置还要做 layer partition。按层数平均只在每层耗时相同才合理;MoE 层、cross-attention、视觉模块、embedding 与词表 head 的成本差异很大。应先 profile 单层前后向时间和激活尺寸,再按时间而不是按层数切 stage。 06. 代价与边界 TP 的主要代价是高频 collective。TP 度增加后,每卡 GEMM 变小,计算效率下降,通信延迟占比上升;跨节点 TP 尤其敏感。维度还必须能合理整除:attention head、KV head、MLP intermediate size、词表分片与低精度 tile 对齐都会形成约束。 PP 的主要代价是气泡、激活驻留与调度复杂度。microbatch 增多能降气泡,却让每次 GEMM 的 batch 更小,可能降低算力利用率;还会增加调度次数。梯度累积数也受 global batch、DP 度与 microbatch size 约束: $$B_{\mathrm{global}}=B_{\mathrm{micro}}\,m\,d_p$$ 为了把 $m$ 调大而偷偷改变 global batch,会连学习率与收敛语义一起改变。更稳妥的做法是减小 microbatch size、保持 global batch,再检查小 GEMM 是否仍高效。 PP stage 之间有顺序依赖,单个慢 stage 会拖住全链。设备故障、动态 shape、条件分支和 MoE 路由也比普通 DP 难处理。推理时 batch 与请求长度动态变化,训练得到的均衡切分未必仍均衡。 TP 与 ZeRO/FSDP 并非天然可任意叠加。两者可能切同一参数的不同轴,process group、参数初始化、checkpoint layout 和 optimizer state 都需协调。首先建立二维或三维 rank 映射,再启用框架明确支持的组合,避免自行套两层 wrapper。 什么时候不该用?模型单卡能放下且吞吐受数据不足或 CPU 限制时,TP/PP 只会增加同步;单层很小而层很多时,优先 PP 或 FSDP;单层巨大而层数不多时,TP 更直接;超长序列导致激活爆炸时,还要引入下一篇的序列/上下文并行。 6.1 从模型形状反推 TP 度 假设 decoder hidden size 为 $d$,MLP expansion 为 $4d$,attention head 数为 $H$,每头维度为 $d_h=d/H$。采用 $t_p$ 路 TP 时,至少希望 $H/t_p$ 与 $4d/t_p$ 为整数,且本地矩阵维度满足 Tensor Core tile 对齐。GQA 还要检查 KV head 数 $H_{KV}$;若 Q head 可整除而 KV head 不可整除,框架可能复制 K/V 或根本拒绝配置。 参数容量只是下界。以 MLP 两个权重为例,忽略 bias: $$P_{\mathrm{MLP}}=d(4d)+(4d)d=8d^2$$ 理想 TP 后每卡为 $8d^2/t_p$ 个参数。然而输入 $X$、残差、LayerNorm 与某些输出仍可能复制。是否启用 sequence parallel,会决定 $[B,L,d]$ 激活是每 TP rank 一份还是沿 token 切开。评估 TP 度时要分别列参数、可分片激活、复制激活和通信 buffer,不能只用总显存除 $t_p$。 性能上,本地 GEMM 的算术强度会随 $t_p$ 增大而下降。若 $d/t_p$ 太小,矩阵乘无法占满 SM,即使通信为零也会变慢。实际选型一般从“能放下的最小 TP 度”起步,再尝试少数相邻值;不是卡越多 TP 越大。 6.2 三维 rank 映射为什么决定速度 有 2 个节点、每节点 8 卡,总计 16 卡。假设 TP=8、PP=2、DP=1,合理映射是每个节点内部构成一个 TP 组,两个节点作为相邻 PP stage。这样每层 TP collective 走 NVLink/NVSwitch,只有 stage 边界激活跨节点。 若 rank 编号错误,使每个 TP 组横跨两节点,那么每个 Transformer 层的 all-reduce 都经过网络;PP 反而在节点内。数学结果完全正确,吞吐却可能大幅下降。这类问题从配置数字看不出来,必须导出每个 process group 的物理 GPU、主机名、PCIe/NVLink 路径和 NIC 亲和性。 当 DP>1 时,DP 组应从相同 TP/PP 坐标上取不同副本。例如把 rank 写成坐标 $(r_d,r_p,r_t)$,模型同一 shard 的梯度只在 $r_d$ 维同步;层内 tensor collective 只改变 $r_t$;pipeline 点对点只沿 $r_p$ 邻接。把坐标语义明确下来,checkpoint 分片和故障定位才不会依赖偶然 rank 编号。 多 NIC 节点还要关注通信并发。TP all-reduce、PP send/recv、DP reduce-scatter 可能同时争同一链路。单独 benchmark 每个 collective 很快,不代表组合后仍快;应在真实 schedule 上看每条 stream 和 NIC 的时间线。 6.3 Pipeline 内存不是简单除以段数 PP 将参数按层分段,参数内存近似降为 $1/p_p$,但激活取决于 schedule。GPipe 前向完所有 $m$ 个 microbatch 才反向,每 stage 可能保留 $O(m)$ 份边界与层内激活。1F1B warmup 后尽早反向,可显著减少同时存活的 microbatch 数;不同 stage 的 warmup 长度又不同,峰值不完全一致。 activation checkpoint 将层内保存换成反向重算,但 stage 边界张量通常仍要保留或重新通信。若 PP 与 ZeRO-3 叠加,重算还可能再次触发参数 all-gather;如果 prefetch 与 release 时机不匹配,理论显存节省会被临时完整参数覆盖。 一个更实用的峰值模型是: $$M_s=M_{\mathrm{params},s}+n_{\mathrm{live},s}M_{\mathrm{act/micro},s}+M_{\mathrm{comm},s}+M_{\mathrm{workspace},s}$$ $s$ 是 stage,$n_{\mathrm{live},s}$ 是该调度下同时存活的 microbatch 数。选切分点的目标应是最小化 $\max_s M_s$ 并平衡每段时间,而不是让每段层数相同。首段 embedding、尾段 vocab projection 和 loss 往往需要单独计量。 6.4 Schedule 的一致性与权重版本 同步 GPipe 或 1F1B 中,一个 global batch 的所有 microbatch 应使用同一版参数,梯度累积后再统一 optimizer step。因此它与非流水同步训练在数学上等价,只改变操作顺序。随机 dropout 若要严格比较,还需保证不同 schedule 消耗一致的随机数流。 异步 pipeline 为减少 flush 可能允许某些 microbatch 使用旧权重,产生 weight staleness。PipeDream 的权重暂存与调度就是为管理这个问题。吞吐更高不等于优化轨迹相同;对需要可复现或大规模预训练的任务,同步 schedule 通常更容易验收。 梯度累积的 loss normalization 也常出错。若每个 microbatch loss 已取 mean,再把 $m$ 份梯度直接相加,最终梯度比全局 mean 大 $m$ 倍;框架可能在 loss、backward 或 optimizer wrapper 某处除 $m$。迁移实现时必须确认缩放发生在哪里,特别是最后一个不完整 microbatch。 6.5 如何系统调优而不是枚举所有组合 第一步做容量约束:根据参数、优化器、激活和临时 buffer,排除会 OOM 的 TP/PP。第二步做整除约束:检查层数、head、KV head、MLP width、词表与 microbatch。第三步按拓扑放组:TP 留在最快域,PP 穿过节点,DP 使用余下副本。第四步才短跑候选方案。 短跑至少记录每个 stage 的 forward/backward 时间、TP collective、PP send/recv、DP collective、bubble、MFU 和峰值显存。若 stage 时间方差大,先重切层;若 collective 裸露,检查异步与 bucket;若 GEMM 利用率低,减少 TP 或增大 microbatch;若 bubble 大,增加 microbatch 或 virtual stage。 还要避免只优化稳态。训练中 checkpoint、评估、数据切换、动态 loss scale 与长短样本混合会改变节拍。视频模型的序列长度可能随分辨率和帧数变化,固定层切分在不同 batch 上会失衡。可以按长度分桶、限制每批 token 数,或使用能处理动态 shape 的 schedule,但都要重新验证 global batch 语义。 6.6 Checkpoint 与并行度变更 TP checkpoint 的一个权重可能沿行或列分片,PP checkpoint 又只在拥有该层的 stage 上出现。保存时应记录全局 shape、分片轴、offset、replica group 与 tied-weight 关系。仅按 rank 存文件却没有布局元数据,会显著增加从 TP=8 改成 TP=4 的恢复难度;若完整掌握原切分约定仍可转换,但必须验证。 成熟 distributed checkpoint 会把逻辑参数名与物理 shard 解耦,加载时重新规划切片。验证转换不能只看“文件读完”,应抽样 all-gather 后与原始全参数比较,并跑一个确定性 forward。optimizer state 也必须按相同参数布局重分片,特别是 Adam 的 m、v 与 FP32 主权重。 PP 的 tied embedding 是典型边界:输入 embedding 在首段,输出投影在尾段,但两者可能共享参数。系统要么在两个 stage 间同步梯度,要么采用明确的复制与更新协议。忽略它会让模型能跑、loss 也下降,却不再是原架构。 最后为每个组合保留机器可读配置:world size、各轴度数、rank 坐标映射、global/micro batch、累积数、schedule、virtual stage、precision 与 checkpoint schema。没有这份清单,性能回归时很难判断是代码变化还是并行布局变化。 6.7 一个具体的 64 卡选型例子 假设 8 个节点、每节点 8 卡,模型单层在 4 卡上能放下,96 层在单节点放不下,目标 global batch 又允许 4 个数据副本。可先试 TP=4、PP=4、DP=4,乘积正好 64。每个节点容纳两个 TP 组,相邻两个节点组成一条四段 pipeline;相同 TP/PP 坐标跨四个副本形成 DP 组。 为什么不直接 TP=8、PP=2、DP=4?它减少 PP 气泡,但本地 GEMM 变小、每层 collective 参与卡数翻倍。为什么不 TP=2、PP=8、DP=4?单层可能放不下,而且 PP 段更多,要求更多 microbatch 才能摊薄气泡。三个方案都满足乘积约束,只有容量、profile 和拓扑能决定赢家。 设 PP=4、microbatch 数 $m=16$,理想气泡为 $3/19=15.79\%$;若为配合 DP=4,global batch 满足 $B_{\mathrm{global}}=B_{\mathrm{micro}}\times16\times4$。当目标 global batch 固定时,microbatch size 可能被压得太小。此时交错 PP 可在不继续增加 $m$ 的情况下缩小气泡,但要多传 stage 边界。 选定后再检查每卡峰值。若尾段词表 head 使 stage 3 明显更慢,可把少量 Transformer 层从尾段移到前段;若 stage 0 embedding 占显存而计算很少,切分目标应同时满足容量与时间,而不是追求参数量绝对相等。 6.8 故障现象与定位路径 若所有 GPU 利用率呈周期性锯齿且空白集中在迭代首尾,优先看 PP bubble;若每层 GEMM 后都有长 NCCL 条带,优先看 TP 通信或 rank 跨节点;若只有某一个 stage 长期满载、其他 stage 等待,是层切分失衡;若迭代末尾集中等待,是 DP 梯度同步没有充分 overlap。 出现 hang 时,先核对各 rank collective 调用序列。条件分支导致某些 rank 少调用一次 all-reduce,或 PP 两端 send/recv shape 不一致,都会永久等待。为通信操作记录 group、sequence number、peer、shape 与 dtype,比只看 Python stack 更有用。设置超时只能让错误更快暴露,不能修复顺序。 数值不一致时,从一个微型模型开始,关闭 dropout 和 fused kernel,分别测试 TP、PP,再测试组合。TP 常见错误是切分轴、bias 重复相加、输出误 gather;PP 常见错误是 loss 缩放、跨段激活 requires-grad、共享参数同步。一次只启用一根并行轴,能把搜索空间从三维降为一维。 OOM 若只发生在第一步,往往是 optimizer state 首次建立或通信 bucket 惰性分配;若在若干步后发生,可能是 graph retention、动态 shape 缓存或碎片;若只在某个 PP stage,先看该段真实 activation 与临时 buffer。不要看到 OOM 就统一减 microbatch,这可能掩盖泄漏却降低所有卡效率。 6.9 上线验收清单 发布配置前确认:世界规模等于各并行轴乘积;每个 rank 坐标唯一;TP group 位于预期高速域;head、KV head、MLP 与词表可整除;各 stage 时间和峰值接近;global batch 算术正确;loss normalization 不依赖 microbatch 数;tied weight 有同步协议;checkpoint 能跨目标并行度恢复。 性能门禁同时保存 tokens/s、MFU、bubble、每类 collective 的裸露时间、峰值显存和最慢 stage。只保存总迭代时间无法解释回归。集群拓扑或通信库升级后,即使模型代码未变,也要重跑基准,因为并行策略本质上是对物理系统的映射。 最后预留降级方案:某节点高速链路异常时能否减少 TP、增加 PP;某个 checkpoint 是否可重分片;global batch 是否仍保持;恢复后数值是否连续。真正稳健的并行配置,不只是峰值最快,也要能在硬件变化和断点恢复时保持语义清楚。 6.10 理论通信量为什么不等于训练时间 同样传 1 GiB,一个大 all-reduce 与数百个小 collective 的耗时不同。常用模型 $T=\alpha n+\beta V$ 中,$n$ 是消息次数,$V$ 是字节量,$\alpha$ 表示每次启动延迟,$\beta$ 表示每字节时间。TP 在每层频繁通信,尤其受 $\alpha$ 影响;PP 消息次数少,但单次边界激活可能很大。 通信是否裸露还取决于依赖。梯度 all-reduce 可与更早层 backward 重叠,PP send 可与下一份本地计算重叠;位于关键路径上的 collective 即使字节少也会直接延长 step。性能报告应区分总 NCCL 时间与 exposed communication time。 bucket 太小会增加消息次数,太大又推迟通信启动,减少 overlap。最优 bucket 与层大小、网络延迟和反向节奏有关。框架默认值是通用折中,不一定适合视频 DiT 的大激活或 MoE 的不均匀参数。 最后还要观察尾延迟。一个 rank 因热降频、ECC、数据抖动或网络拥塞变慢,collective 会让整个组等待。平均 GPU 时间看似健康,最慢 rank 才决定训练。按 rank 记录分位数,并把异常节点与拓扑关联,是大规模并行调优的基本动作。 理论模型最终要由 trace 校准。为每次实验保存并行配置、网络拓扑、逐 stage 时间线与通信矩阵,下一次才能定位回归。若只留一行 tokens/s,既无法判断瓶颈是 GEMM、气泡还是慢 rank,也无法安全迁移到另一代 GPU。并行策略不是模型的附属启动参数,而是计算图和硬件共同组成的一部分,理应像模型结构一样接受版本管理和回归测试。 07. 经典论文脉络 GPipe(arXiv:1811.06965):用 microbatch 流水化跨加速器的模型分段,并以同步 mini-batch 语义训练巨型网络。 PipeDream(arXiv:1806.03377):探索 1F1B 与异步流水,揭示吞吐、权重版本和一致性之间的权衡。 Megatron-LM(arXiv:1909.08053):提出 Transformer 内高效的 tensor model parallel 切法,用少量 collective 支撑数十亿参数。 Efficient Large-Scale Language Model Training(arXiv:2104.04473):系统组合 TP、PP、DP,并以交错流水减少气泡,扩展到千卡与万亿参数。 论文演进说明:单一并行轴只能解决一种容量瓶颈,规模继续增长后,真正的问题变成如何把多个轴映射到硬件拓扑并共同调度。 08. 常见误解 误解一:TP 就是把每层平均切开。 切分轴决定通信。Megatron 的 column-row 配对是为了让中间分片直接衔接,不是机械地切一半权重。 误解二:PP 段数越多,显存越省且速度越快。 参数容量会下降,但固定气泡随 $p-1$ 增长;若 microbatch 不够,更多 stage 反而更闲。 误解三:microbatch 越多越好。 它降低理想气泡,却减小 GEMM、增加调度,并可能扩大激活队列。要联动测 MFU 与显存。 误解四:1F1B 是异步优化。 常用同步 1F1B 只是改变前后向顺序,仍在一个 global batch 梯度完成后统一更新;PipeDream 式异步才涉及权重陈旧。 误解五:TP 能把所有显存除以 TP 度。 小参数、复制激活、通信 buffer 与 runtime 不会理想均分。必须看逐项账本。 误解六:三维并行度乘起来等于卡数就配置正确。 整除只是必要条件。拓扑、矩阵 tile、head 数、stage 均衡、global batch 都可能让配置不可用。 09. 动手验证 先运行 tp_linear_sim.py,把 TP 从 2 改成能整除维度的 3,重新切 $W_1$ 的输出与 $W_2$ 的输入。预期完整输出仍一致。然后故意让第二层 shard 顺序交换,结果会静默错误;这说明 distributed tensor layout 必须携带明确语义。 运行 pipeline_bubble.py,固定 stages=8,分别取 microbatches=1、8、32、72。理论效率依次为 $1/8$、$8/15$、$32/39$、$72/79$。脚本当前只实现均衡 stage 的闭式公式;扩展成事件调度模拟后,再给每个 stage 设置不同时间,以最慢 stage 为节拍比较,观察均分层数为何不等于均分时间。 在真实集群做 TP=1/2/4/8 对照,固定 global batch 和模型,记录每层 GEMM 时间、collective 时间、MFU、峰值显存。预期早期 TP 能解除容量或提高总吞吐,超过某点后小 GEMM 和通信使收益反转。用拓扑工具确认 TP rank 是否真的落在 NVLink 域内。 对 PP 做相同实验:固定 PP 度,逐步增加 microbatch 数;再固定 microbatch,增加 virtual stage。记录 bubble、激活峰值与端到端 tokens/s。不要只看 framework 打印的理论 bubble,GPU timeline 中的空白才是真实气泡。 最后做一次等价性验收:单卡、TP、PP、TP+PP 使用相同初始化和样本,关闭 dropout,比较一个 step 的 loss 和若干参数梯度。低精度与归约顺序会造成小差异,但若误差随层爆炸,优先检查 shard 顺序、bias、loss 归一化与 tied weight。 10. 延伸阅读 读完这篇可以继续看: 数据并行与 ZeRO 显存切分:DP 沿 batch 复制计算、ZeRO 沿 DP 组切状态,是三维并行的第一根轴(已发布)。 序列并行与 Ring Attention:当瓶颈从模型宽度转向超长 token,沿 sequence 切激活与 attention(本文系列下一篇)。 混合精度与数值稳定性:低精度改变 TP/PP 通信字节与归约误差,配置并行前要先明确累加精度(本文系列上一篇)。 选型时先问容量瓶颈在哪里:单层太宽选 TP,层总数太深选 PP,副本吞吐选 DP,超长激活选 SP。随后才是把这些轴映射到实际互联。公式给出上限,profile 决定最终配置。 附录:完整代码 09 节用到的脚本全文如下(tp_linear_sim.py、pipeline_bubble.py、make_figures.py)。复制到本地存成同名文件,按各脚本开头的依赖说明准备环境后即可运行。 tp_linear_sim.py #!/usr/bin/env python3 """Verify column- and row-parallel linear algebra without any framework.""" def matmul(a, b): return [[sum(x * y for x, y in zip(row, col)) for col in zip(*b)] for row in a] def split_columns(a, parts): width = len(a[0]) // parts return [[row[i * width:(i + 1) * width] for row in a] for i in range(parts)] def split_rows(a, parts): height = len(a) // parts return [a[i * height:(i + 1) * height] for i in range(parts)] def add(a, b): return [[x + y for x, y in zip(ra, rb)] for ra, rb in zip(a, b)] x = [[1, 2, 3, 4], [5, 6, 7, 8]] # [tokens=2, hidden=4] w1 = [[1, 0, 2, 0, 3, 0], [0, 1, 0, 2, 0, 3], [1, 1, 1, 1, 1, 1], [2, 1, 0, 1, 2, 1]] # [4, 6] w2 = [[1, 0, 1], [0, 1, 1], [1, 1, 0], [2, 0, 1], [0, 2, 1], [1, 0, 2]] # [6, 3] full_hidden = matmul(x, w1) full_output = matmul(full_hidden, w2) # Column parallel W1: every rank computes a slice of output features. w1_shards = split_columns(w1, 2) hidden_shards = [matmul(x, shard) for shard in w1_shards] column_joined = [left + right for left, right in zip(*hidden_shards)] # Row parallel W2: input features and W2 rows use matching shards, then sum. w2_shards = split_rows(w2, 2) partials = [matmul(h, w) for h, w in zip(hidden_shards, w2_shards)] row_reduced = add(partials[0], partials[1]) max_hidden_diff = max(abs(a - b) for ra, rb in zip(full_hidden, column_joined) for a, b in zip(ra, rb)) max_output_diff = max(abs(a - b) for ra, rb in zip(full_output, row_reduced) for a, b in zip(ra, rb)) print("X shape=(2, 4), W1 shape=(4, 6), W2 shape=(6, 3), tp=2") print("column shards: W1=(4, 3) each, hidden=(2, 3) each") print("row shards: W2=(3, 3) each, partial output=(2, 3) each") print(f"full output={full_output}") print(f"max hidden diff={max_hidden_diff}, max output diff={max_output_diff}") pipeline_bubble.py #!/usr/bin/env python3 """Idealized GPipe bubble calculator; stdlib only.""" import argparse parser = argparse.ArgumentParser() parser.add_argument("--stages", type=int, default=4) parser.add_argument("--microbatches", type=int, default=8) args = parser.parse_args() if args.stages < 1 or args.microbatches < 1: parser.error("stages and microbatches must be positive") p, m = args.stages, args.microbatches slots = m + p - 1 efficiency = m / slots print(f"stages={p}, microbatches={m}, ideal_slots_per_sweep={slots}") print(f"pipeline_efficiency={efficiency:.2%}, bubble_fraction={1-efficiency:.2%}") print("forward schedule (slot -> active stage:microbatch)") for t in range(slots): active = [f"S{s}:M{t-s}" for s in range(p) if 0 <= t - s < m] print(f"{t:02d}: " + " ".join(active)) make_figures.py """Regenerate this article's deterministic teaching figure (numpy + matplotlib).""" from pathlib import Path import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt import numpy as np OUT=Path(__file__).resolve().parents[1]/"figures" OUT.mkdir(exist_ok=True) plt.rcParams.update({"font.sans-serif":["PingFang SC","Arial Unicode MS","DejaVu Sans"],"axes.unicode_minus":False}) m=np.arange(1,129) fig,ax=plt.subplots(figsize=(8,4.8)) for p in [2,4,8,16]:ax.plot(m,m/(m+p-1),label=f"{p} stages") ax.set(xlabel="Microbatches per global batch",ylabel="Ideal utilization",ylim=(0,1.02),title="Balanced synchronous pipeline: m / (m + p - 1)") ax.legend();ax.grid(alpha=.25);fig.tight_layout() fig.savefig(OUT/'pipeline_utilization.png',dpi=170) plt.close(fig) print(OUT/'pipeline_utilization.png') 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月05日
5 阅读
0 评论
0 点赞
2026-09-05
AIGC 基本功|混合精度与数值稳定性-AMP
混合精度与数值稳定性 所属方向:分布式训练 | 难度:进阶 | 前置知识:无 关键词:混合精度、FP16、BF16、FP8、loss scaling、溢出、数值稳定 01. 为什么需要它 同一份训练代码,把 BF16 改成 FP16,吞吐可能更高,也可能几十步后 loss 直接变成 NaN。另一个常见现场是:模型看起来正常收敛,但某些参数长期没有变化;检查梯度才发现,一些绝对值不超过 $2^{-25}\approx2.98\times10^{-8}$ 的梯度在 round-to-nearest-even 写回 FP16 时已经变成了 0。 这不是“半精度不准”一句话能解释的。训练里的风险至少有三种:数太大,超过格式的最大有限值而溢出成 inf;数太小,舍入后落到 0(或硬件将次正规数 flush-to-zero);数虽然在范围内,却因为有效位太少,在加法里被大数吞掉。三者的修复手段不同:loss scaling 能救小梯度,却救不了激活溢出;换 BF16 能扩展动态范围,却不会自动改善尾数精度;把归约留在 FP32 能减小累加误差,却不代表所有输入和权重都要回到 FP32。 为什么还要承担这些麻烦?因为 Transformer 的大头通常是矩阵乘。现代加速器对低精度矩阵乘提供更高吞吐,权重和激活每元素从 4 字节降到 2 字节也能减小显存与带宽压力。Mixed Precision Training 给出的核心配方是:低精度做大部分前后向,保留 FP32 主权重进行更新,并对 loss 缩放以防小梯度消失;其模型显存可接近减半,同时保持精度。 “混合”的重点不是选一个统一 dtype,而是给不同数值角色分工。大 GEMM 适合低精度输入,softmax、归一化、loss 和长归约通常需要更大的范围或更高精度,优化器状态又有自己的要求。AMP 的价值正是把逐算子的 dtype 路由表和梯度缩放流程标准化。 一个数字能说明 FP16 与 BF16 的性格差异:FP16 最大有限值只有 65504,而 BF16 与 FP32 一样有 8 位指数,最大值约 $3.39\times10^{38}$。反过来,FP16 有 10 位小数尾数,1 附近的间隔约 $9.77\times10^{-4}$;BF16 只有 7 位尾数,间隔约 $7.81\times10^{-3}$。BF16 更不容易炸,FP16 在可表示范围内更细;“更稳定”与“更精确”不是同一维度。 02. 最小可用理解 三句话先建立框架: AMP 让适合 Tensor Core 的矩阵乘使用 FP16/BF16,让 softmax、归约等敏感算子保留 FP32,而不是粗暴地把整个模型全部转成 half。 FP16 训练通常用 loss scale $S$ 把反向梯度整体放大,更新前再除回去;发现 inf/NaN 时跳过这一步并缩小 $S$。 BF16 动态范围接近 FP32,通常不需要 GradScaler,但尾数更短;FP8 则必须进一步管理张量尺度、绝对最大值历史和累加精度。 如果只记一个检查顺序:先问异常发生在前向还是反向,再区分 overflow、underflow 与 rounding,最后才决定换 dtype、调 scale,还是把局部算子提升到 FP32。 AMP 中常见的四种角色也要分开:参数存储 dtype、算子输入 dtype、乘法累加 dtype、优化器状态 dtype。日志打印“BF16 training”并不能证明四者都是 BF16。很多 GEMM 是 BF16 输入、FP32 累加;Adam 的一阶矩和二阶矩仍为 FP32;某些框架还会保存 FP32 主权重。 03. 数学推导 3.1 浮点数到底牺牲了什么 对非零正规数,一个二进制浮点数可写成(次正规数没有隐含的前导 1): $$x=(-1)^s(1.f)_2\,2^{e-\mathrm{bias}}$$ $s$ 是符号位,$e$ 是指数域,$f$ 是小数域。指数位数决定动态范围,尾数位数决定相邻可表示数的间距。FP16 是 1 位符号、5 位指数、10 位小数;BF16 是 1、8、7;FP32 是 1、8、23。于是: FP16:最小正规数 $2^{-14}=6.1035\times10^{-5}$,最小次正规数 $2^{-24}=5.9605\times10^{-8}$,最大有限值 65504; BF16:最小正规数 $2^{-126}\approx1.1755\times10^{-38}$,最大有限值约 $3.3895\times10^{38}$; FP32:动态范围与 BF16 同阶,但 23 位小数显著降低舍入误差。 机器 epsilon 是 1 与下一个可表示数的间隔;下面列的是 epsilon。在 round-to-nearest 模式下,通常定义的 unit roundoff 为这些值的一半: $$\epsilon_{\mathrm{FP16}}=2^{-10},\qquad \epsilon_{\mathrm{BF16}}=2^{-7},\qquad \epsilon_{\mathrm{FP32}}=2^{-23}$$ 因此 $1+10^{-4}$ 写入 FP16 或 BF16 都可能仍是 1。更危险的是参数更新:若权重 $w=1$,学习率乘梯度只有 $10^{-5}$,直接在低精度权重上做 $w-\eta g$,变化会被舍掉。FP32 主权重就是在高精度副本上累计细小更新,再把结果舍入给低精度前后向。 在 round-to-nearest-even 且保留次正规数时,绝对值不超过 $2^{-25}$ 的 FP16 输入舍入为零;介于这个阈值和 $2^{-24}$ 之间的数可能舍入为最小次正规数,而非一律为零。支持 flush-to-zero 的执行路径还需另查硬件与算子规则。 3.2 为什么 loss scaling 不改梯度 设损失为 $L(\theta)$,参数为 $\theta$,真实梯度为 $g=\nabla_\theta L$。把 loss 乘常数 $S$ 后反向: $$g_s=\nabla_\theta(SL)=S\nabla_\theta L=Sg$$ 只要在优化器读取梯度前除以 $S$,就恢复原梯度: $$g=\frac{g_s}{S}$$ 关键是量化顺序。若 $g=10^{-8}$,先写入 FP16 会变 0,之后再乘任何数都救不回来;若先由链式法则得到 $Sg=1.024\times10^{-5}$,它能被 FP16 表示,写回后再用 FP32 除以 1024,就能保留接近 $10^{-8}$ 的非零值。 静态 scale 要人工选 $S$。太小救不了下溢,太大又会让大梯度超过 65504。动态 GradScaler 维护随训练变化的 $S_t$: $$S_{t+1}=\begin{cases}\beta S_t,&g_s\text{ 含 inf/NaN}\\ \gamma S_t,&\text{连续 }K\text{ 步有限}\\ S_t,&\text{其他情况}\end{cases}$$ $\beta<1$ 是回退因子,$\gamma>1$ 是增长因子,$K$ 是增长间隔。出现非有限梯度时必须跳过 optimizer step,否则坏更新会污染权重和 Adam 状态。PyTorch 文档还提醒:scale 不保证始终大于 1,BF16 预训练模型强转 FP16 时可能因数值过大而一路回退。 3.3 为什么 softmax 和归约容易出事 直接计算 softmax: $$p_i=\frac{e^{x_i}}{\sum_j e^{x_j}}$$ 若 $x_i$ 很大,指数会溢出。稳定写法先减最大值 $m=\max_jx_j$: $$p_i=\frac{e^{x_i-m}}{\sum_j e^{x_j-m}}$$ 这样最大指数为 1,不改变结果,却压下溢出风险。LayerNorm 方差也不宜用 $E[x^2]-E[x]^2$ 的低精度朴素形式:两个接近的大数相减会灾难性消减。长向量求和误差还会随项数累积,因此 AMP 通常让归约在 FP32 完成。 还要区分“算子输出 dtype”和“内部累加 dtype”。矩阵乘输入、输出可以是 BF16,但硬件乘积常进入 FP32 accumulator,最终再舍入回 BF16。若自定义 kernel 把 accumulator 也降成 16 位,它不再与常规 AMP 拥有同样数值性质。 3.4 FP8 为什么不只是再少 8 位 FP8 常见 E4M3 与 E5M2。FP8 Formats for Deep Learning 用 E4M3 提供较多有效位,用 E5M2 提供较大范围。原始张量很难恰好落进狭窄范围,通常给每个张量或块维护尺度 $a$: $$q=Q_{\mathrm{FP8}}(x/a),\qquad x_{\mathrm{deq}}=a\,q$$ 尺度可由绝对最大值 amax 与格式上限估计。若每步都同步全局 amax,又会引入开销;工业实现会用历史窗口、延迟缩放或块缩放。FP8 的正确性同时依赖格式、粒度、尺度更新、异常值分布和高精度累加,不能机械替换 dtype 字符串。 直接量化的相对误差。小数值端 FP16 可能舍入为零(相对误差 1),超过最大有限值后溢出;BF16 的范围更宽,但正规数的尾数精度更低。精确可表示点的误差为零,图中作绘图下限处理。 04. 代码实现 两个脚本都只依赖 Python 标准库。float_formats.py 用 IEEE 二进制打包模拟 FP16,并先按舍入位加偏置,再截去 FP32 低 16 位,实现 BF16 round-to-nearest-even。真实输出: format exp frac min_normal max_finite epsilon_at_1 FP16 5 10 6.1035e-05 6.5504e+04 9.7656e-04 BF16 8 7 1.1755e-38 3.3895e+38 7.8125e-03 FP32 8 23 1.1755e-38 3.4028e+38 1.1921e-07 value -> FP16 | BF16 1.0001 -> 1 | 1 1e-05 -> 1.00136e-05 | 1.00136e-05 100000 -> inf | 99840 100000 在 FP16 变成 inf,在 BF16 仍有限;1.0001 在两种 16 位格式里都舍入成 1。动态范围与精度的区别由此可见。 loss_scaling_sim.py 把五个小梯度直接量化,再先乘 1024、量化、最后除回去: shape=(5,), loss_scale=1024 gradient direct_fp16 scaled_fp16/unscaled 1.000e-08 0.000e+00 1.001e-08 3.000e-08 5.960e-08 2.998e-08 1.000e-07 1.192e-07 1.000e-07 1.000e-06 1.013e-06 1.000e-06 1.000e-05 1.001e-05 9.999e-06 nonzero: direct=4/5, scaled=5/5 $10^{-8}$ 直接写 FP16 已为 0,缩放路径却保留为 $1.001\times10^{-8}$。这不是凭空增加精度:量化误差仍在,只是把数搬进可表示区间。 真实 PyTorch CUDA 训练的核心顺序: scaler = torch.amp.GradScaler("cuda") for inputs, targets in loader: optimizer.zero_grad(set_to_none=True) with torch.autocast("cuda", dtype=torch.float16): loss = loss_fn(model(inputs), targets) scaler.scale(loss).backward() scaler.unscale_(optimizer) torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) scaler.step(optimizer) scaler.update() 梯度裁剪必须在 unscale 之后,若对放大后的梯度仍用阈值 C 裁剪,反缩放后的有效阈值会变成 C/S。若用 BF16,通常保留 autocast 而不用 GradScaler;是否省略仍应由实际梯度分布验证。 05. 工业级实现对照 以 2026-09 的实现为准,PyTorch 的 torch/amp/grad_scaler.py 中 GradScaler.scale 把 loss 乘当前尺度;unscale 按 device 与 dtype 分组检查并反缩放梯度;step 只在没有 inf/NaN 时调用优化器;update 再根据各 optimizer 的 found-inf 状态调整尺度。它还处理稀疏梯度、多设备、多优化器、checkpoint state dict 和惰性初始化,这些都是最小模拟没有覆盖的工程边界。 官方 AMP 文档 当前推荐统一使用 torch.autocast 与 torch.amp.GradScaler;旧的 torch.cuda.amp 接口已标记弃用。autocast 只包前向和 loss,backward 放在上下文外。不要启用 autocast 后再全局 model.half,否则会绕开逐算子的安全策略。 算子策略不是“白名单里全降精度”。线性层、卷积通常进入 lower-precision;softmax、部分 loss 和归约倾向 FP32;多输入算子可能提升到最宽输入类型。显式 dtype、原地算子或 out 版本可能不参与 autocast,自定义代码要检查实际 dtype 流。 FP8 方面,NVIDIA Transformer Engine 提供 E4M3/E5M2 recipe、amax 历史与 delayed scaling,并在支持硬件上让 Transformer 层进入 FP8 路径。它仍以 BF16/FP16 保存部分张量并用高精度累加;分布式训练还可能跨 rank 归约 amax。“开启 FP8”是引入量化运行时,不是把参数永久存成单一 8 位格式。 生产监控至少记录当前 scale、增长和回退次数、跳过的 step 数、梯度范数、参数与激活 amax、NaN 首次出现的层、关键算子 dtype。只看总 loss 会把静默下溢藏很久。 06. 代价与边界 混合精度通常节省权重、梯度和激活带宽,但不保证总显存恰好减半。Adam 的 FP32 主权重与两个 moment 仍可能占 12 字节/参数;部分算子保存 FP32 中间量;通信 buffer、cast buffer、workspace 与碎片也增加峰值。 吞吐提升也有条件。矩阵尺寸太小、CPU 或数据加载受限、频繁转换、未使用低精度加速单元,都会让 AMP 几乎不加速。小 batch 下,kernel launch 与 cast 成本甚至抵消收益。正确基准应同时报告 tokens/s、峰值显存、收敛曲线和最终指标。 以下情况尤其要谨慎: 模型源自 BF16 预训练且激活常超过 65504,FP16 loss scaling 只能处理梯度,救不了前向溢出; 长归约、概率、指数、对数、方差或很小正则项的自定义算子没有 autocast 策略; 梯度累积时各 microbatch 使用不同 scale,或反缩放前裁剪梯度; 多 optimizer 共用计算图,却在所有梯度就绪前更新 scale; FP8 中异常值主导 amax,张量级缩放让普通值量化过粗,需要块缩放或高精度旁路。 调试时先用 FP32 建立可复现基线,再开 BF16,然后才是 FP16/FP8。每步只改一个变量,并比较前若干 step 的 loss、梯度范数和权重更新。数值问题最怕同时调整学习率、并行度、batch 与 dtype。 6.1 一次更新里究竟有哪些精度 以 AdamW 为例,一次更新至少涉及前向激活、反向梯度、参数、副本和两个动量。低精度 GEMM 只覆盖其中一部分。设低精度参数为 $\theta_{16}$,FP32 主参数为 $\theta_{32}$,反缩放后的梯度为 $g_{32}$,则更新链条可以写成: $$\theta_{32}^{t+1}=\operatorname{AdamW}(\theta_{32}^{t},g_{32}^{t},m_t,v_t),\qquad \theta_{16}^{t+1}=Q_{16}(\theta_{32}^{t+1})$$ $m_t,v_t$ 是 FP32 一阶、二阶矩,$Q_{16}$ 表示舍入到前后向 dtype。若框架没有主参数副本,而直接更新 BF16 参数,许多小于当前参数 ULP 的更新会消失。是否保留主权重是优化器实现细节,不能仅从模型参数 dtype 推断。 梯度累积又多一层顺序。假设一个 optimizer step 包含 $A$ 个 microbatch,它们必须使用同一 scale $S$,先把已缩放梯度累加: $$g_s=\sum_{a=1}^{A}Sg_a=S\sum_{a=1}^{A}g_a$$ 等所有 microbatch 完成后只反缩放一次。若中途 update scale,累加 buffer 中不同 microbatch 带有不同倍数,最后无法用一个 $S$ 恢复。若某个 microbatch 产生 inf,这一整个 optimizer step 都应跳过,而不是只丢掉坏 microbatch,否则有效 batch 和采样权重已变化。 6.2 分布式训练里的非有限值共识 数据并行中,每个 rank 只看到本地样本。rank 3 出现 inf 而其他 rank 有限时,所有副本仍必须对“是否更新”达成一致;否则 rank 3 跳步、其余 rank 更新,参数立即分叉。工业 GradScaler 会把 found-inf 状态跨相关设备和优化器汇总,分布式封装还需确保所有 DP rank 做相同决策。 梯度裁剪也有全局语义。ZeRO/FSDP 把梯度分片后,每卡只能算局部平方和: $$\|g\|_2=\sqrt{\sum_{r=0}^{P-1}\sum_{i\in\mathcal{S}_r}g_i^2}$$ 必须 all-reduce 局部平方和才能得到全局范数。正确顺序通常是:完成梯度同步,反缩放,检查非有限值,计算全局 norm,裁剪,执行 optimizer step,最后更新 scale。任一步调换都可能让“裁剪阈值 1.0”失去原含义。 混合精度还会改变 collective 的数值误差。BF16 梯度 all-reduce 比 FP32 少一半字节,但不同归约树改变加法顺序;卡数越多、梯度尺度跨度越大,末位差异越明显。若训练对归约误差敏感,可使用 FP32 梯度通信或分块高精度累加,但要接受带宽代价。排查时应分开比较“本地梯度生成精度”与“跨 rank 归约精度”。 6.3 一张可执行的 dtype 选型表 选 FP16 还是 BF16,不应只看硬件宣传峰值。可按四步判断: 第一,确认硬件原生路径。某些设备对 BF16 与 FP16 吞吐相同,某些旧设备没有 BF16 Tensor Core;软件模拟 BF16 可能更慢。第二,检查模型来源。BF16 预训练 checkpoint 的激活范围未必适合 FP16,直接转换容易前向溢出。第三,检查数值敏感区域。softmax、归一化、概率 loss、长归约优先保留 FP32。第四,跑短程 A/B,比较吞吐、峰值、跳步率和收敛,而非只确认“能启动”。 可以把训练方案分成四档: FP32 基线:最慢但诊断最清晰,用于建立 loss 与梯度参照; BF16 AMP:大范围、无需常规 loss scaling,是现代大模型训练的常见起点; FP16 AMP:尾数稍细,但指数窄,必须认真监控动态 scaling 与前向溢出; FP8 混合精度:只把适合的 GEMM 张量降到 FP8,保留 16/32 位旁路,并维护尺度元数据。 所谓“纯 BF16”或“纯 FP8”常是营销简写。softmax、norm statistic、optimizer state、某些 residual 累加和 master gradient 仍可能更高精度。真正有意义的配置描述,应列出 input、weight、output、accumulator 和 optimizer 五个维度。 6.4 从第一个 NaN 反推根因 排查顺序应尽量靠近异常源。先在每个模块前后记录有限值比例、绝对最大值、绝对非零最小值与 dtype;找到第一个从有限变非有限的边界。若 attention score 在 softmax 前已经 inf,检查 Q/K 范数、缩放因子与位置编码;若 loss 有限而 backward 首先 inf,检查导数奇点、自定义 backward 和 loss scale;若梯度有限但 step 后参数异常,检查 optimizer state、权重衰减和反缩放顺序。 静默下溢比 NaN 更难发现。建议记录零梯度比例,并按参数组看更新比率: $$r_{\mathrm{update}}=\frac{\|\Delta\theta\|_2}{\|\theta\|_2+\varepsilon}$$ 若某些层长期为 0,而 FP32 基线非零,说明低精度存储或 scale 窗口吞掉了更新。若所有层的比例突然增大,则更像学习率、loss normalization 或跳步恢复后的 scale 问题。 不要看到 NaN 就立即降低学习率。学习率过大确实可能导致发散,但 dtype overflow、错误 mask 产生全负无穷、空 batch 的除零、坏数据和通信错误都可能表现为同一个 NaN。先定位首次非有限张量,才能选择对应修复。 6.5 Checkpoint、编译与自定义算子的坑 恢复训练时必须保存 GradScaler 状态。若只恢复模型和 optimizer,却把 scale 重置为很大初值,前几步可能反复溢出并被跳过;重置太小则产生额外下溢。保存点最好位于完整 optimizer step 之后,避免记录到一半累积的混合状态。 activation checkpoint 会在 backward 重跑前向。重算必须进入与原前向一致的 autocast 上下文,否则保存路径是 BF16、重算路径变 FP32 或 FP16,梯度对不上。torch.compile、CUDA Graph 和 fused optimizer 还可能改变 autocast 边界或引入 CPU-GPU 同步,升级版本后要重新做数值与性能回归。 自定义 autograd Function 不能假定输入永远 FP32。前向若内部要求 FP32,应显式关闭 autocast 并转换输入;反向要返回与调用约定兼容的梯度。写自定义 CUDA kernel 时,明确 accumulator 类型、饱和或 inf 行为、次正规数处理以及随机舍入。一个算子“支持 half”只代表能执行,不代表适合训练。 最后,评估数值稳定不能只跑几十步。动态 scale 的增长周期可能是数千步,某些罕见 batch 才触发极端值。至少保留一次覆盖学习率峰值、warmup 结束和验证阶段的长程对照,并把跳步数作为训练产物记录;否则断点续训后出现指标差异,很难追溯是数据还是精度状态造成。 6.6 性能基准该怎样设计 AMP 基准至少要有三次 warmup 与多次稳定迭代,计时前后做设备同步;否则异步 kernel 会让 CPU 提交时间冒充 GPU 执行时间。显存要同时报告 allocated 与 reserved 峰值,前者是活跃张量,后者包含分配器缓存。对比方案必须使用同一 batch、相同梯度累积与相同 checkpoint 策略。 吞吐最好报告有效 token/s,而不是 batch/s。变长序列下,一个 batch 的 padding 比例不同,batch/s 会误导。质量侧至少比较训练 loss、验证指标、梯度范数和被跳过 step 数。若 AMP 每秒更快却需要更多 step 才到相同验证指标,最终 time-to-quality 未必更优。 对 FP8 还应增加量化覆盖率:多少 GEMM 真正走 FP8,多少因 shape、算子或 recipe 回退到 BF16;记录每层 amax、饱和比例和 scale 更新。仅看配置显示 FP8 无法证明加速路径被命中。kernel trace 能确认实际指令与 cast 开销。 建立门禁时,不必要求低精度与 FP32 每步完全相同。可先规定前 100 步 loss 相对误差、梯度 cosine、最终指标容差与最大跳步率,再用多个随机种子评估。数值差异是浮点并行的正常现象,持续偏向、层级爆炸或指标显著退化才是故障信号。 6.7 一份上线前检查清单 上线前逐项回答:硬件是否原生支持目标 dtype;矩阵尺寸是否对齐加速 tile;敏感算子是否保持 FP32;FP16 是否启用动态 scaling;裁剪是否在 unscale 后;所有 DP rank 是否共享跳步决策;梯度累积期间 scale 是否不变;checkpoint 是否保存 scaler;自定义算子是否声明 autocast 与 accumulator;监控是否能定位第一处非有限值。 然后做三个故障注入。人为把 scale 调得极大,确认系统发现 inf、跳过更新并回退;给输入加入一个幅值异常样本,确认前向监控能定位层;从 checkpoint 恢复,确认 scale、optimizer 与随机数状态连续。没有做过故障注入的告警,往往只在真正长跑失败后才发现无效。 最后保留 FP32 或 BF16 安全开关。生产训练发生异常时,能在不改数据顺序和并行布局的条件下提升精度复现,定位效率远高于临时改一堆超参。安全路径不一定长期运行,但必须定期测试,避免代码演进后早已失效。 这些流程看似比设置一个 autocast 开关繁琐,却能把“偶尔 NaN”“换卡就掉点”“断点后不收敛”变成有指标、有复现实验、有回退方案的普通工程问题。 6.8 如何判断变化来自精度而不是随机性 一次训练 A 比 B 的 loss 高,并不能证明精度方案更差。数据顺序、dropout、并行归约顺序和非确定 kernel 都会制造波动。公平实验要固定数据索引与初始化,尽可能使用确定算法,并运行多个随机种子。先比较同一步同一层的输出、梯度与更新,再比较长程最终指标。 可用 FP32 输出 $y_{32}$ 作为局部参照,计算相对误差与余弦相似度: $$e_{\mathrm{rel}}=\frac{\|y_{\mathrm{low}}-y_{32}\|_2}{\|y_{32}\|_2+\varepsilon}$$ 单层误差略大未必影响训练,但若误差沿深度单调放大,往往说明 residual 累加、归一化或某个敏感算子精度不足。把统计按层绘制比只比较最终 logits 更容易定位。 还应区分可复现性与正确性。集合通信改变加法顺序后,bitwise 结果可能不同,但两条训练曲线仍落在相同统计分布。反之,两次运行逐位一致也可能稳定地实现了错误缩放。验收既要有小规模数学 oracle,也要有多种子任务指标。 混合精度上线后,持续监控跳步比例和 scale 分布。数据配方变化、序列变长、加入新 loss 或更换初始化,都可能改变数值范围;一次验证通过不意味着未来配置永久安全。把 precision 当成模型配置的一部分进行版本化,才能复现每次训练。 一个实用原则是把所有隐式转换显式化到观测层:训练启动时抽样打印关键模块的参数、输入、输出与归约 dtype,同时保存硬件、驱动、框架版本。低精度 kernel 与 autocast 策略会随版本更新,旧实验结论不能无条件外推。版本升级后的第一件事应是重跑短程数值基线与吞吐基线,而不是直接续跑昂贵训练。这样才能知道速度变化来自 kernel,精度变化来自策略,还是数据本身发生了变化。 还应把这些元数据写进 checkpoint 清单,使恢复任务能够拒绝不兼容的精度配置,而不是在数小时后以 NaN 形式暴露。可诊断性本身就是混合精度系统的一项能力。 07. 经典论文脉络 Mixed Precision Training(arXiv:1710.03740):提出低精度前后向、FP32 主权重与 loss scaling,奠定现代 AMP。 A Study of BFLOAT16 for Deep Learning Training(arXiv:1905.12322):说明 BF16 用 FP32 相同指数范围换取更短尾数,使训练更少依赖 loss scaling。 FP8 Formats for Deep Learning(arXiv:2209.05433):提出 E4M3/E5M2 两种互补编码,并在大模型训练中验证 8 位浮点路径。 FP8-LM(arXiv:2310.18313):处理 FP8 大语言模型训练的精度、通信与优化器环节,说明端到端 FP8 不只是替换 GEMM dtype。 共同主题是:硬件格式越窄,软件越需要知道张量的数值角色。格式提供可能性,尺度管理、累加方式和回退路径才决定能否稳定训练。 08. 常见误解 误解一:BF16 比 FP16 精度更高。 BF16 指数范围更大,更少 overflow;但尾数只有 7 位,1 附近分辨率更粗。应说通常更稳定,不是处处更精确。 误解二:loss scaling 能修复所有 NaN。 它主要防 FP16 小梯度下溢。前向激活溢出、除零、softmax 不稳定、学习率过大,都不会被它根治。 误解三:scale 越大越好,而且一定大于 1。 scale 太大会溢出。PyTorch 允许动态 scale 降到 1 以下;应观察 found-inf 和跳步频率。 误解四:用了 autocast 就无需关心 dtype。 自定义算子、显式 dtype、原地运算和策略表外 op 可能保持输入 dtype。关键归约与 loss 仍需审计。 误解五:AMP 会把训练显存直接砍半。 激活可能下降,FP32 优化器状态仍在。账本还包括梯度、通信 buffer、workspace 与碎片。 误解六:FP8 是 BF16 的无痛升级。 FP8 依赖尺度、amax 历史、格式选择和硬件 kernel;错误配置可能不 NaN,却悄悄降低收敛质量。 09. 动手验证 先运行文末脚本,修改 loss_scaling_sim.py 中 scale 为 1、128、1024、65536。预期 scale 变大时更多微小梯度被保留;继续增大并加入大梯度后会触发 FP16 inf。这正是动态 scale 在 underflow 与 overflow 之间寻找窗口的原因。 在支持 BF16/FP16 的 GPU 上做四组短跑:FP32、BF16 autocast、FP16 autocast 不带 scaler、FP16 autocast 带 scaler。固定随机种子和 batch,记录 200 步吞吐、峰值显存、loss、全局梯度范数、跳步数。预期 FP16 无 scaler 最容易出现零梯度;BF16 与 FP16 加 scaler 更接近 FP32,但结论取决于模型分布。 定位首个异常层时,给模块注册 hook,输出有限值比例、绝对最大值和 dtype。若前向先出现 inf,优先检查指数、归一化、attention score 与输入范围;若反向先异常,再检查 scale、梯度裁剪顺序和自定义 backward。 最后验证累加精度:构造一个大数和大量小数的向量,用 FP32、模拟 BF16 顺序累加、分块 FP32 累加分别求和。预期低精度顺序加法吞掉更多小项;这解释为什么 GEMM 输入低精度不等于 accumulator 也该低精度。 10. 延伸阅读 读完这篇可以继续看: 量化:从 INT8 到 FP4:区分训练混合精度与推理量化的目标、校准和误差模型(还没写)。 数据并行与 ZeRO 显存切分:混合精度改变每项状态字节数,ZeRO 决定状态在哪些 rank 上复制或分片(已发布)。 张量并行与流水线并行:低精度减少通信字节,但集合通信次数、拓扑与同步点仍由并行策略决定(本文系列下一篇)。 可靠的 AMP 心智模型不是“半精度开关”,而是一张数值预算表:每个张量需要多大范围、多少有效位,在何处累加、何时舍入、出现异常如何回退。把这张表画清楚,NaN 就从玄学变成可以定位的工程问题。 附录:完整代码 09 节用到的脚本全文如下(float_formats.py、loss_scaling_sim.py、make_figures.py)。复制到本地存成同名文件,按各脚本开头的依赖说明准备环境后即可运行。 float_formats.py #!/usr/bin/env python3 """Only the Python standard library is required.""" import math import struct def fp16(x: float) -> float: try: return struct.unpack("e", struct.pack("e", x))[0] except OverflowError: return math.copysign(math.inf, x) def bf16(x: float) -> float: """Round an IEEE FP32 value to BF16, ties-to-even, then widen for printing.""" bits = struct.unpack(">I", struct.pack(">f", x))[0] if (bits & 0x7F800000) != 0x7F800000: bits += 0x7FFF + ((bits >> 16) & 1) return struct.unpack(">f", struct.pack(">I", bits & 0xFFFF0000))[0] FORMATS = ( ("FP16", 5, 10, 2.0**-14, (2 - 2.0**-10) * 2.0**15, 2.0**-10), ("BF16", 8, 7, 2.0**-126, (2 - 2.0**-7) * 2.0**127, 2.0**-7), ("FP32", 8, 23, 2.0**-126, (2 - 2.0**-23) * 2.0**127, 2.0**-23), ) print("format exp frac min_normal max_finite epsilon_at_1") for name, exp, frac, low, high, eps in FORMATS: print(f"{name:5s} {exp:3d} {frac:4d} {low:.4e} {high:.4e} {eps:.4e}") values = (1.0001, 0.00001, 100000.0) print("\nvalue -> FP16 | BF16") for value in values: print(f"{value:g} -> {fp16(value):g} | {bf16(value):g}") loss_scaling_sim.py #!/usr/bin/env python3 """Show how FP16 loss scaling rescues tiny gradients; stdlib only.""" import math import struct def fp16(x: float) -> float: try: return struct.unpack("e", struct.pack("e", x))[0] except OverflowError: return math.copysign(math.inf, x) gradients = [1e-8, 3e-8, 1e-7, 1e-6, 1e-5] scale = 1024.0 direct = [fp16(g) for g in gradients] scaled_then_unscaled = [fp16(g * scale) / scale for g in gradients] print(f"shape=({len(gradients)},), loss_scale={scale:g}") print("gradient direct_fp16 scaled_fp16/unscaled") for g, raw, rescued in zip(gradients, direct, scaled_then_unscaled): print(f"{g:11.3e} {raw:11.3e} {rescued:11.3e}") print(f"nonzero: direct={sum(x != 0 for x in direct)}/{len(direct)}, scaled={sum(x != 0 for x in scaled_then_unscaled)}/{len(direct)}") make_figures.py """Regenerate this article's deterministic teaching figure (numpy + matplotlib).""" from pathlib import Path import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt import numpy as np OUT=Path(__file__).resolve().parents[1]/"figures" OUT.mkdir(exist_ok=True) plt.rcParams.update({"font.sans-serif":["PingFang SC","Arial Unicode MS","DejaVu Sans"],"axes.unicode_minus":False}) from float_formats import fp16,bf16 x=np.geomspace(1e-9,1e5,1500) y16=np.array([fp16(float(v)) for v in x]);yb=np.array([bf16(float(v)) for v in x]) fig,ax=plt.subplots(figsize=(8,4.8)) for name,y in [("FP16",y16),("BF16",yb)]: err=np.abs(y-x)/x;err[~np.isfinite(err)]=np.nan ax.loglog(x,np.maximum(err,1e-12),label=name,alpha=.75) ax.axvline(65504,color="grey",ls=":",label="FP16 max finite") ax.set(xlabel="Positive input value",ylabel="Relative rounding error",title="Quantization range and precision (nearest-even)",ylim=(1e-8,2)) ax.legend();ax.grid(alpha=.25);fig.tight_layout() fig.savefig(OUT/'precision_error.png',dpi=170) plt.close(fig) print(OUT/'precision_error.png') 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月05日
8 阅读
0 评论
0 点赞
2026-09-05
AIGC 基本功|数据并行与 ZeRO 显存切分-ZeRO
数据并行与 ZeRO 显存切分 所属方向:分布式训练 | 难度:进阶 | 前置知识:无 关键词:数据并行、DDP、ZeRO、优化器状态切分、FSDP、显存占用估算 01. 为什么需要它 先算一笔会让很多人意外的账:训练一个 75 亿参数模型,模型权重明明只有 15 GB,为什么放进 80 GB 显存的 GPU 还会爆? 假设用混合精度 Adam 训练。每个参数除了 2 字节的 FP16/BF16 权重,还要留下 2 字节梯度、4 字节 FP32 主权重、4 字节一阶动量和 4 字节二阶动量。合计不是 2 字节,而是 16 字节/参数: $$7.5\times10^9\times16\ \mathrm{bytes}=120\ \mathrm{GB}$$ 这 120 GB 还没有算激活、临时通信缓冲区、CUDA context 和显存碎片。换句话说,模型甚至没开始处理一帧视频,单是“为了训练而保存的状态”就已经放不下。 自然的反应是:“那我上 64 张卡。”可如果只用普通数据并行,每张卡都会保留完整的参数、完整的梯度和完整的 Adam 状态。64 张卡只是把不同 mini-batch 同时算得更快,每张卡看到的仍然是同一份 120 GB。总显存从 80 GB 变成 5120 GB,但单卡瓶颈一点没松,模型照样启动不了。 这就是 ZeRO 要解决的矛盾:数据并行已经拥有整个集群的总显存,却因为每张卡都复制同样的训练状态,只能使用其中一张卡的容量。ZeRO 不改变模型的数学计算,而是按顺序切掉三种冗余副本: ZeRO-1 切优化器状态; ZeRO-2 再切梯度; ZeRO-3 连参数也切,只在某一层即将计算时临时拼回来。 把刚才的 75 亿参数模型放到 64 个数据并行 rank 上,三阶段的模型状态显存分别是 31.41 GB、16.64 GB 和 1.88 GB。最后一个数字正好是 $120/64$。这些数字不是宣传页上的模糊“最高节省多少”,而是本文后面会逐项推出来、再用代码复现的结果。 对视频生成尤其要补一句:视频 DiT 的 token 数很长,激活往往比模型状态还大。ZeRO 能拆掉模型状态冗余,但不会自动消灭激活。先分清是哪一类显存爆了,再决定用 ZeRO、激活重计算还是序列并行,比盲目把配置改成 stage 3 更重要。 02. 最小可用理解 三句话先建立框架: 数据并行让每个 rank 保存同一个模型、读取不同数据,反向后把局部梯度求平均,因而数学上等价于在合并后的大 batch 上做一次同步更新。 既然所有 rank 最终拿到相同梯度,它们各自保存一整套 Adam 状态并重复做同一份更新就是冗余;ZeRO 把状态分片,每个 rank 只负责其中 $1/N$。 切得越彻底,常驻显存越少,但参数就越需要“用前聚合、用后释放”,因此省下的显存会转化成通信、调度和峰值控制问题。 如果只记一件事:DDP 是复制计算,ZeRO 是切分状态;ZeRO 没有改变梯度本身。 这里的 rank 可以先理解为一个独立训练进程,通常一个 rank 独占一张 GPU。$N$ 表示数据并行进程数,world_size 就是 $N$。每个 rank 处理本地 batch,但每一步结束后所有 rank 必须得到一致参数,否则下一步就不再是同一个模型。 03. 数学推导 3.1 为什么平均梯度等价于一个大 batch 设全局 batch 有 $B$ 个样本,均匀切给 $N$ 个 rank,每个 rank 得到 $b=B/N$ 个样本。模型参数记作 $w$,第 $i$ 个样本的损失是 $\ell(x_i;w)$。 第 $r$ 个 rank 的局部平均损失为: $$L_r(w)=\frac{1}{b}\sum_{i\in\mathcal{B}_r}\ell(x_i;w)$$ 其中 $\mathcal{B}_r$ 是 rank $r$ 拿到的样本集合,$b$ 是本地 batch size。对参数求导,得到局部梯度: $$g_r=\nabla_w L_r(w)=\frac{1}{b}\sum_{i\in\mathcal{B}_r}\nabla_w\ell(x_i;w)$$ 同步数据并行对所有局部梯度取平均: $$g=\frac{1}{N}\sum_{r=1}^{N}g_r=\frac{1}{Nb}\sum_{r=1}^{N}\sum_{i\in\mathcal{B}_r}\nabla_w\ell(x_i;w)=\frac{1}{B}\sum_{i=1}^{B}\nabla_w\ell(x_i;w)$$ 右边正是把所有样本放在一张卡上算全局平均损失所得到的梯度。等价成立依赖三个前提:损失能按样本分解且样本计算不因分组改变(如本地 BatchNorm 统计会破坏这一条件);各 rank 从同一个参数 $w$ 出发;样本权重一致;更新前完成同步。若最后一个 batch 在各 rank 上不等长,仍然机械地“先本地平均再按 rank 平均”,样本就会被赋予错误权重。这也是分布式数据加载器必须谨慎处理尾 batch 的原因。 DDP 的核心任务由此非常明确:它不替你切输入,而是在 autograd 产生梯度后,把各 rank 的 $g_r$ 聚合成相同的 $g$。 3.2 先把 16 字节拆明白 设模型有 $P$ 个可训练参数,采用低精度前后向和 FP32 Adam 更新。每个参数对应: 低精度参数:2 字节; 低精度梯度:2 字节; FP32 主参数:4 字节; Adam 一阶矩 $m$:4 字节; Adam 二阶矩 $v$:4 字节。 后面三项统称优化器状态,共 12 字节。普通 DDP 每个 rank 的模型状态显存是: $$M_{\mathrm{DDP}}=(2+2+12)P=16P$$ 注意这是一个状态下界模型,没有包含激活等剩余显存。它的价值不是预测 nvidia-smi 到个位数,而是先回答“哪一类状态值得切”。 实际套公式时,$P$ 应取需要优化器更新的参数量,不是配置文件里笼统写出的模型总参数量。冻结的视觉编码器通常仍要保存推理权重,却不产生梯度和 Adam 状态;共享 embedding 在参数统计中也只能算一次。优化器同样会改常数:SGD 无动量时几乎没有 $m,v$,8-bit Adam 会压缩这两份状态,某些纯 BF16 配置也不保留 FP32 主参数。所以正确动作不是背住“训练恒等于 16 字节/参数”,而是先列出当前训练栈真正持有的张量,再把每一项的元素数乘 dtype 字节数。本文使用 16 字节,是为了与 ZeRO 原论文的混合精度 Adam 假设严格对齐。 3.3 ZeRO 三阶段到底切了什么 ZeRO-1:只切优化器状态。 参数和梯度仍然每卡各有一份,12 字节的 FP32 主参数与 Adam 两个矩按 $N$ 份切开: $$M_{\mathrm{Z1}}=4P+\frac{12P}{N}$$ 当 $N$ 很大,第二项趋近于 0,但第一项中的 2 字节参数和 2 字节梯度仍然复制,所以 ZeRO-1 的极限是 $4P$,相对 $16P$ 最多节省 4 倍。 ZeRO-2:再切梯度。 常驻的完整副本只剩 2 字节低精度参数;梯度与优化器状态合计 14 字节一起分片: $$M_{\mathrm{Z2}}=2P+\frac{14P}{N}$$ 当 $N$ 很大,极限是 $2P$,相对普通 DDP 最多节省 8 倍。这里“切梯度”不是说某个 rank 永远见不到别人的梯度,而是 reduce-scatter 聚合后,每个 rank 只保留自己负责更新的那一片结果,其余梯度用完即释放。 ZeRO-3:参数也切。 参数、梯度和优化器状态全部只保留 $1/N$: $$M_{\mathrm{Z3}}=\frac{16P}{N}$$ 这时单卡模型状态随卡数线性下降,理论上终于可以使用整个数据并行组的聚合显存。代价是某层计算前必须 all-gather 出完整参数,计算后再 reshard。这里的“完整”通常只针对一个 FSDP unit 或若干层,而不是一次把全模型永远拼回显存;包装粒度如果选错,峰值仍然可能爆掉。 代入 $P=7.5\times10^9$、$N=64$: DDP:$16P=120.00$ GB; ZeRO-1:$4P+12P/64=31.41$ GB; ZeRO-2:$2P+14P/64=16.64$ GB; ZeRO-3:$16P/64=1.875$ GB。 这与 ZeRO 原论文表 1中的 120、31.4、16.6、1.88 GB 对上了。论文使用十进制 GB;如果监控工具显示 GiB,同一字节数会小约 7.4%,比较数字前先统一单位。 3.4 显存省了,通信为什么没有立刻爆炸 设梯度张量大小为 $G$ 字节。高带宽 ring all-reduce 通常拆成 reduce-scatter 和 all-gather。忽略延迟、拓扑和协议常数后,每个 rank 在两个阶段分别移动: $$V_{\mathrm{RS}}=\frac{N-1}{N}G,\qquad V_{\mathrm{AG}}=\frac{N-1}{N}G$$ 因此普通 DDP 的总通信量近似为: $$V_{\mathrm{DDP}}=2\frac{N-1}{N}G\approx2G$$ ZeRO-1/2 把原来的 all-reduce 改排成“梯度 reduce-scatter + 更新后参数 all-gather”。在本文参数与梯度均为两字节的假设下,两者大小同为 $G$,理想总字节量仍约为 $2G$。若用 FP32 梯度而参数为 BF16,两项大小不同,不能直接沿用该字节比。区别在于数据留在哪里、何时释放,而不是凭空少传了一半。 ZeRO-3 还要在前向和反向各聚合一次参数,再做梯度 reduce-scatter。按 ZeRO 论文用参数元素数 $P$ 计量,普通数据并行约移动 $2P$ 个元素,Stage 3 约移动 $3P$ 个元素,所以是基线的 1.5 倍。这个 1.5 倍假设参数/梯度通信 dtype 相同并采用所述聚合与释放调度,是理想带宽模型,不是训练时间必然乘 1.5:通信能否和计算重叠、跨没跨节点、消息是否太碎,都会改变真实结果。 3.5 别把模型状态公式当成整机显存公式 实际峰值更接近: $$M_{\mathrm{peak}}=M_{\mathrm{model\ states}}+M_{\mathrm{activations}}+M_{\mathrm{temporary}}+M_{\mathrm{runtime}}+M_{\mathrm{fragmentation}}$$ 第一项就是前面推导的参数、梯度和优化器状态。激活由 batch、序列长度、空间分辨率、层数和 checkpoint 策略决定;临时项包含 all-gather bucket、梯度 bucket 和算子工作区;runtime 包含 CUDA context、通信库等;碎片则取决于张量生命周期和分配器状态。 ZeRO 原论文给过一个很有提醒意义的例子:15 亿参数 GPT-2 的模型状态至少 24 GB;序列长度 1024、batch 32 时,激活约 60 GB,即使用激活重计算降到约 8 GB,临时 FP32 扁平缓冲还可能再占 6 GB。只看 $16P$ 判断“32 GB 正好能放下”会直接翻车。 模型状态随数据并行卡数的变化。固定 FP16 参数/梯度与 FP32 主权重及 Adam 状态,纵轴为十进制 GB;不含激活、临时聚合缓冲和运行时。 04. 代码实现 本节有两个完整脚本,均只依赖 Python 标准库。第一个复现论文显存表;第二个把 DDP all-reduce 与 ZeRO-2 的 reduce-scatter + all-gather 拆开,验证它们做出同一次 Adam 更新。完整代码在文末附录。 4.1 用公式生成显存账本 zero_memory_ledger.py 把每个阶段写成“每卡复制多少字节 + 分片多少字节”: STAGES = ( Stage("DDP", 16.0, 0.0, 1.0), Stage("ZeRO-1", 4.0, 12.0, 1.0), Stage("ZeRO-2", 2.0, 14.0, 1.0), Stage("ZeRO-3", 0.0, 16.0, 1.5), ) def bytes_per_parameter(self, world_size: int) -> float: return self.replicated_bytes + self.sharded_bytes / world_size replicated_bytes 是每个 rank 必须完整保留的部分,sharded_bytes 是可以除以 $N$ 的部分。默认参数就是论文的 7.5B/64 卡案例。实际运行: model=7.5B, world_size=64 assumption: fp16 params 2B + fp16 grads 2B + fp32 master/m/v 12B = 16 bytes/parameter stage bytes/param model-state GB vs DDP comm/step GB DDP 16.0000 120.00 1.00x 30.00 ZeRO-1 4.1875 31.41 3.82x 30.00 ZeRO-2 2.2188 16.64 7.21x 30.00 ZeRO-3 0.2500 1.88 64.00x 45.00 note: activation, temporary buffers and fragmentation are excluded 为什么 64 卡的 ZeRO-1 只有 3.82 倍而不是宣传里的 4 倍?因为 4 倍是 $N\to\infty$ 的上限,有限卡数下 $12P/N$ 还没有消失。ZeRO-2 的 7.21 倍同理。ZeRO-3 没有复制项,所以恰好获得 64 倍。 再换成 1.5B/8 卡: model=1.5B, world_size=8 assumption: fp16 params 2B + fp16 grads 2B + fp32 master/m/v 12B = 16 bytes/parameter stage bytes/param model-state GB vs DDP comm/step GB DDP 16.0000 24.00 1.00x 6.00 ZeRO-1 5.5000 8.25 2.91x 6.00 ZeRO-2 3.7500 5.62 4.27x 6.00 ZeRO-3 2.0000 3.00 8.00x 9.00 note: activation, temporary buffers and fragmentation are excluded 这组数字揭示一个选型习惯:模型状态只差几 GB 时,ZeRO-1/2 往往已经够用;不必为了追求最低常驻显存直接承担 Stage 3 的参数聚合。 4.2 ZeRO 为什么没有改掉优化结果 zero_update_simulator.py 构造 4 个 rank、8 个参数。每个 rank 看见不同数据,因此产生不同局部梯度。DDP 路径先得到完整平均梯度,再完整执行 Adam;ZeRO-2 路径只把平均梯度对应的两元素分片交给各 rank,每个 rank 维护自己的 $m,v$,更新后再把四个参数片聚合起来。 核心区别只有分片发生的位置: reduced_full_grad = average_columns(local_grads) ddp_params, ddp_m, ddp_v = adam_first_step(PARAMS, reduced_full_grad) param_shards = shard(PARAMS, WORLD_SIZE) grad_shards = shard(reduced_full_grad, WORLD_SIZE) updated_shards = [] for params_for_rank, grads_for_rank in zip(param_shards, grad_shards): updated, local_m, local_v = adam_first_step(params_for_rank, grads_for_rank) updated_shards.append(updated) zero_params = [value for part in updated_shards for value in part] 真实运行输出: world_size=4, parameter_count=8, shard_width=2 local gradient matrix shape=(4, 8) reduce-scatter result shape=(4, 2) averaged gradient: [0.02, 0.045, 0.07, 0.095, 0.12, 0.145, 0.17, 0.195] DDP updated params: [0.099, -0.201, 0.299, -0.401, 0.499, -0.601, 0.699, -0.801] ZeRO-2 gathered params: [0.099, -0.201, 0.299, -0.401, 0.499, -0.601, 0.699, -0.801] max_abs_diff=0.000000000000 Adam m/v scalars per rank: DDP=16, ZeRO-2=4, reduction=4.00x max_abs_diff=0 是本文最重要的代码结果:同一份平均梯度、同一优化器规则下,把参数更新分给不同 rank 并不会改变更新后的模型。每卡 Adam 的 $m,v$ 元素数则从 16 降到 4,正好是 4 倍。真实系统还需要 bucket、异步通信、混合精度和异常恢复,但数学骨架就是这几十行。 05. 工业级实现对照 最小实现为了看懂“切什么”,生产实现要解决的则是“什么时候切、什么时候聚合、怎么让网络传输藏在计算后面”。下面以 2026-09-05 可见的官方实现为准。 5.1 PyTorch DDP:复制参数,反向时同步梯度 PyTorch 的 DistributedDataParallel 采用一进程一卡。它不会自动切分输入;应用通常用 DistributedSampler 保证不同 rank 读取不同样本。模型参数在每卡完整复制,autograd hook 在反向过程中把就绪梯度装进 bucket,并尽早发起 all-reduce,以便通信和后续层反向计算重叠。 这解释了两个常见现象:第一,DDP 通常比单进程 DataParallel 快,因为没有主卡收集和 Python 线程瓶颈;第二,DDP 加卡能缩短时间,却不会降低模型状态的单卡显存。它首先是一种吞吐扩展方案,不是大模型装载方案。 5.2 ZeroRedundancyOptimizer:最小改动的 Stage 1 思路 PyTorch 的 ZeroRedundancyOptimizer 可以和 DDP 组合。每个 rank 只为大约 $1/N$ 的参数维护本地优化器状态,更新自己负责的参数后广播结果,让所有 DDP 副本重新一致。这对应 ZeRO-1 的核心思想;参数仍完整复制,所以不能把它当成 FSDP 的替代品。 官方文档还标记该 API 为 experimental,并提示启用 overlap_with_ddp=True 时,最初若干迭代可能因为梯度 bucket 尚未稳定而不做参数更新。工程上不能只看“少了多少 GB”,还要读清 API 的更新时序、checkpoint 聚合和版本状态。 5.3 DeepSpeed ZeRO:三个阶段直接写进配置 DeepSpeed 官方 ZeRO 教程把三个阶段定义得很直接:Stage 1 切优化器状态,Stage 2 再切梯度,Stage 3 再切参数。一个典型配置是: { "zero_optimization": { "stage": 2, "contiguous_gradients": true, "overlap_comm": true, "reduce_bucket_size": 500000000 } } contiguous_gradients 针对碎片与通信连续性,overlap_comm 尝试把通信藏进计算,reduce_bucket_size 在“消息大到能吃满带宽”和“临时 bucket 不要撑爆显存”之间取舍。这些开关没有脱离前面的公式,只是在控制公式之外的临时项和时间轴。 如果 GPU 显存仍不够,ZeRO-Offload 可以把优化器状态与计算移到 CPU,ZeRO-Infinity 进一步使用 CPU 和 NVMe。但 官方 ZeRO-Offload 教程 展示的 10B 单 V100 案例并不意味着 offload 免费:PCIe 传输、CPU Adam 吞吐、NUMA 与磁盘带宽会变成新的瓶颈。 5.4 PyTorch FSDP:Stage 2/3 的框架化实现 知识树里的代码锚点 torch/distributed/fsdp/fully_sharded_data_parallel.py#FullyShardedDataParallel 在当前 PyTorch main 仍存在。FSDP1 的 ShardingStrategy 可以这样理解: NO_SHARD:参数、梯度、优化器状态都复制,行为接近 DDP; SHARD_GRAD_OP:梯度和优化器状态分片,参数在计算窗口内保持完整,接近 ZeRO-2; FULL_SHARD:参数、梯度和优化器状态全分片,接近 ZeRO-3; HYBRID_SHARD:节点内全分片、节点间复制,减少低带宽跨节点通信。 不过当前 PyTorch FSDP2 教程 已经明确建议迁移到 fully_shard:FSDP2 以 DTensor 做逐参数分片,不再依赖 FSDP1 的扁平参数;reshard_after_forward=True 对应 FULL_SHARD,设为 False 则更像 SHARD_GRAD_OP。文章或配置里只写“用了 FSDP”已经不够,必须同时说明代际和策略。 5.5 一层参数在 FSDP 中的生命周期 以 full shard 为例,一个 FSDP unit 在一次训练步里大致经历: 常驻状态只有本 rank 的参数分片; pre-forward hook 发起 all-gather,临时物化完整参数; 执行该 unit 的前向; 释放完整参数,恢复分片; 反向前再次 all-gather 参数; 计算梯度后执行 reduce-scatter,每个 rank 只留下本地梯度片; 本地优化器只更新本 rank 的参数与状态分片。 真正决定峰值的不是“最终只存 $1/N$”,而是同一时刻有多少 unit 正在 all-gather、预取队列有多深、最大 unit 有多大。如果把整个模型只包成一个巨型 unit,那么计算前仍要暂时物化全模型;如果把每个很小的算子都单独包起来,又会制造大量小消息,延迟和调度开销反而吞掉吞吐。Transformer 常按 block 包装,就是在这两端之间折中。 FSDP2 的公开契约仍是同一个时间逻辑:前向/反向前由 hook unshard,之后 reshard,梯度用 reduce-scatter 汇聚。实现细节从 flat parameter 变成 DTensor,不代表 ZeRO 的“按需物化”思想变了。 5.6 一个实用的选择顺序 先测量,再逐级加复杂度: 模型状态能放下,只想提吞吐:先用 DDP; Adam 状态是主要缺口:DDP + ZeRO-1/ZeroRedundancyOptimizer; 梯度也造成明显压力:ZeRO-2 或 FSDP 的 shard-grad 策略; 单卡连参数副本都放不下:ZeRO-3/FSDP full shard; 模型状态已经很小但长视频仍 OOM:处理激活重计算、micro-batch、FlashAttention 或序列并行,而不是继续折腾 ZeRO stage; 网络太慢:优先让分片组留在节点内,再用张量/流水线或混合分片扩到节点间。 06. 代价与边界 ZeRO 不减少总计算量。 同一个 batch 的前向、反向和 Adam 更新并没有少。它让每个 rank 少存状态,并通过通信在需要时恢复视图。若模型原本就能舒适放下,Stage 3 很可能只是增加通信和 hook 调度,吞吐反而下降。 通信字节相同,不代表时间相同。 ZeRO-2 与 DDP 在论文模型里都是约 $2G$,但一次大 all-reduce 和许多 layer-wise reduce-scatter/all-gather 的延迟特征不同。NVLink 节点内、InfiniBand 节点间、普通以太网的最优 bucket 大小不会一样;跨节点带宽不足时,1.5 倍 Stage 3 通信尤其明显。 平均显存很低,峰值仍可能 OOM。 参数 all-gather、预取、梯度归约、算子 workspace 可能同时在场。只看稳定阶段的 memory_allocated 会漏掉峰值;要记录 max_memory_allocated,并逐步调 wrap 粒度、prefetch 和 bucket。 ZeRO 解决不了激活随序列长度增长。 视频 DiT 中,时间、宽、高一起扩张,token 数可能成倍增加,注意力和 MLP 保存的激活随之增长。参数切到 1 GB 后仍然爆显存,并不说明 ZeRO 失效,而是瓶颈已经从模型状态转移到激活。 checkpoint 变复杂。 每个 rank 手里只有一片状态,保存时要选择 full、sharded 或 local state dict。把完整 checkpoint 聚合到 rank 0 可能让 CPU 内存瞬间成为瓶颈;只保存分片又要求恢复时正确处理 world size 和布局。训练能跑并不等于容灾链路可用,上线前至少做一次“保存—退出—换步数恢复”的演练。 全局操作必须认识分片。 梯度范数裁剪、参数检查、EMA、冻结部分参数、权重共享都不能默认“当前 rank 能看到完整张量”。例如 FSDP 提供自己的 clip_grad_norm_,就是因为全局范数需要跨分片归约。绕开框架直接遍历本地 .grad,算到的只是局部值。 offload 是拿带宽换容量。 CPU 内存比显存大,NVMe 又比 CPU 内存大,但层级越远,带宽越低、延迟越高。小模型或计算密度不够的模型会被数据搬运压垮;只有“不 offload 根本跑不了”或计算足以覆盖传输时,这个交换才划算。 大 batch 会改变优化问题。 增加数据并行度时,如果每卡 batch 不变,全局 batch 会随 $N$ 增长。ZeRO 保证同一全局 batch 下更新等价,却不保证扩大 batch 后收敛曲线不变。学习率、warmup、梯度累计和数据采样仍要一起调整。 什么时候不该用 ZeRO-3:模型与激活在单卡尚有充足余量、网络较慢、模型由大量极小模块组成且难以形成高效 bucket,或者你更看重最低延迟和调试简单性。此时 DDP 或 ZeRO-1/2 往往是更好的工程答案。 07. 经典论文脉络 这条路线不是“突然发明一种分布式训练”,而是一步步把数据并行里的冗余拆掉: Horovod(arXiv:1802.05799,2018)把 ring all-reduce 做成易接入的训练抽象,奠定了现代同步数据并行“各算各的、梯度集体归约”的工程基线;它解决吞吐扩展,但每个 worker 仍保存完整模型状态。 ZeRO(arXiv:1910.02054,2019)指出数据并行浪费的不是总显存,而是参数、梯度和优化器状态的重复副本;三阶段切分在保持数据并行计算粒度的同时,把模型状态显存从 $16P$ 推到 $16P/N$。 ZeRO-Offload(arXiv:2101.06840,2021)把优化器状态与计算搬到 CPU,并针对 CPU Adam 优化,让单张 32 GB V100 训练 10B 模型成为论文展示案例;留下的新问题是主机带宽和异构调度。 ZeRO-Infinity(arXiv:2104.07857,2021)继续把 CPU 与 NVMe 纳入内存层级,用带宽感知的分区和预取突破 GPU 内存墙;容量继续扩大,但 I/O 调度成为系统的核心。 PyTorch FSDP(arXiv:2304.11277,2023)总结了把 fully sharded data parallelism 纳入 PyTorch eager 训练栈的实践,让 ZeRO-3 类思想不再只属于单一外部训练引擎,并推动后续 FSDP2 的逐参数分片。 主线可以压缩成一句话:all-reduce 证明“计算可以复制、结果可以同步”,ZeRO 进一步问“既然结果会同步,状态为什么还要复制”。 后续 Offload、Infinity、FSDP 都是在回答状态放在哪、何时出现、以什么粒度搬运。 08. 常见误解 “数据并行会把模型切到多张卡上。” 不会。普通 DDP 是每卡一个完整模型,只切数据。能把吞吐从一张卡扩到八张,不代表能装下超过单卡容量的参数。 “ZeRO-3 后每卡永远只有 $1/N$ 参数。” 常驻状态是 $1/N$,计算某个 FSDP unit 前仍需临时 all-gather 完整参数。忽略这个瞬时窗口,就会得到理论显存能放、实际 forward 前仍 OOM 的配置。 “ZeRO-2 比 DDP 少传一半梯度,所以一定更快。” ZeRO-2 用 reduce-scatter 只留下梯度片,但更新后还要 all-gather 参数片。按论文的理想字节模型,总通信量与 DDP all-reduce 相同;快慢来自重叠、bucket、拓扑与实现,而非简单少一半。 “用了 ZeRO 就不用 activation checkpointing。” 两者切的是不同账本。ZeRO 处理模型状态冗余;activation checkpointing 用额外重算减少前向激活保存。长视频训练经常需要两者同时用。 “参数是 BF16,所以 Adam 也只占 2 字节。” 常见混合精度训练会保留 FP32 主参数与 FP32 的 $m,v$,优化器部分仍是 12 字节/参数。不同优化器、8-bit optimizer 或纯 BF16 更新会改变常数,因此使用 $16P$ 前必须先列出真实 dtype 与状态。 “64 卡 ZeRO-1 就一定省 4 倍。” 4 倍是 $N$ 很大时的渐近上限。64 卡的精确值是 $16/(4+12/64)=3.82$ 倍;8 卡只有 2.91 倍。宣传中的“up to”不能替代自己的显存账本。 “只要 loss 一样,所有数据并行更新都严格一致。” 浮点归约顺序会改变末位误差,随机数、dropout、数据尾 batch 和非确定性 kernel 也会影响复现。数学上等价不等于 bitwise identical;本文模拟得到 0 误差,是因为使用同一确定性顺序与双精度标量。 09. 动手验证 下面五个实验都能在没有 GPU 的机器上完成。两个脚本全文在附录,复制保存后直接用 Python 3 运行。 实验一:复现原论文表格。 python zero_memory_ledger.py 预期看到 7.5B/64 卡下 DDP、ZeRO-1/2/3 分别为 120.00、31.41、16.64、1.88 GB。如果结果差约 7%,检查自己是不是把 GiB 和十进制 GB 混用了。 实验二:观察有限卡数离理论上限有多远。 python zero_memory_ledger.py --params-b 1.5 --world-size 8 预期 ZeRO-1 只省 2.91 倍,ZeRO-2 只省 4.27 倍,ZeRO-3 才精确省 8 倍。再把 world-size 改成 2、4、16、64,观察 Stage 1 向 4 倍、Stage 2 向 8 倍收敛。 实验三:验证更新等价性。 python zero_update_simulator.py 预期 DDP 与 ZeRO-2 的八个新参数完全相同,max_abs_diff=0;每 rank 的 Adam $m,v$ 标量数从 16 降为 4。把 local_gradient() 的公式改掉,只要两条路径仍使用同一平均梯度,最终参数就应继续一致。 实验四:故意制造尾 batch 权重错误。 在模拟器里让最后一个 rank 只代表一个样本、其他 rank 各代表两个样本,然后比较“先对每个 rank 求平均再除以 4”和“按总样本数加权平均”。预期两个梯度不同。这能解释为什么真实训练要使用 DistributedSampler、drop_last 或正确的样本权重,而不能只相信 all-reduce。 实验五:给自己的模型补全账本。 从训练日志记录参数量、每种状态 dtype、峰值激活与临时 buffer。先用脚本算模型状态理论值,再和框架峰值相减。如果差值随序列长度或分辨率快速增长,瓶颈是激活;如果几乎不随输入变化,才优先继续切模型状态。预期这一步比直接试三个 ZeRO stage 更快找到真正的 OOM 原因。 10. 延伸阅读 读完这篇可以沿分布式训练知识树继续: 混合精度与数值稳定性:本文的 16 字节常数建立在混合精度 Adam 上;理解 FP16、BF16、FP8 的动态范围后,才能判断哪些状态可以继续降精度。 张量并行与流水线并行:当单个算子或单层连临时 all-gather 都放不下时,需要切计算本身;下一步要算 TP 通信量和 PP 气泡率。 序列并行与 Ring Attention:模型状态已经切完,长视频仍被激活卡住时,才轮到沿序列维度切注意力计算。 本文的核心资料均来自原始论文与官方实现:ZeRO 的显存和通信公式以 ZeRO 原论文为准;三阶段配置参考 DeepSpeed ZeRO 官方教程;DDP、优化器分片和 FSDP 策略分别核对了 PyTorch DDP 文档、ZeroRedundancyOptimizer 文档 与 FSDP 文档。代码路径和 API 会随上游重构,工业实现部分注明的日期就是版本边界。 附录:完整代码 09 节用到的脚本全文如下(zero_memory_ledger.py、zero_update_simulator.py、make_figures.py)。复制到本地存成同名文件,按各脚本开头的依赖说明准备环境后即可运行。 zero_memory_ledger.py #!/usr/bin/env python3 """复现 ZeRO 论文中的混合精度 Adam 模型状态显存账本。 这里只计算参数、梯度和优化器状态,不包含激活、临时通信缓冲区、 CUDA context 与内存碎片。单位同时使用十进制 GB,便于和论文表格对照。 """ from __future__ import annotations import argparse from dataclasses import dataclass @dataclass(frozen=True) class Stage: name: str replicated_bytes: float sharded_bytes: float communication_multiple: float def bytes_per_parameter(self, world_size: int) -> float: return self.replicated_bytes + self.sharded_bytes / world_size STAGES = ( Stage("DDP", 16.0, 0.0, 1.0), Stage("ZeRO-1", 4.0, 12.0, 1.0), Stage("ZeRO-2", 2.0, 14.0, 1.0), Stage("ZeRO-3", 0.0, 16.0, 1.5), ) def gb(byte_count: float) -> float: """转为十进制 GB;ZeRO 原论文的 120 GB 使用这个口径。""" return byte_count / 1_000_000_000 def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--params-b", type=float, default=7.5, help="参数量,单位十亿;默认复现论文的 7.5B 示例") parser.add_argument("--world-size", type=int, default=64, help="数据并行进程数") args = parser.parse_args() if args.params_b <= 0 or args.world_size <= 0: raise ValueError("params-b 与 world-size 必须为正数") params = args.params_b * 1_000_000_000 gradient_bytes = params * 2 # fp16/bf16 梯度 baseline_comm = 2 * gradient_bytes # ring all-reduce: reduce-scatter + all-gather print(f"model={args.params_b:g}B, world_size={args.world_size}") print("assumption: fp16 params 2B + fp16 grads 2B + " "fp32 master/m/v 12B = 16 bytes/parameter") print("stage bytes/param model-state GB vs DDP comm/step GB") ddp_bytes = STAGES[0].bytes_per_parameter(args.world_size) for stage in STAGES: bpp = stage.bytes_per_parameter(args.world_size) state_gb = gb(params * bpp) saving = ddp_bytes / bpp comm_gb = gb(baseline_comm * stage.communication_multiple) print(f"{stage.name:<8} {bpp:>10.4f} {state_gb:>17.2f} " f"{saving:>9.2f}x {comm_gb:>15.2f}") print("note: activation, temporary buffers and fragmentation are excluded") if __name__ == "__main__": main() zero_update_simulator.py #!/usr/bin/env python3 """用单进程模拟 DDP 与 ZeRO-2 的一次 Adam 更新。 脚本不依赖 GPU、PyTorch 或分布式运行时。四个“rank”先各自产生一份局部 梯度,再比较两条路径:DDP 对完整梯度做 all-reduce;ZeRO-2 对梯度做 reduce-scatter、每个 rank 只更新自己的参数片,最后 all-gather 参数。 """ from __future__ import annotations import math WORLD_SIZE = 4 PARAMS = [0.10, -0.20, 0.30, -0.40, 0.50, -0.60, 0.70, -0.80] LEARNING_RATE = 1e-3 BETA1 = 0.9 BETA2 = 0.999 EPSILON = 1e-8 def local_gradient(rank: int, width: int) -> list[float]: """构造确定性的局部梯度,模拟每个 rank 看见不同数据。""" return [((rank + 1) * (index + 2) - 3) / 100.0 for index in range(width)] def average_columns(rows: list[list[float]]) -> list[float]: return [sum(column) / len(rows) for column in zip(*rows)] def shard(vector: list[float], world_size: int) -> list[list[float]]: if len(vector) % world_size: raise ValueError("为了让示例清楚,参数量必须能被 world_size 整除") width = len(vector) // world_size return [vector[rank * width:(rank + 1) * width] for rank in range(world_size)] def adam_first_step(params: list[float], grads: list[float]) -> tuple[list[float], list[float], list[float]]: """执行 Adam 的第 1 步,并返回新参数、m、v。""" new_params: list[float] = [] m_state: list[float] = [] v_state: list[float] = [] for value, grad in zip(params, grads): m = (1.0 - BETA1) * grad v = (1.0 - BETA2) * grad * grad m_hat = m / (1.0 - BETA1) v_hat = v / (1.0 - BETA2) updated = value - LEARNING_RATE * m_hat / (math.sqrt(v_hat) + EPSILON) new_params.append(updated) m_state.append(m) v_state.append(v) return new_params, m_state, v_state def main() -> None: local_grads = [local_gradient(rank, len(PARAMS)) for rank in range(WORLD_SIZE)] # DDP:每个 rank 经 all-reduce 得到同一份完整平均梯度,并完整更新参数。 reduced_full_grad = average_columns(local_grads) ddp_params, ddp_m, ddp_v = adam_first_step(PARAMS, reduced_full_grad) # ZeRO-2:reduce-scatter 的结果等价于先平均,再只保留所属分片。 param_shards = shard(PARAMS, WORLD_SIZE) grad_shards = shard(reduced_full_grad, WORLD_SIZE) updated_shards: list[list[float]] = [] state_sizes: list[int] = [] for params_for_rank, grads_for_rank in zip(param_shards, grad_shards): updated, local_m, local_v = adam_first_step(params_for_rank, grads_for_rank) updated_shards.append(updated) state_sizes.append(len(local_m) + len(local_v)) # all-gather 后每个 rank 都能拿到同一份新参数;这里拼接一次代表该结果。 zero_params = [value for part in updated_shards for value in part] max_abs_diff = max(abs(a - b) for a, b in zip(ddp_params, zero_params)) shard_width = len(PARAMS) // WORLD_SIZE print(f"world_size={WORLD_SIZE}, parameter_count={len(PARAMS)}, " f"shard_width={shard_width}") print(f"local gradient matrix shape=({WORLD_SIZE}, {len(PARAMS)})") print(f"reduce-scatter result shape=({WORLD_SIZE}, {shard_width})") print("averaged gradient:", [round(x, 4) for x in reduced_full_grad]) print("DDP updated params:", [round(x, 6) for x in ddp_params]) print("ZeRO-2 gathered params:", [round(x, 6) for x in zero_params]) print(f"max_abs_diff={max_abs_diff:.12f}") print(f"Adam m/v scalars per rank: DDP={len(ddp_m) + len(ddp_v)}, " f"ZeRO-2={state_sizes[0]}, reduction={WORLD_SIZE:.2f}x") if __name__ == "__main__": main() make_figures.py """Regenerate this article's deterministic teaching figure (numpy + matplotlib).""" from pathlib import Path import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt import numpy as np OUT=Path(__file__).resolve().parents[1]/"figures" OUT.mkdir(exist_ok=True) plt.rcParams.update({"font.sans-serif":["PingFang SC","Arial Unicode MS","DejaVu Sans"],"axes.unicode_minus":False}) n=np.array([1,2,4,8,16,32,64]); p=7.5e9 fig,ax=plt.subplots(figsize=(8,4.8)) for name,y in [("DDP",np.full(n.shape,16.)),("ZeRO-1",4+12/n),("ZeRO-2",2+14/n),("ZeRO-3",16/n)]: ax.plot(n,y*p/1e9,"o-",label=name) ax.set(xscale="log",yscale="log",xlabel="Data-parallel ranks",ylabel="Model states per rank (GB)",title="7.5B model: FP16 weights/grads + FP32 master/m/v") ax.legend();ax.grid(alpha=.25);fig.tight_layout() fig.savefig(OUT/'zero_states.png',dpi=170) plt.close(fig) print(OUT/'zero_states.png') 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月05日
7 阅读
0 评论
0 点赞
2026-09-04
AIGC 每日速读|2026-09-04|港中深5秒训练撑起一小时世界推演-SolarWM
今日 AIGC 论文速览 今日共 10 篇 重点论文标题列表 SolarWM(香港中文大学(深圳)、SLAI、新加坡国立大学、香港中文大学、香港科技大学、香港科技大学(广州)、NVIDIA、UCLA、微软亚洲研究院):5秒训练撑起一小时世界推演 SelfLift(清华大学、字节跳动):少步扩散再砍41%延迟 f-loss(LIX 巴黎综合理工学院(CNRS, IP Paris)、AMIAD、LIGM 巴黎国立桥路学校、加州大学伯克利分校):频域配平让收敛快40% MeRoPE(香港科技大学、卓驭科技):大基线相机控制不再爆范数 GlyphAnchor(复旦大学、小红书、上海创智学院):字形块锚定长文本渲染 今日论文速览 1. SolarWM:5秒训练撑起一小时世界推演 SolarWM: Open Data and Scalable Training for Long-Horizon Video World Models | 香港中文大学(深圳)、SLAI、新加坡国立大学、香港中文大学、香港科技大学、香港科技大学(广州)、NVIDIA、UCLA、微软亚洲研究院 | arXiv:2609.02886 关键词:交互式世界模型,长时序推演,多源数据引擎,骨干原生适配,分布匹配蒸馏,自回归因果模型,SolarWM 前序问题:把视频生成模型改造成可交互的世界模型,卡点其实不在骨干网络。论文点出的是一处「耦合」:一方面各个数据源彼此不兼容——时间尺度、相机几何、画质、运动幅度、字幕风格全都不一样;另一方面各家视频生成器用的表示和架构也不同。这两件事叠起来的后果是,天真地把数据混在一起、再为每个模型写一套专用实现,得到的监督信号是互相矛盾的,而且结果既难复现也难以互相比较。于是这个方向上大量工作看起来在进步,却无法判断进步来自数据、配方还是骨干。更具体的难题是长时序:交互式世界模型要求模型在用户持续操作下自回归地往前推演,而训练时能拿到的序列长度是有限的,如何让短序列训练出来的模型撑住远超训练窗口的推演,是这类系统真正的分水岭。 本文贡献:SolarWM 的回应是把上面那处耦合拆开,给出一个从数据准备一路到长时序推理的完整开放底座,具体是两件事加一套配方。第一是可重配置的多源数据引擎:它把来自 10 个数据集的 143 万个规范化片段转换成一份统一的、逐帧对齐的「契约」,内容覆盖视觉观测、度量尺度的相机几何、字幕、质量元数据、筛选决策以及来源出处;关键设计是把「单源处理」与「混合配比构造」解耦,这样调整数据配比不必重跑源处理。第二是骨干原生的适配框架:在共享的相机条件化、训练与推理接口之下,他们基于 Wan2.2、LTX-2.5 和 MiniMax-H3 实例化了四个 5B 到 33B 的模型,且刻意保留各自原生的表示与目标函数,而不是强行统一成一种写法——这正是让跨骨干结果可比的前提。第三是一套统一的三阶段配方:双向适配、教师强制的自回归初始化、以及分布匹配蒸馏。三者串起来把双向模型转成因果模型,从而支持实时交互。数据、管线、配方、权重与框架均开放。 Overview of the SolarWM-5B training pipeline and hour-scale inference results 实验效果:论文给出的核心结果是一个训练窗口与推演窗口之间的落差:模型只在 5 秒序列上训练,得到的因果模型却能在分钟级到小时级的推演区间内支持实时交互。附录里的定性证据分层给出——十秒级的域内第三人称结果、分钟级的域内不间断推演,以及从单张域外图像出发的分钟级自回归 rollout;最长的一组是小时级世界推演,从一帧真实初始观测出发、在一次不间断的自回归会话中稀疏采样直到 60 分钟端点,且场景提示词全程固定。跨骨干方面,四个 5B–33B 的模型(Wan2.2、LTX-2.5、MiniMax-H3 路线)在共享的相机条件化接口下均被实例化并给出双向预训练阶段的域外定性结果。 Hour-scale world rollout generated by the SolarWM-wan2.2-5B-fast causal student. Sparse frames are sampled throughout a single uninterrupted autoregressive session initialized with a real first frame from the held-out validation pool, spanning the initial observation to the 60-minute endpoint. The scene prompt remains fixed and the model follows a predetermined camera trajectory. 批判点评:这篇的价值主要不在某个新模块,而在它选择去修的那个东西——它把世界模型研究里「结果无法复现、无法比较」这件长期被容忍的事当成首要问题来处理,并且给出的答案是工程性的:一份逐帧对齐、连筛选决策和来源出处都写进去的数据契约,以及把单源处理与混合配比解耦的设计。后者尤其实在,因为调配比是这类研究里最高频的动作,能不重跑源处理就省下大量算力。保留各骨干原生表示与目标函数、只统一外层接口,也是个克制且正确的判断:强行统一写法会污染比较结论。三阶段配方本身(双向适配 → 教师强制自回归初始化 → 分布匹配蒸馏)不算首创,但把它固定成跨三个骨干都能跑通的统一收口,本身就是可复用的贡献。需要留意证据的形态:小时级推演目前靠定性 rollout 呈现,而长时序真正的难点——缓慢漂移、场景记忆是否退化、以及交互指令在几十分钟后是否还被正确响应——恰好是稀疏采样帧最不容易暴露的;这类主张更需要定量的漂移曲线来支撑。「实时」同样缺少帧率与时延的明确数字,而交互体验对这两个量极其敏感。还有一处值得追问:训练只用 5 秒序列却要推演一小时,跨越了四个数量级,分布匹配蒸馏在其中承担了多少稳定性、又在多长的时间尺度后开始失效,论文摘要层面没有给出边界。最后,143 万片段来自 10 个数据集,配比本身就是强超参,开放数据引擎让别人能复现这套配比,但配比是否接近最优仍是开放问题。总体上,把它当作一个可扩展的研究底座比当作一个性能主张来读更合适。 2. SelfLift:少步扩散再砍41%延迟 SelfLift: Accelerating Few-Step Diffusion via Self-Recovering Resolution Transition | 清华大学、字节跳动 | arXiv:2609.02036 关键词:少步扩散加速,渐进式分辨率推理,伪影风险图,pixel-VAE重编码,免训练修正,自蒸馏,SelfLift 前序问题:少步扩散已经把时间维度的计算压得很狠,于是每一次模型评估的空间开销就顶上来成了延迟主项。自然的下一步是渐进式分辨率推理:前期在低分辨率去噪,把高分辨率的算力留给后期精修。问题出在「升分辨率」这一下——既有做法通常把中间 latent 直接抬上去,然后指望后续去噪步骤自己把由此产生的分布错配吸收掉。这在多步的年代还行,但在少步这个预算下,可供恢复的步数本来就少,错配吸收不完,残留就直接表现为可见伪影。这构成一个连锁约束:因为伪影,切换点不敢放得太晚;而切换越早,低分辨率阶段占的比例越小,能省下的算力也就越有限。也就是说,加速比不是被算力上限卡住的,而是被「转换质量」卡住的。 本文贡献:SelfLift 的核心判断是修补信号不必外求,模型自己就能提供。它给出两档。第一档 SelfLift-zero 是免训练的「伪影感知一致性抬升」:把直接抬升 latent 的结果与经 pixel-VAE 重编码得到的结果做比较,两者的分歧同时承担两个角色——既是局部伪影风险的定位信号,又是模型原生的修正方向。论文的分析图指出这背后的机理:直接抬升会引入解码器可见的不一致,而 pixel-VAE 重编码提供的是一个更平滑但确实可达的锚点,朝这个锚点做修正就得到伪影更少的目标分辨率状态;同时它只在高风险区域做选择性修正,而不是全图均匀混合——均匀混合只能削弱重影和空间漂移,留下残余失真。这一档不需要外接超分模型、不增加去噪评估次数、也不改采样调度。第二档 SelfLift-rich 建立在这个更稳的转换之上,做「on-policy 自恢复」:在学生模型自己访问到的状态上,从一个内部自教师那里迁移密集的高分辨率指导,同时保持与被改变后的渐进式分辨率动力学对齐——论文的消融显示,改成 off-policy 蒸馏会产生模糊。 Overview of SelfLift. Given the predicted low-resolution clean endpoint, SelfLift-zero constructs a trajectory-preserving latent candidate and a VAE-reachable pixel anchor. Their consistency residual yields an artifact-risk map and adaptive weights for selectively correcting high-risk regions before re-noising. SelfLift-rich distills this correction into a lightweight latent lifter and performs on-policy recovery on student-visited states, using an EMA self-teacher for privileged high-resolution guidance and a dynamics objective to preserve the pretrained few-step trajectory. 实验效果:在 FLUX.2-Klein 与 Z-Image-Turbo 上,SelfLift 分别把端到端延迟降低 41.5% 和 44.1%。与时间步蒸馏叠加后,相对各自的 50 步模型给出 29.61× 和 19.21× 的整体加速,同时保持有竞争力的生成质量。定性一侧,论文在 FLUX.2-Klein-9b、仅 4 次函数评估(NFE)的激进加速设定下做了对比:Vanilla、RALU 与 Speed 出现严重伪影,MrFlow 靠一个更昂贵的外接超分模型改善了保真度,而 SelfLift-zero 通过模型原生的修正抑制伪影、SelfLift-rich 进一步恢复更丰富的细节。消融方面,转换策略消融用 CLIP-IQA 衡量清晰度、ImageReward 衡量提示对齐质量,并标出 SelfLift-zero 在清晰度与对齐之间取得最佳折中的工作点。 批判点评:这篇最好的地方是问题定位干净:它没有笼统地说「渐进式分辨率有伪影」,而是把因果链讲清楚了——伪影限制了切换时机,切换时机限制了加速比。一旦这样表述,优化目标就从「把伪影修掉」变成了「把切换点往后推」,这是一个更可操作的目标。用「直接抬升」与「pixel-VAE 重编码」两条路径的分歧同时充当风险图和修正方向,是个很省的设计:一次比较拿到两样东西,而且两样都来自模型内部,不引入外部超分这种既费算力又可能带来风格漂移的依赖。选择性修正而非全图均匀混合,也被消融证明是必要的——均匀混合只削弱而不清除重影与漂移。免训练档位的存在让它容易被采用,这在工程上比第二档更有价值。需要清楚几处边界。首先是数字的读法:41.5%/44.1% 与 29.61×/19.21× 基线不同,后者已经把时间步蒸馏的收益算进去了,单独引用容易夸大本方法的贡献。其次,摘要用「有竞争力的质量」而非「无损」,说明这是权衡;而这类方法的风险恰恰在高频细节和文字/人脸这类低容错区域,论文给的是 CLIP-IQA 与 ImageReward 这两个聚合指标,缺少针对细粒度结构的失败率分析。第三,SelfLift-rich 需要训练,且依赖一个内部自教师与 on-policy 采样,成本与实现复杂度都高于第一档,实际收益是否值得这份复杂度,取决于部署场景。第四,pixel-VAE 重编码本身也有开销,摘要强调不增加去噪评估次数,但重编码这条路径的代价在总账里占多少,值得在采用前实测。最后,两个验证骨干都是少步蒸馏模型,方法与「少步」这个前提绑得较紧,迁移到常规多步模型上是否仍有同等收益并不自明。 3. f-loss:频域配平让收敛快40% Balancing Frequencies and Pixels in Flow Matching | LIX 巴黎综合理工学院(CNRS, IP Paris)、AMIAD、LIGM 巴黎国立桥路学校、加州大学伯克利分校 | arXiv:2609.02748 关键词:flow matching,谱偏置,Focal Log-Frequency Loss,像素空间训练,收敛加速,损失替换,f-loss 前序问题:这篇处理的是一处几乎被当成常识、因此少有人清算的训练偏置。自然图像服从 1/f² 的谱分布:信号能量绝大部分堆在低空间频率,而纹理、边缘这些对观感真正重要的结构却分布在稀疏的高频带上。而像素空间的重建目标对所有空间误差一视同仁——于是低频凭借能量优势主宰了优化信号,细粒度细节的学习被一路往后拖。论文把这件事明确命名为「目标函数层面的谱失衡」,并指认它是像素空间 flow 模型训练效率低下的一个关键原因。值得注意的是这个诊断的位置:它不在架构里,也不在数据里,而在损失函数里——这意味着此前大量靠改架构来提升细节的努力,可能都在绕过真正的病灶。 本文贡献:对策分两层,都刻意保持简单。第一层是 Focal Log-Frequency Loss(f-loss):一个在频谱上做过平衡的目标,把学习信号在各个频率之间拉平,从而突出那些在像素空间目标下被系统性低估的高频成分。第二层是一个训练策略,把频域监督与像素监督组合起来使用——训练早期先强调频域学习,好处是让模型把所有频率都先抓住;随后过渡到标准的像素空间 v-loss,专门做空间精修。这个先后顺序不是随手安排的:论文的收敛分析显示,频域损失在训练早期主导,而空间域损失在后期逐步追上,切换时机正是顺着这条演化曲线走的,作者的说法是让训练信号与模型不断变化的需求对齐。整套方法在概念上很朴素——不改任何架构,可以作为 flow matching 损失的直接替换(drop-in replacement)落地。 实验效果:在多个模型规模上,该方法把收敛速度提升最多 40%,同时持续改善 FID 与感知保真度。机理侧的证据分几层:谱分析显示仅用像素损失训练时,生成图像的功率谱相对真实图像存在系统性偏差——低频被高估、高频被低估;一个只含两个活跃频率的 MLP 玩具实验进一步显示,低频模式被迅速学到,而高频模式在整个训练过程中始终缺席。带通 FID 分析给出更细的画面:在低频和中频带上,两种损失最终收敛到相同的数值;差别出现在高频带——f-loss 在训练早期领先,随后基线一度追上,但 f-loss 在约 20 万步附近再度反超。定性一侧,早期训练阶段用 f-loss 生成的图像更早出现细腻纹理(如老虎条纹、茅草屋顶的干草),而基线在同期更偏向把物体边界画清楚(如帆船轮廓分明)。此外论文还报告了以墙钟时间为横轴的收敛对比,以及低/高频带上的平均幅值误差。 (Left) Images generated with our XL model at 256 resolution. Beware, 2 impostors (real images from the ImageNet training set) are hiding in these images. Place your bet on which ones they are and check the solution on page 10. (Right) FID vs. training epoch for an XL model. Our achieves faster convergence than JiT without requiring architectural modifications. 批判点评:这篇的诊断比方法更值得记住。把「细节学得慢」归因到损失函数对频率的隐含加权,而不是归因到容量或架构,是一次位置正确的归因——1/f² 是自然图像的统计事实,像素损失对空间误差的均匀对待则是实现上的默认选择,两者相乘就必然产出低频偏置。论文用两层证据把这条推理钉住:真实数据上功率谱的系统性偏差,以及只含两个频率的玩具实验里高频模式的完全缺席。后者尤其干净,因为它排除了容量不足这个替代解释。方法侧的克制也是优点:不改架构、可直接替换损失,这类改动的采用成本极低,而先频域后像素的两段式安排还有收敛曲线作为依据,不是拍出来的。带通 FID 分析是全篇最诚实的一段——它主动说明低频和中频最终会收敛到同一水平,优势集中在高频和更早的收敛时点,这比只报一个总 FID 要可信得多。几处需要留意。「最多 40%」是上界,跨规模的期望收益应当打折看;而高频段上基线中途曾追上、之后又被反超,说明这条优势并不单调,实际收益取决于训练预算落在曲线的哪一段。更实质的是适用范围:诊断成立的前提是像素空间训练,而当前主流做法大量在 latent 空间做 flow matching,latent 的谱统计与自然图像并不相同,这套配平能否平移过去,论文没有回答。还有 f-loss 引入的权重超参需要调(论文有相应消融),「drop-in」的说法在工程上仍有调参成本。最后必须提醒:源文件中带通 FID 与定性收敛这两张图的图注仍留着作者的「Placeholder / to be updated」字样,这是预印本未定稿的迹象,引用这两处时应当谨慎。 4. MeRoPE:大基线相机控制不再爆范数 MeRoPE: Metric Rotary Position Embedding for Camera-Controlled Video Generation | 香港科技大学、卓驭科技 | arXiv:2609.01252 关键词:相机可控视频生成,几何位置编码,保范数注意力,旋转位置编码,度量位移,对极视差先验,MeRoPE 前序问题:相机可控的视频生成普遍依赖几何感知的位置编码,把 token 条件在相机外参和逐 token 的视线方向上。论文指出这类方案有一个依赖尺度的失效模式,而且很具体:齐次投影式的编码会让注意力 logits 和特征范数随物理平移基线无界增长。翻译成实践语言就是——在真实的、以米为单位的相机轨迹上,相机走得越远,注意力分布和特征幅值就越容易失控。论文的动机实验把这个失效可视化了:沿一条直线轨迹,观察最后一帧中心 query token 对所有先前 key 帧的跨帧注意力质量分布,随着基线增大,既有方案会把越来越多的注意力质量分配给遥远的早期帧。这不是精度问题而是稳定性问题:编码本身在长距离下会扭曲注意力的结构,而自动驾驶这类场景恰恰全是大基线轨迹。 本文贡献:MeRoPE 的设计目标直接定在「保范数」上,三个部件各管一件事。第一,用正交旋转块编码标定视线之间的相对朝向——正交变换天然不改变向量长度,这是保范数的来源。第二,把原始的度量位移映射成多频旋转相位,也就是借 RoPE 的思路处理物理平移,而不是把位移当作可以无界增长的数值直接喂进去。第三,沿对极弧加一个视差锚定的对应先验,为跨帧的点对应提供几何约束。三者合起来的性质是论文明确主张的:严格保持特征范数、无论物理平移尺度多大都能限住 softmax 前的注意力 logits、并对全局刚体坐标变换保持精确不变性——最后这条意味着换世界坐标原点不会改变模型行为。论文还给出了这套编码的代数结构,把成对的 query-key 调制写成视差 MinRot、视线局部 MinRot、平移 RoPE 与原生 RoPE 四个块的正交直和,因此各部件互不干扰。 实验效果:论文在两个互补的数据集上验证:nuScenes 覆盖大基线轨迹,PanShot 覆盖多样的相机光学参数。结论是 MeRoPE 取得了比既有编码更强的相机控制,并且在旋转和平移两个维度上都达到了生成的相机运动与条件位姿之间的最佳一致性。定性一侧,论文在两个代表性 nuScenes 场景上给出三种指令轨迹(原始、左转、右转)下的结果,每行最左侧用鸟瞰图对照「指令路径」(实线)与「从生成视频中用 VGGT 恢复出的路径」(虚线),也就是说控制精度是通过反解生成结果来度量的,而不是自评。PanShot 一侧则跨越从针孔到鱼眼的相机光学范围,视场角与畸变从 (97°, 0.00) 到 (173°, 1.66)。此外论文报告了相机编码各部件的消融、架构与注入位置的消融、以及 query-camera 分组的计算开销(单块结果用一张 H20,整模结果用四张 H20 并匹配 15 个块的注入调度)。 Qualitative video generation under camera pose control. Visual results on two representative nuScenes scenes under three commanded trajectories (original, left turn, right turn). In each row, the leftmost plot displays the bird's-eye view of the commanded path (solid) and the path recovered from the generated video by VGGT-$\Omega$ (dashed), followed by generated video frames sampled at $t \in \{0, 16, 32, 48\}$. 批判点评:这篇的贡献形态是「把一个稳定性缺陷讲成可证的性质」,这比刷指标更耐读。它没有停在「大基线下效果变差」这种经验观察,而是指出了机制——齐次投影编码使 logits 与特征范数随物理平移无界增长,并用一张跨帧注意力质量图把失效形态摆出来:注意力被越拉越远的早期帧吸走。有了这个诊断,解法就有了明确的设计约束,即保范数;正交旋转块、把度量位移映射为多频旋转相位、以及沿对极弧的视差先验,三者都是服务于这个约束的手段而非拼凑。把成对调制写成四个块的正交直和,让各部件互不干扰,这种可分析的结构在位置编码这类基础组件上很值得。对全局刚体变换的精确不变性也是实用性质——它意味着换坐标原点不会改变行为,省掉一类隐蔽 bug。评测设计同样克制:nuScenes 管大基线、PanShot 管从针孔到鱼眼的光学多样性,两者互补而非同质堆叠;用 VGGT 从生成视频反解相机轨迹再与指令轨迹对照,比让模型自评要硬。需要注意的边界。第一,反解式度量把工具误差引进来了,VGGT 在大视场或强畸变下的精度本身就会波动,因此在 PanShot 的鱼眼一端,指标差异有多少来自生成、有多少来自反解,需要谨慎切分。第二,论文主张的是相机可控性上的领先,而不是视频质量的全面领先,这两件事在实践中会互相牵制——把位姿咬得更死通常要付出内容自由度的代价,摘要层面没有量化这个代价。第三,训练轨迹以前向主导走廊和大幅横向/转向机动为主,都是驾驶式运动,手持抖动、快速旋转这类分布未经检验。第四,保范数是个好性质,但它保证的是不发散,不等于注意力分配在语义上是对的;范数受控与对应关系正确之间仍有距离。最后,方法需要标定的视线与度量尺度的位姿作为输入,这在有标定的驾驶数据上不成问题,迁移到无标定的野外视频则是另一回事。 5. GlyphAnchor:字形块锚定长文本渲染 GlyphAnchor: Enhancing Visual Text Rendering via Position-Anchored Glyph Priors | 复旦大学、小红书、上海创智学院 | arXiv:2609.02349 关键词:视觉文字渲染,字形先验,位置锚定,扩散Transformer,分阶段SFT,文字感知后训练,GlyphAnchor 前序问题:把文字画准,至今仍是图像生成与编辑模型的老大难,尤其当目标里含有长文本、结构复杂的文本、密集排布的文本,或者生僻字。论文把已有路线归成两类并各指一处不足:一类靠更强的骨干和以数据为中心的训练来提升原生渲染能力,但不引入显式的字形先验;另一类引入了字形先验,却依赖专门设计,在上述这些困难场景下仍不够准确也不够稳健。也就是说,前者缺少关于「这个字长什么样」的直接信息,后者虽有信息但注入方式不够可靠。真正的难点在于文字渲染同时要求两件很难兼得的事:字形本身要正确(笔画级的精确),以及文字要落在图像里对的位置、对的透视和对的排布上。 本文贡献:GlyphAnchor 的做法是给骨干加一组轻量的「字形块条件」,而关键在于这些条件的位置是通过模型原生的位置编码锚定到目标图像上的——不是另起一套空间对齐机制,而是复用模型已有的位置表示,因此注入方式与骨干天然兼容。论文的架构图把这个设计说得更具体:提示词、可选的源图像、以及渲染出来的字形块图像各自被编码成 token 后拼接,送入文生图或图像编辑的扩散 Transformer 骨干;得到的字形块 token 被放进一个额外的条件帧里,形成一个「虚拟字形平面」,这个平面的坐标就锚定在目标图像的坐标系上。训练上分两步:先做分阶段的监督微调把这个能力建立起来,再用文字感知的后训练进一步提升稳健性。方法同时适用于文生图和图像编辑两种设定,并且论文强调它可以在多个骨干上生效。此外作者还提出 InfoTextBench,用于评测文本密集场景下的视觉文字渲染,生成与编辑两种设定都覆盖。 Overview of GlyphAnchor. Prompt, optional source images, and rendered glyph patch images are encoded into tokens and concatenated before a text-to-image or image-editing diffusion-transformer backbone. The resulting glyph patch tokens are placed in an additional condition frame, forming a virtual glyph plane whose coordinates are anchored to the target layout. 实验效果:论文在多个骨干与多个基准上做了实验,覆盖长文本、结构复杂文本、密集排布文本以及生僻字这几类困难场景,结论是 GlyphAnchor 持续改善文字保真度,同时保持整体图像质量。定性一侧,论文给出面向文本密集困难样例的对比(图注注明建议放大查看),并配了两组消融的定性结果:一组是位置锚定的消融,一组是分阶段监督微调的消融——两组都以视觉对比呈现。此外论文用 FireRed-Image-Edit-1.1 的样例来说明各项设计选择的动机。 Qualitative comparison on challenging text-rich cases. Best viewed with zoom. 批判点评:这篇的判断力体现在注入方式上。给扩散模型加字形先验并不新,难的是让「这个字长什么样」和「它该出现在哪」这两件事同时成立;很多方案在字形上做得细,却要另配一套空间对齐机制,结果引入新的失配。GlyphAnchor 选择复用骨干原生的位置编码来锚定字形块的位置,把字形块 token 放进一个额外条件帧、构成坐标锚定在目标图像上的「虚拟字形平面」——这个设计的好处是不与骨干的空间表示打架,也解释了它为何能在多个骨干上生效。条件保持轻量、训练分成「分阶段 SFT 建立能力 + 文字感知后训练提升稳健性」两步,也是符合工程直觉的安排:前者管会不会,后者管稳不稳。同时覆盖文生图与图像编辑两种设定,比只做其中一侧更有实用价值,因为真实需求里改字往往比从零生成更常见。需要留意证据的粒度。摘要层面给的是「持续改善文字保真度、同时保持整体图像质量」这样的方向性表述,没有具体的文字准确率数字或提升幅度;两组关键消融(位置锚定、分阶段 SFT)也以定性视觉对比为主,图注还提示需要放大查看,这意味着差异未必显著到一眼可辨。而文字渲染恰恰是最适合定量的任务之一——字符级准确率、词级准确率都是成熟指标,缺少这些数字会让「持续改善」难以校准。其次,InfoTextBench 由作者团队自建,用自家基准验证自家方法时,结论的说服力取决于该基准与既有基准的一致性,这一点需要在正文中确认。第三,「保持整体图像质量」是个需要警惕的表述:字形块条件本质上是往生成过程里塞入强先验,在文字区域之外是否引入风格或纹理上的副作用,值得看定量的图像质量指标而非只看示例图。最后,生僻字这一类的收益高度依赖字形渲染器的字体覆盖,这部分是方法外的工程依赖,实际落地时往往才是瓶颈。 6. CameraEditor:相机编辑改成时序预测 CameraEditor: Camera-Controlled Image Editing via Video-Prior Sequential Modeling | 西安交通大学、新加坡科技研究局(A*STAR) | arXiv:2609.01479 关键词:相机可控图像编辑,视频扩散先验,Chain-of-Frames,几何感知路由,全景裁切数据,ACM MM 2026,CameraEditor 前序问题:除了语义内容之外,相机参数其实决定了一张图的几何透视与外观。但现有图像编辑模型虽然在语义和风格操控上很强,一旦要求按相机参数做显式控制就暴露短板。论文把这个短板刻画成一个两难:面对大幅视角变化,指令驱动的模型要么出现结构撕裂,要么生成保守的结果、干脆无视几何指令。论文的动机图把失败拆得更细,指出三类典型问题:术语误解(把几何位移和语义变化混为一谈)、参数不精确(做不到按确切角度调整)、以及身份丢失(大幅视角变化下结构撕裂)。根子上的困难是,文本指令对几何量的表达本身是含糊的——「稍微转一点」既没有单位也没有参照系,而相机参数是精确的物理量。 本文贡献:CameraEditor 的关键一步是改问题的形式:把相机可控编辑从一个空间问题重写成时序预测问题,从而能借用视频扩散模型的时间连贯性作为先验。围绕这一步有三个部件。第一,配一个显式的几何感知模块,把几何量从文本的含糊中解放出来;论文的架构图说明推理时由一个路由机制通过 GeoCalib 选出最优的参考先验,以实现精确的视角对齐。第二,用动态全景裁切构造几何上严格的参考-目标对——这是数据侧的处置:全景图被参数化后裁切成参考-目标对,再经超分与视觉语言模型筛选,最后生成中间帧形成连续的时序序列;论文还单独用一张图展示了偏航、俯仰、翻滚、垂直视场角与径向畸变各自对裁切透视的影响。第三,也是最巧的一处:刻意插入中间过渡帧,把大幅视角变化分解成若干小步,为内容身份与空间连贯提供时间缓冲。论文构建了 5760 个训练实例,并作为独立贡献提出 CamEditor-Bench——一个与模型无关的评测套件,含 462 个测试用例。该文已被 ACM Multimedia 2026 接收。 Overview of CameraEditor. (a) Generation Pipeline: A video diffusion model generates the target Chain of Frames (CoF) sequence conditioned on the source image and reference visual sequence. (b) Dynamic Routing: A routing mechanism selects the optimal reference prior via GeoCalib during inference for precise viewpoint alignment. 实验效果:论文报告 CameraEditor 在相机控制精度与源身份保持两方面达到当前最优,优于既有方法。证据形态上,定性结果与几何误差图并排给出:每个方法的右侧面板分别显示 PF-I(上)与 PF-T(下)误差,暖色表示偏差更大,也就是说几何准确性是用透视场(Perspective Field)热力图来验证的,而非仅凭肉眼。扩展对比进一步显示,该框架在与目标相机几何对齐的同时,避免了标准扩散编辑中常见的身份漂移与结构幻觉。两组消融值得注意:一是相机感知模块的选择——随机路由或基于视觉语言模型的理解(Puffin 变体)给出的错误初始估计会导致灾难性的结构失真,而 GeoCalib 驱动的路由提供了稳健的几何锚点;二是中间过渡帧数量 N 的消融——直接单步生成(N=0)在大幅视角变化下出现空间撕裂与身份丢失,把 N 增加到 4、8、12 则提供了更强的连续几何先验。 Qualitative results alongside geometric error maps. For each method, the right panels display PF-I (top) and PF-T (bottom) errors, where warmer colors indicate larger deviations. 批判点评:这篇最值得学的是问题重述本身。相机可控编辑之所以难,是因为单张图的大幅视角变化本质上要求补出未观测区域,而这正是空间形式下最容易撕裂的地方;把它改写成时序预测,就把视频扩散模型积累的时间连贯性先验借了过来——这不是换个模型跑跑,而是换了一个更适配该困难的问题形式。顺着这条线,「插入中间过渡帧把大幅视角变化拆成小步」这个设计就变得顺理成章,而且消融数据支持得很直接:N=0 的单步生成出现撕裂和身份丢失,N 增到 4、8、12 则连续几何先验越来越强。用 GeoCalib 提供几何锚点、而不是让视觉语言模型去理解几何指令,同样是个有判断力的选择,消融里随机路由与 Puffin 变体导致「灾难性结构失真」是很有说服力的反证——它说明这类任务的瓶颈在几何估计的可靠性,而不在语言理解。用透视场热力图(PF-I/PF-T)来验证几何准确性,也比只给示例图硬。几处限制需要说清。首先,PF 是估计出来的量,用它当尺子意味着评测精度受估计器约束,在强畸变或大视场情形下这层不确定性会放大。其次,训练集只有 5760 个实例,且由全景图裁切构造——全景的几何分布天然受限(常见于特定拍摄设备与场景类型),因此对超出该分布的相机参数组合,泛化能力未经验证;CamEditor-Bench 的 462 个用例同为自建,自评成分需要读者自行折扣。第三,过渡帧是把双刃剑:N 越大几何先验越强,但推理成本随之线性上升,而论文摘要没给对应的时延数字,实际部署时这是必须先算清的账。第四,「源身份保持」在插入多帧过渡后仍是脆弱的——每一帧都是生成的,误差有累积的可能,而聚合指标不容易暴露偶发的严重失败。最后,方法依赖视频扩散骨干,继承了它的分辨率与时长约束,这在图像编辑这个本应轻量的场景里是一笔不小的开销。 7. LightBridge:3DGS重光照一次前向出结果 LightBridge: Feed-Forward Generative Relighting for 3D Gaussian Splatting | 中国科学技术大学 | arXiv:2609.02543 关键词:3D高斯溅射,可控重光照,前向推理,潜空间桥接扩散,高斯传播Transformer,多光照数据集,LightBridge 前序问题:3D 高斯溅射能做到高质量的实时新视角合成,但产出的资产有一个硬伤:光照是烘死在里面的,没法轻松重打光。已有路线各有代价。逆渲染方法为每个场景优化一套简化的反射率与光照模型,既限制效率也限制重光照质量——简化模型本身就装不下真实光照的复杂度。而近期的生成式方法借大型扩散模型做出了逼真的光照编辑,但要把它们用到 3DGS 上,通常还需要一个额外的逐场景优化阶段,把编辑后的外观重新烘回到表示里。也就是说,前者受限于模型表达力,后者受限于流程——每换一个场景就得再优化一次,这在资产量级上根本不划算。 本文贡献:LightBridge 的目标很明确:一次前向就完成完整 3DGS 资产的可控重光照,不做逐场景优化。为了能训练这样一个前向模型,作者先构建了一个大规模的多光照重光照数据集,为同一批场景提供成对的源观测与目标观测;论文展示了卧室与餐厅场景的样例——每列对应一种光照条件、每行对应一个匹配的相机视角,场景几何与相机位姿保持固定,只让光源状态、强度与颜色在列间变化,这种「控制变量」式的构造正是前向监督所需要的。方法本身有两个部件。第一是 Latent Bridge Relighting Diffusion:把重光照建模成潜空间里从源到目标的传输,从而能一步提取出 2D 视觉 token,不必做迭代式的扩散采样——这是省掉推理开销的关键。第二是 Gaussian Propagation Transformer:用一个点 Transformer,先做稀疏的图像到点自注意力、再做点到图像交叉注意力,把这些视觉线索高效地传播到完整的 3DGS 上,同时避免在所有图像 token 与高斯 token 之间做全注意力——后者在完整场景规模下是不可承受的。 Pipeline of LightBridge. The framework first uses Multi-Illumination Relighting Dataset for paired supervision, then extracts the 2D Visual Token with Latent Bridge Relighting Diffusion, and finally propagates it to the full 3DGS representation with Gaussian Propagation Transformer. 实验效果:论文的实验验证了上述设计,主张在具备竞争力的重光照质量之下,能够一次前向高效预测出完整的、已重光照的 3DGS 资产,且不需要针对场景的优化。定性一侧最关键的一组是在重光照视频轨迹之外的视角上做对比:每个样例从左到右依次是源 3DGS 渲染、由 GR3EN 优化出的表示所渲染的结果、以及 LightBridge 在同一相机位姿与同一目标光照下预测的重光照 3DGS 的渲染结果——选在轨迹外视角比较,正是为了检验重光照是否真的落进了 3D 表示而非只在训练视角上成立。此外论文给出了留出的餐厅与厨房场景上的视频重光照对比(每个结果沿共享的输入相机轨迹采样四帧),并用一张俯视图展示了某个代表性房间里六条局部相机轨迹的布置。训练侧的消融显示,高斯传播用目标潜变量与潜变量速度两种 token 训练时,速度 token 收敛更快,但两者最终损失接近。 Qualitative comparison at viewpoints outside the relighting video trajectory. From left to right, each example shows the source 3DGS rendering, the result rendered from the representation optimized by GR3EN, and the corresponding rendering from the relit 3DGS predicted by LightBridge under the same camera pose and target lighting. % Note that GR3EN fails to relight the scene whether the target light is visible (top row), as well as when it is not directly visible (bottom row) 批判点评:这篇的取舍很清楚,也因此值得读:它不追求重光照质量上的领先,而是把「免逐场景优化」这一条做成硬指标。这个选择是对的,因为生成式重光照真正的落地障碍从来不是单张图好不好看,而是每换一个场景都要再优化一轮——在资产规模上这条成本曲线根本压不下来。两个部件都服务于这个目标:把重光照建模成潜空间里源到目标的传输,从而一步取出视觉 token、免掉迭代采样;再用先「图像到点」稀疏自注意力、后「点到图像」交叉注意力的方式把线索铺到完整 3DGS 上,规避全注意力的组合爆炸。数据集的构造尤其体现方法意识:固定几何与相机位姿、只变光源状态/强度/颜色,这种控制变量式的成对监督正是前向模型能学到「只改光、不改结构」的前提。评测设计里最有判断力的一处是选在重光照视频轨迹之外的视角做对比——这直接检验重光照是否真的落进了 3D 表示,而不是只在被监督到的视角上成立,很多同类工作恰恰在这里含糊。需要看清几处边界。第一,摘要自己用的是「有竞争力的质量」,也就是承认这是以效率换相当质量;如果下游对光照真实感的要求高于对吞吐的要求,逐场景优化路线仍可能更合适。第二,数据集是作者自建的合成室内场景(卧室、餐厅、厨房这类),室内合成数据的光照统计与真实采集差距不小,而重光照恰恰高度依赖材质与间接光的真实性,因此室外场景与真实数据上的表现完全未知。第三,前向模型的可控性边界值得追问:它能处理的是「现有光源的状态、强度与颜色」这类控制,是否支持新增光源、改变光源位置或换成完全不同的光照环境,摘要没有说清。第四,一步式的潜空间传输省掉了迭代采样,但也放弃了扩散采样在质量上的调节余地——没有「多花几步换更好结果」这个旋钮,在困难样例上没有退路。最后,代码与数据集要等录用后公开,当前无法独立复核。 8. VibeVoice-ASR-Streaming:流式边听边分谁在说话 VibeVoice-ASR-Streaming Technical Report | 微软研究院、中国科学院大学、上海交通大学 | arXiv:2609.02812 关键词:流式语音识别,说话人归属,端到端统一建模,音频分块交错,前瞻音频,开源权重,VibeVoice-ASR-Streaming 前序问题:传统的说话人归属语音识别把「识别说了什么」和「分辨谁在说」当成两个独立任务串起来做。近期像 VibeVoice-ASR 这样的端到端模型已经把两者统一进单个模型,但仍有一处关键短板:这些统一模型主要支持离线识别,也就是要等音频结束才能出结果。这对实时语音助手和智能体是致命的——它们需要的是低延迟。于是问题变成:能否在保留「统一建模」这个优势的同时,把它做成流式?难点在于说话人归属天生带有全局性,判断「谁在说」往往需要参照整段音频里的其他片段,而流式意味着只能看到已经到达的部分。 本文贡献:VibeVoice-ASR-Streaming 是最早一批基于大语言模型的端到端流式说话人归属 ASR 方案之一。它的机制说起来很朴素:把固定大小的音频块、少量前瞻音频、以及此前已生成的文本三者交错编排在同一个自回归上下文里。论文的架构图给出了更精确的描述——语音块与说话人归属的文本块在单个自回归上下文中交错,每个块后面跟一段固定 L=4 帧(0.5 秒)的前瞻音频,然后才生成该块对应的文本。这个安排的效果是,模型可以在语音到达的同时产出「谁说了什么」,而不需要一个独立的说话人分离阶段——分离能力被吸收进同一个自回归过程里。前瞻窗口的存在是一处务实的折中:它用固定的 0.5 秒延迟代价,换取块边界附近判断所需的一点未来上下文。作者发布了 1.5B 与 7B 两个规模的模型权重以及推理代码。 Architecture of VibeVoice-ASR-Streaming. Speech chunks $X_k$ and speaker-attributed text chunks $Y_k$ are interleaved in a single autoregressive context, and each chunk is followed by a fixed $L=4$-frame (0.5 s) lookahead before its text is generated. 实验效果:识别精度方面,7B 模型在五个评测集上取得了最低的平均 WER/CER。说话人归属方面,在 13 个评测设定中的 12 个取得最佳或并列最佳。论文的对比图把范围说得更具体:与四个已部署的商用流式 ASR 系统在四个会议基准与 MLC-Challenge 上比较,其中 AliMeeting 与 AISHELL-4 用 CER 评估、AMI-SDM 与 AMI-IHM 用 WER 评估;MLC-Challenge 里日语和韩语用 CER、其余七种语言用 WER。为保证可比性,所有在线 API 的音频都按 2.9 秒的块流式送入,与本模型的块大小对齐。论文另外报告了单说话人识别结果,但明确说明这是作为一种类别检查而非竞争性主张来呈现的。 Recognition error of VibeVoice-ASR-Streaming-7B and four deployed streaming ASR systems on the four meeting benchmarks and MLC-Challenge. AliMeeting and AISHELL-4 are evaluated with CER, while AMI-SDM and AMI-IHM are evaluated with WER. For MLC-Challenge, Japanese and Korean are evaluated with CER and the remaining seven languages with WER; the reported value is the macro average over the nine evaluated languages. 批判点评:这篇的价值在于把一个已经被验证的统一建模思路推进到流式,而所用手段刻意保持简单——没有引入新的分离模块或额外的对齐机制,就是把音频块、少量前瞻音频、历史文本交错进同一个自回归上下文。这种「用上下文编排替代架构增补」的做法在大语言模型时代往往更稳,因为它不破坏预训练带来的能力。取消独立的说话人分离阶段是真正的收益:传统串联方案里分离阶段的错误会直接污染下游归属,而统一进自回归过程后这个误差传递链被砍掉了。固定 L=4 帧(0.5 秒)前瞻是个诚实的折中——说话人归属在块边界附近确实需要一点未来信息,明确标出这个代价比含糊处理要好。评测上把在线 API 的输入统一到 2.9 秒块以对齐自家块大小,是对可比性的主动维护,值得肯定;同时把单说话人结果明确降格为「类别检查而非竞争性主张」,这种自我限定在技术报告里不多见。开放 1.5B 与 7B 权重及推理代码,让结论可被独立复核。需要留意的地方。第一,两个头号数字都是聚合或近似全胜的表述——「五个集上平均 WER/CER 最低」不排除单个数据集上落后,「13 个设定中 12 个最佳或并列最佳」也明确留了一个未领先的设定,读的时候不宜简化为全面领先。第二,与商用系统横比先天不可控:对方的模型规模、内部延迟策略、是否使用更多上下文都不透明,块大小对齐只解决了输入侧的一个维度。第三,0.5 秒前瞻只是算法延迟下限,真实端到端时延还要加上 7B 模型的计算耗时,而报告未给出吞吐或实时率数字——对「实时语音助手」这个宣称的应用场景,这恰恰是最该给的数字。第四,说话人归属的全局性并未被消除而是被上下文长度约束了:随着会议时长增加,早期说话人身份能否稳定保持,是流式方案的经典失效点,需要按时长分层的结果才能判断。最后,多语言部分的语言分布不均,MLC-Challenge 上九种语言各自的样本量与难度差异会影响均值的解读。 9. Kirin:野外视频学出四足动物动作 Kirin: Animal Motion Generation from In-the-Wild Video | 伊利诺伊大学厄巴纳-香槟分校、宾夕法尼亚大学、斯坦福大学、剑桥大学 | arXiv:2609.01823 关键词:动物运动生成,野外视频重建,视频文本运动三元组,AiM3D数据集,图像条件化,自动绑定动画,ECCV 2026 前序问题:理解动物运动对建模动物行为与生物力学是基础性的,但这个方向的进展远远落后于人体运动研究,原因很直接:缺少高质量运动数据。人体运动可以在受控环境里用动捕采集,而对绝大多数动物物种这根本不现实——你没法给野生四足动物贴标记点。结果是现有数据集规模小、域受限,这又直接限制了动画等下游应用。这里的困境有点循环:没有数据就训不出运动先验,没有运动先验就只能靠人工逐帧调动画。论文选择的突破口是绕开采集这件事本身——既然受控采集做不到,那就从已经大量存在的野外动物视频里把运动重建出来。 本文贡献:Kirin 是一条从视频到可渲染动画资产的完整链路,包含重建、学习先验、生成三段。第一段是数据:利用大量野外动物视频重建出 3D 运动序列并配上字幕,构成 AiM3D——论文称其为首个为四足动物提供对齐的「视频-文本-运动」三元组的大规模数据集。重建这一步的做法是把问题拆开:借现成的 3D 四足动物重建方法和 3D 跟踪方法分别推断关节运动与全局位移,再把两者合起来得到最终的运动重建。这个拆分很关键,因为「身体怎么动」和「整体往哪走」在野外视频里的可观测性完全不同。第二段是模型:在 AiM3D 上训练一个视觉引导的运动生成模型,同时以文本和图像为条件——图像条件不是可选项而是有实质作用的,论文的消融显示在相同文本提示「一只动物在行走」下,不同输入图像会带来相应的骨架变化与步态差异,也就是说图像承担了「这是什么动物、身体比例如何」这部分信息。第三段是落地:借一个现成的图像到 3D 模型自动完成绑定与动画,把生成的运动直接套到 3D 网格上,产出可直接渲染的动物动画。该文已被 ECCV 2026 接收。 Left: Overview of Kirin generation pipeline. A text description and an image are provided as inputs. The text and image are used for motion generation, while the image is also used to generate a T-posed mesh. The animation module then rigs the generated motion onto the mesh to produce the final animated 3D model. Right: Overview of the motion generation architecture. Text features are extracted using a frozen DistilBERT encoder, and image features are extracted using a frozen DINOv3 encoder. The text, image, and denoising step embeddings are combined and fed into a transformer decoder with cross-attention to generate motion sequences. % annotate the notations in the figure, add subtitles for left and right parts, use darker gray color for arrows, texts are too small 实验效果:论文与两个基线做了定性对比,两组都直指对手的具体失效模式。与 Puppeteer 比的是网格动画:在相同的文本与图像输入下,Puppeteer 常常在输入网格上产生很小甚至没有运动,而本方法生成的动作会跟随文本提示。与 AniMo 比的是骨架运动:AniMo 只用文本,本方法同时以文本和图像为条件;AniMo 出现的失败包括运动不遵循提示词以及骨架形状不一致,而本方法产出的运动更真实。数据侧论文给出多层展示:动物关节运动的数据样例(每行左侧是两段运动的文本描述,随后是视频帧与对应的重建 3D 运动)、全局位移的可视化(把根关节轨迹投影到地面以显示整体位移)、以及数据集统计——各动物类别的视频数与帧数分布、以及全数据集上的运动类型分布(每个视频被赋予一到三个运动标签)。另有一组补充结果专门展示全局运动更显著的例子。 Visual comparison of generated mesh animation with the baseline. The left columns show the input text and image, which are used for both pipelines. Puppeteer often produces little or no motion on the input mesh, whereas our method generates realistic movements that follow the text prompt. 批判点评:这篇解题的思路很值得学:面对「受控采集在动物身上不可行」这个硬约束,它没有去改进采集,而是把已经海量存在的野外视频当成数据源,用重建把无标注视频转成运动监督。这一步走通了,整个循环就被打开了。重建阶段把「关节运动」与「全局位移」分开处理、再合并,是有针对性的设计——野外视频里身体姿态和整体位移的可观测性差别很大,混在一起估计容易互相污染。图像条件的引入也不是堆砌模态:消融显示同一句「一只动物在行走」配不同图像会产出相应的骨架与步态差异,说明图像承担了物种与身体比例这部分文本说不清的信息,这正是动物域比人体域更需要视觉条件的原因。最后接上现成的图像到 3D 模型自动绑定,把产物一路推到「可直接渲染」,让这项工作对动画流程有实际可用性,而不是停在骨架序列。两组基线对比也选得准,各自指向具体失效模式:Puppeteer 几乎不动,AniMo 不遵循提示且骨架不一致。需要清楚的是证据形态与数据性质。第一,摘要层面给的主要是定性对比和数据集统计,缺少定量指标——运动生成有成熟的评价手段(关节误差、足部滑动、用户研究胜率),没有这些数字时「更真实」难以校准。第二,也是更根本的:AiM3D 的「真值」是用现成的 3D 重建与跟踪方法从野外视频推断出来的,不是动捕级真值,因此数据里必然带有上游工具的系统性偏差,而在这份数据上训练的模型会继承这些偏差;这不否定其价值,但意味着它衡量的是「与重建结果一致」而非「与真实运动一致」。第三,覆盖面限定在四足动物,鸟类、鱼类等形态差异大的类别未涉及,而这些恰恰是动画中同样常见的需求。第四,野外视频的运动分布天然偏向常见行为(行走、奔跑),罕见动作与高动态动作的样本很可能稀疏,数据集的运动类型分布图应能反映这一点。最后,自动绑定这一环依赖外部图像到 3D 模型,其网格质量与拓扑会直接决定最终动画的可用性,这部分不在本文的控制范围内。 10. RIG-BENCH:2000题测生成模型会不会推理 Thinking in Pictures: A Systematic Benchmark for Reasoning-driven Image Generation | 伊利诺伊大学厄巴纳-香槟分校、纽约大学 | arXiv:2609.02864 关键词:推理驱动图像生成,统一生成模型,评测基准,视觉推理,推理生成落差,世界模拟器,RIG-BENCH 前序问题:统一生成模型和世界模拟器在视觉感知与合成上已经拿到了前所未有的结果,但论文指出这些模型主要依赖表层的事件对齐,高层视觉推理的能力基本没被认真考察过。作者提出的判据是「Reasoning-to-Generation」——真正的视觉生成智能应当能从视觉输入里推断出隐含规则,然后把解答以精确的、受逻辑约束的视觉结果呈现出来。注意这个要求比常见的「按提示词画对」严格得多:它不是考察模型能否理解描述,而是考察模型能否在没有被告知规则的情况下自己找出规则,并且把找出来的规则正确地画出来。这两步任何一步断掉,结果就不成立,而现有基准基本不区分这两种失败。 本文贡献:RIG-BENCH 的贡献是把上面这个能力做成可系统评测的东西,覆盖四个认知负荷较高的域:基于概念、基于变换、模式与结构、以及基于场景,共 2000 个精选样本。论文的数据总览图说明了每类题的构造:每个条目提供视觉上下文(输入/上下文)加一张未展示的真值图像(GT Target),模型必须从视觉上下文推断出正确答案并以图像形式产出。评测流程分三步且刻意收紧了口径:第一步「源任务接口」,从已建立的视觉推理基准里取「图+题+选项」,经人工改写成「图+提示词+无选项」——抹掉选项是关键,因为一旦给选项,任务就退化成选择而非生成;第二步「统一生成协议」,被选模型接收上下文图像加提示词,直接生成答案图像;第三步「打分与报告」,把生成图与真值图的比较同时交给三条路径:裁判模型评分、自动指标(DINO、CLIP-I、LPIPS、FID)、以及人工 rubric 与人类手绘答案的对照,最后汇总成总分。2000 个样本进一步被拆成四大任务族之下的十一个细粒度子任务。 End-to-end pipeline of RIG-Bench. (1) Source Task Interface: items are drawn from established visual reasoning benchmarks and manually re-cast with an image-based output prompt (no options exposed to the model). (2) Unified Generation Protocol: selected models receive the context images plus the prompt and generate the answer image directly. (3) Scoring and Reporting: each generation is compared against the ground-truth image using both an LLM judge over a hand-written rubric and automatic perceptual metrics, with an additional human study for calibration. 实验效果:论文对当前最先进的统一生成模型以及图像/视频生成模型做了广泛评测,核心结论是存在显著的「推理-生成落差」:模型经常产出局部看起来合理、但全局逻辑不成立的输出。结果呈现上,论文给出九个生成模型在各子任务上的评分对比,并用线型区分模型类别——实线为闭源商用图像生成器、虚线为开源图像生成器、点线为视频生成器,因此可以看出这个落差是跨类别普遍存在还是集中于某一类。论文还做了用户研究(附带评测界面截图),并给出开源模型、闭源商用模型与视频生成模型各自的补充定性样例。作者将 RIG-BENCH 定位为一个诊断框架,用于引导下一代逻辑上更有依据的统一生成模型与世界模拟器的发展。 Distribution of the $2{,}000$ samples in RIG-Bench. % The inner ring summarizes the four task families; the outer % ring breaks them down into eleven fine-grained subtasks. 批判点评:这篇把一个含糊的担忧变成了可测量的东西,这是基准类工作最该做的事。「模型只是在做表层事件对齐」这句判断在圈内流传已久,但缺少能证伪它的题目;RIG-BENCH 给出的定义相当锋利——从视觉输入推断隐含规则,再把解答画出来,两步都要成立。协议设计里最有判断力的一处是抹掉选项:一旦给出选项,任务就从「生成」退化成「识别 + 挑选」,而这恰恰是很多多模态评测无意间放水的地方;改写成图像输出、隐去选项,才真正逼模型把推理结果落到像素上。四大任务族下再分十一个细粒度子任务,让失败可以被定位到具体的推理类型,而不是只得到一个总分。打分环节没有偷懒地只用一种尺子,而是让裁判模型、自动相似度指标与人工 rubric 三路并行,这在生成式评测里是必要的冗余。用线型区分闭源图像生成器、开源图像生成器与视频生成器,也是有意为之——它让读者能判断「推理-生成落差」是全行业共性还是某类架构的问题,这比一张排行榜有用得多。「局部合理、全局不成立」这个失败刻画本身就很有价值,它指向的是生成模型缺少全局一致性约束,而非缺少局部保真度。需要注意几处。第一,这是诊断而非解法,它告诉我们模型不会推理,但没有给出为什么不会——是推理能力缺失,还是推理正确却无法用像素准确表达,这两种解释后果完全不同,而现有打分方式很难把它们分开。第二,题目由既有视觉推理基准人工改写而来,因此难度分布、覆盖偏好乃至潜在的数据污染都从源基准继承,某些模型在预训练中见过相关题型的风险无法完全排除。第三,自动指标这一路(DINO、CLIP-I、LPIPS、FID)本质上度量的是与真值图的视觉相似度,而很多推理题的正确解在视觉上并不唯一,这会系统性压低分数、可能夸大所谓落差;论文用裁判模型与人工 rubric 来平衡,但三路分数如何加权、彼此一致性如何,摘要层面没有交代。第四,摘要没有给出各模型的具体分数与排名,「显著落差」的量级因此难以判断。最后,作为诊断框架,它的长期价值取决于是否被后续工作当作优化目标;而一旦被当作优化目标,隐含规则类题目又特别容易被针对性拟合,这是所有此类基准都要面对的宿命。 趋势观察 长时序世界模型的瓶颈已经从「架构」挪到了「数据契约」和「训练配方」 — 今天最值得读的是 SolarWM。它有意思的地方不在提出某个新模块,而在于承认了一件行业里心知肚明却少有人正面收拾的事:世界模型这条线上,真正拖慢进展的不是骨干网络不够强,而是各家数据的时间尺度、相机几何、画质、运动幅度、字幕风格全都不一样,各家实现又绑死在自己的模型上,于是监督信号互相矛盾、结果无法复现也无法比较。SolarWM 的回应是把 10 个数据集的 143 万个片段压成一份统一的、逐帧对齐的「数据契约」——视觉观测、度量尺度的相机几何、字幕、质量元数据、筛选决策、来源出处全部在同一份规格里,并且刻意把「单源处理」和「混合配比」解耦,这样换配方不用重跑数据。在这套共享的相机条件化与训练/推理接口上,他们基于 Wan2.2、LTX-2.5、MiniMax-H3 实例化了四个 5B–33B 的模型,且保留各自原生的表示与目标函数,再用一套三阶段配方(双向适配 → 教师强制的自回归初始化 → 分布匹配蒸馏)统一收口。结果是:只在 5 秒序列上训练,得到的因果模型却能做到分钟级到小时级的实时交互推演。这个「训练窗口极短、推演窗口极长」的落差,是今天这批工作里最值得注意的一处。 往下看,加速这条线今天出现了训练侧和推理侧的双响。SelfLift 处理的是少步扩散里一个具体到有点刻薄的矛盾:当时间步已经被压到个位数,每次前向的空间开销就成了延迟主项,于是大家改用「先低分辨率去噪、后期再升到高分辨率」的渐进式推理;但既有做法把中间 latent 直接抬上去,指望后续步骤自己吸收掉分布错配——在少步这个预算下根本吸收不完,残留就是可见的伪影,反过来又迫使切换点必须提前,加速比因此上不去。SelfLift 的解法是让模型自己当医生:直接抬升的 latent 与经 pixel-VAE 重编码的 latent 之间的分歧,既当作局部伪影风险图,又当作模型原生的修正方向,全程不需要外接超分、不加去噪评估、不改采样表。在 FLUX.2-Klein 和 Z-Image-Turbo 上端到端延迟分别降 41.5% 和 44.1%,叠加时间步蒸馏后相对 50 步模型是 29.61× 和 19.21×。f-loss 则从训练目标动手,指出了一处几乎被当成常识而无人清算的偏置:自然图像服从 1/f² 的谱分布,能量绝大部分堆在低频,但纹理和边缘这些真正影响观感的结构却占据稀疏的高频带;而像素空间的重建损失对所有空间误差一视同仁,等于让低频主宰了优化信号、把细节的学习一路往后拖。它的处置很朴素——先用一个跨频率均衡的 Focal Log-Frequency Loss 把各频段的学习信号拉平,训练后期再切回标准的像素 v-loss 做空间精修,不改架构、可直接替换原有 flow matching 损失,多个模型规模上收敛最多快 40%,FID 与感知保真度同时改善。这两篇一个改推理、一个改训练,但共同点是都没有加参数,而是去修正「信号分配」本身。 相机可控这条线今天也有两篇互为镜像的工作。MeRoPE 指出既有几何位置编码有一个依赖尺度的失效模式:齐次投影式的编码会让注意力 logits 和特征范数随物理平移基线无界增长——也就是说,在真实的、以米为单位的相机轨迹上,走得越远越容易崩。它的对策是保范数:用正交旋转块编码标定视线之间的相对朝向,把原始度量位移映射成多频旋转相位,再沿对极弧加一个视差锚定的对应先验,从而严格保住特征范数、把 softmax 前的 logits 限住、并对全局刚体坐标变换保持精确不变性。CameraEditor 面对的是同一个物理量在图像编辑侧的表现:现有编辑模型擅长语义和风格,一旦要求按相机参数做大幅视角变化,就在「结构撕裂」和「保守到干脆无视几何指令」之间二选一。它的做法是把这个空间问题改写成时序预测问题——借视频扩散的时间连贯性,配一个显式几何感知模块和动态参考路由,用动态全景裁切构造几何上严格的参考对,再刻意插入中间过渡帧把大幅视角变化拆成小步,给身份一致性留出时间缓冲;该文已被 ACM Multimedia 2026 接收。 剩下几篇各自补齐一块拼图,但有一条隐线值得点出:它们都在把「一次前向就出最终产物」当作目标。LightBridge 让 3DGS 重光照不再需要逐场景优化,单次前向直接吐出完整的可重光照 3DGS 资产;GlyphAnchor 用轻量字形块条件、且位置通过模型原生位置编码锚定到目标图像,去救长文本、密排文本和生僻字的渲染;VibeVoice-ASR-Streaming 把「谁说了什么」做成流式,靠交错固定长音频块、少量前瞻音频与历史文本,取消了独立的说话人分离阶段;Kirin 把野外动物视频重建成 3D 运动并配上字幕,做出首个四足动物的视频-文本-运动三元组数据集。最后 RIG-BENCH 给这一天留了个刹车:它用 2000 道题去考「从视觉输入推断隐含规则、再把解答画出来」这件事,结论是当前统一生成模型普遍存在推理-生成落差——局部看着合理,全局逻辑不成立。把它和开头的 SolarWM 放在一起读会更清楚:我们已经能让模型把世界推演一小时,但还没能确保它推演的那一小时讲得通。 人工智能炼丹君 整理 | 2026-09-04 更多 AIGC 论文解读,关注微信公众号「人工智能炼丹君」 每日更新 · 论文精选 · 深度解读 · 技术脉络 微信搜索 人工智能炼丹君 或扫描下方二维码关注
2026年09月04日
40 阅读
0 评论
0 点赞
1
...
4
5
6
...
18
粤ICP备2021042327号