连续批处理异步化
Root motivation: GPU inference for autoregressive models wastes massive compute because static batching forces all requests to wait for the slowest one, and the prefill and decode phases have fundamentally different compute profiles.
早期深度学习推理服务(如 TensorFlow Serving、Triton Inference Server)采用静态批处理:收集一批请求,统一执行前向传播,等所有请求完成后返回结果。对于固定长度任务(如图像分类),这种方式效率尚可。但自回归语言模型的出现打破了这一假设——不同请求的输出长度差异巨大(从几个 token 到数千 token),短请求完成后必须空等长请求,GPU 利用率急剧下降。
Yu et al. 在 OSDI 2022 发表 Orca 系统,首次提出迭代级调度(iteration-level scheduling):在每个解码迭代后检查哪些请求已完成,立即释放其资源并插入新请求。这一思想将批处理的粒度从"请求级"细化到"迭代级",使 GPU 在任何时刻都尽可能满载。Orca 还引入选择性批处理(selective batching),允许不同请求在同一批次中处于不同的处理阶段。
Kwon et al. 在 SOSP 2023 发表 vLLM,解决了连续批处理的关键瓶颈——KV Cache 内存管理。传统实现为每个请求预分配最大长度的连续内存,导致严重碎片化。PagedAttention 借鉴操作系统虚拟内存的分页思想,将 KV Cache 分成固定大小的块(pages),按需分配和回收。这使得连续批处理在实际部署中变得可行,vLLM 的吞吐量比 HuggingFace Transformers 提升 24 倍。
随着长上下文模型(128K+ tokens)的普及,预填充(prefill)阶段的计算量激增,一次长预填充会阻塞整个批次的解码。Sarathi-Serve (Agrawal et al., 2024) 和 DeepSpeed-FastGen 提出分块预填充(chunked prefill):将长 prompt 切分为固定大小的块,与解码请求交错执行,避免长预填充独占 GPU。Splitwise 和 DistServe 进一步提出预填充-解码分离(prefill-decode disaggregation):将预填充和解码分配到不同的 GPU 或不同的模型副本上,因为两者的计算特征截然不同——预填充是计算密集型(高算术强度),解码是内存带宽密集型(低算术强度)。
如今日博客 [18] 所讨论,最新的推理引擎正在探索更深层次的异步化:不仅预填充和解码异步,还包括注意力计算与 MLP 计算的重叠、KV Cache 传输与计算的重叠、以及跨节点的异步调度。这种全异步设计对于音视频大模型的实时推理尤为关键,因为视频生成的每帧解码需要在严格的时间预算内完成。
Let me think about what math applies here... Static batching throughput: $\text{Throughput}_{\text{static}} = \f
整体逻辑:一致性模型通过在扩散ODE轨迹的相邻点之间施加"输出必须相同"的约束,迫使网络学会从任意噪声级别直接跳到干净数据,训练完成后只需单次前向传播即可生成。
将连续时间区间 $[\epsilon, T]$ 离散为 $N$ 个时间步 $\epsilon = t_1 < t_2 < \cdots < t_N = T$。关键设计:训练初期 $N$ 较小(如 $N=2$),此时相邻步间距大,一致性约束宽松,模型容易学习粗略映射;随训练推进逐步增大 $N$(课程学习策略),约束越来越精细。这种渐进式调度避免了一开始就要求模型在极细粒度上保持一致性的困难。iCT 中进一步采用连续时间调度,消除离散化带来的误差。
使用跳跃连接参数化 $f_\theta(x_t, t) = c_{\text{skip}}(t) \cdot x_t + c_{\text{out}}(t) \cdot F_\theta(x_t, t)$,其中 $c_{\text{skip}}(t)$ 和 $c_{\text{out}}(t)$ 是关于 $t$ 的可微函数,满足 $c_{\text{skip}}(\epsilon)=1, c_{\text{out}}(\epsilon)=0$。这保证了边界条件 $f_\theta(x_\epsilon, \epsilon) = x_\epsilon$ 在架构层面被硬编码,而非依赖训练学习。$F_\theta$ 通常复用扩散模型的 U-Net 或 DiT 架构。在 iCT 中,$c_{\text{skip}}$ 和 $c_{\text{out}}$ 的具体函数形式经过精心调优,使得不同噪声级别的梯度量级保持平衡。
对每个训练样本 $x_0$:(a) 采样随机时间步索引 $n$;(b) 生成噪声样本 $x_{t_{n+1}} = x_0 + t_{n+1} \cdot \epsilon$(一致性训练)或用ODE求解器从 $x_{t_{n+1}}$ 估计 $\hat{x}_{t_n}$(一致性蒸馏);(c) 分别通过在线网络 $f_\theta$ 和EMA目标网络 $f_{\theta^-}$ 计算两个输出;(d) 计算距离损失 $d(\cdot, \cdot)$。EMA更新率 $\mu$ 也随训练进行调整:初期 $\mu$ 接近 0(目标网络快速跟随),后期 $\mu$ 接近 1(目标网络缓慢更新,提供稳定锚点)。距离度量的选择至关重要:L2 在高维空间中过于平滑,LPIPS 提供感知质量但计算开销大,伪 Huber 损失在 iCT 中被证明是良好的折中。
训练完成后,单步采样极其简单:从 $x_T \sim \mathcal{N}(0, T^2 I)$ 采样纯噪声,一次前向传播 $\hat{x}_0 = f_\theta(x_T, T)$ 即得生成结果。若需更高质量,可进行多步精化:在 $\hat{x}_0$ 上重新加噪到某个中间时刻 $t'$,再次调用 $f_\theta$ 得到更精细的估计。这种"去噪-加噪-再去噪"的多步策略在 2-4 步内即可达到接近完整扩散模型的质量,且每一步都产生有效样本(不像传统扩散模型中间步骤的样本是无意义的噪声混合物)。
在 RAVEN 等工作中,一致性模型被嵌入因果自回归框架:每个视频片段的生成被视为一个条件一致性模型问题,以前一片段为条件,用一致性蒸馏训练单步或少步生成器。结合 GRPO(Group Relative Policy Optimization)进一步对齐训练与推理分布,解决自回归误差累积问题。这一扩展要求一致性函数在时间维度上也保持连贯性,通常通过共享时间注意力层和帧间条件注入实现。
一致性模型从根本上改变了扩散模型"质量高但速度慢"的困境。LCM 使 Stable Diffusion 在消费级 GPU 上实现亚秒级图像生成,被集成到 ComfyUI、Automatic1111 等主流工具中。在工业界,实时图像编辑(如 Adobe Firefly 的交互式生成)、视频流式生成(如 Runway 的实时预览)均受益于此技术。对于音视频工程师,一致性模型是实现实时语音/视频生成的关键加速手段,其"单步生成"范式将持续影响所有基于扩散的生成系统设计。
当前前沿集中在三个方向:(1) 一致性训练在大规模高分辨率视频上的稳定性问题仍未完全解决;(2) 将一致性模型与强化学习(如GRPO、DPO)结合以提升生成可控性;(3) 在多模态(音频+视频)联合生成中应用一致性约束,实现跨模态时序一致的实时生成。如何在保持单步质量的同时支持精细条件控制仍是核心开放问题。 --- Now for Topic 2: Continuous Batching with Asynchrony