推理委托设计模式 (8 chars) ✓ Let me now write the full content for both topics. Actually, I realize I should double-check: is "Runtime Abstraction" or "Delegate Pattern" too close to any covered keyword? Looking at the list: Cluster Scheduling, Co-design, Collective Communication, Computational Expressiveness, CUTLASS... No, none of these overlap. OK, let me finalize and write everything out. Let me reconsider the engineering topic one more time. The title "推理委托设计模式" is good but maybe I should make it even more specific and interesting. What about focusing on the "graph partitioning" aspect - how ML runtimes decide which operations to delegate to which backend? This is a more specific and technically interesting angle. No, I think the broader "delegate pattern" is better because it covers the full picture and is more useful to the reader. Let me write it all out now. For the engineering topic, let me think about the history: - Early days: frameworks were monolithic (Caffe, early TensorFlow) - TensorRT (2017): NVIDIA's specialized inference engine, initially standalone - ONNX Runtime (2019): Microsoft introduced "Execution Providers" - the first major delegate-like abstraction - TFLite delegates (2018-2019): TensorFlow Lite introduced delegate API for GPU, NNAPI, etc. - ExecuTorch (2023-2024): PyTorch's answer to edge inference with a clean delegate API - 2025-2026: MLX delegate, Qualcomm AI Engine Direct delegate, etc. This is a rich history. Let me write it up. Actually, I want to make sure I have the dates right: - TensorRT was first released around 2016-2017 - ONNX was announced in 2017 - ONNX Runtime was open-sourced in 2018-2019 - TFLite was released in 2017, delegates came later - ExecuTorch was announced at PyTorch Conference 2023 OK, let me write everything now. I'll be thorough. One more thought: for the MATH section of the engineering topic, I could discuss the graph partitioning problem formally, or I could discuss the cost model for deciding whether to delegate. Let me think... The graph partitioning for delegation can be formalized as: - Given a computation graph $G = (V, E)$ where $V$ is the set of operations and $E$ is data dependencies - And a set of delegates $D = \{d_1, ..., d_m\}$ where each delegate supports a subset of operations $S_i \subseteq V$ - Find a partition $P = \{P_0, P_1, ..., P_m\}$ (where $P_0$ is the fallback/CPU partition) that minimizes total execution time - Subject to: each $
根本动因:将连续音频信号转化为离散符号是让语言模型架构处理音频的前提条件,这一需求驱动了从经典矢量量化到深度学习分词器的三十年演进。
Linde, Buzo, Gray (1980) 提出LBG算法,将矢量量化(VQ)系统化应用于语音编码。CELP(Code-Excited Linear Prediction)编码器在1985年由Atal和Schroeder提出,用码本激励信号替代波形编码,成为GSM/3G语音编码标准。这一阶段VQ的目标是压缩而非生成,码本设计依赖手工特征(如LPC系数)。
van den Oord等人在NeurIPS 2017提出VQ-VAE,首次将矢量量化嵌入深度生成模型。编码器输出连续向量,通过最近邻查找映射到离散码本,解码器从离散码重建输入。关键创新是straight-through estimator绕过不可导的量化操作。这为音频生成奠定了基础——离散token可以用自回归模型建模。
Google的Zeghidour等人提出SoundStream,引入残差矢量量化(RVQ):第一层码本量化原始向量,后续每层量化前一层的残差。这使得单个码本容量有限的问题被多层级联解决,在24kbps以下实现接近透明的音频质量。RVQ成为后续所有神经音频编解码器的标准范式。
Meta的Défossez等人发布EnCodec,进一步优化RVQ架构,加入多尺度STFT判别器和多带宽训练。同年Google发布AudioLM,首次展示用语言模型自回归生成语义token和声学token的两阶段框架。这标志着"音频分词→语言模型生成"范式的确立。
MusicGen(Meta, 2023)采用延迟模式(delay pattern)将RVQ多层码本展平为单序列,但序列长度随层数线性增长。SoundStorm(Google, 2023)用并行解码缓解此问题。2024年起,研究者开始探索非RVQ路线:单码本高维量化(如DAC的改进)、有限标量量化(FSQ)、以及将频谱图视为2D图像进行分词的方法,试图从根本上避免残差层级的顺序依赖。
如[30]所示,将音频建模为时频图像,用2D分词器直接在频谱图上进行空间量化,避免RVQ的残差级联和序列展平问题。这代表了音频分词从1D时域到2D时频域的范式转变。
矢量量化的基本操作是将编码器输出 $z_e \in \mathbb{R}^d$ 映射到码本 $\mathcal{C} = \{e_1, ..., e_K\}$ 中最近的码向量: $$z_q = e_k, \quad k = \arg\min_{j} \|z_e - e_j\|_2$$ VQ-VAE的训练损失包含三项: $$\mathcal{L} = \underbrace{\|x - \hat{x}\|_2^2}_{\text{重建损失}} + \underbrace{\beta \|z_e - \text{sg}[z_q]\|_2^2}_{\text{承诺损失}} + \underbrace{\|\text{sg}[z_e] - z_q\|_2^2}_{\text{码本损失}}$$ 其中 $\text{sg}[\cdot]$ 是stop-gradient算子。承诺损失(commitment loss)确保编码器输出不会远离码本向量,$\beta$ 控制其权重。码本损失将码向量拉向编码器输出。量化操作不可导,反向传播时用straight-through estimator:$\nabla_{z_e} z_q \approx \mathbf{I}$,即梯度直接穿过量化层。 残差矢量量化(RVQ)将量化分解为 $L$ 层级联。设 $r_0 = z_e$,第 $l$ 层量化残差: $$q_l = \text{VQ}_l(r_{l-1}), \quad r_l = r_{l-1} - q_l$$ 最终重建为所有层量化值之和:$\hat{z} = \sum_{l=1}^{L} q_l$。每层码本大小为 $K$,总有效码本大小为 $K^L$(指数增长),但参数量仅为 $L \times K \times d$(线性增长)。这就是RVQ的核心优势:用线性参数获得指数级表达能力。 码率计算:若帧率为 $f$ Hz,每层码本大小 $K$,共 $L$ 层,则比特率为 $f \times L \times \log_2 K$ bps。例如SoundStream在75Hz帧率、$K=1024$、$L=8$ 时,码率为 $75 \times 8 \times 10 = 6000$ bps = 6kbps。
音频分词器的整体逻辑是:编码器将波形压缩为低帧率连续表示,量化器将其离散化为token序列,解码器从token重建波形;训练时通过重建损失、对抗损失和量化损失联合优化。
编码器通常采用多层一维卷积,逐步将原始波形(如24kHz采样率)下采样到低帧率表示(如75Hz)。每层使用strided convolution,步长通常为 $[2, 4, 5, 8]$ 等,总下采样倍数为各层步长之积(如 $2 \times 4 \times 5 \times 8 = 320$)。选择卷积而非Transformer是因为音频信号具有强局部相关性,且卷积的计算复杂度与序列长度线性相关。编码器输出维度通常为128或256维。关键设计选择:下采样倍数决定了帧率,帧率越低压缩率越高但信息损失越大;SoundStream用320倍下采样(24kHz→75Hz),EnCodec提供多种选择(320/640/1280倍)。
编码器输出的连续向量经过RVQ离散化。第一层码本捕获信号的粗粒度结构(基频、能量包络),后续层逐步编码更细的残差(谐波细节、噪声纹理)。码本通常用指数移动平均(EMA)更新而非梯度下降,因为EMA更新更稳定且不需要额外的码本损失项。码本坍缩(codebook collapse)是主要工程挑战——部分码向量从不被选中而"死亡"。解决方案包括:(a) 码本重置:将长期未使用的码向量重新初始化为当前batch中的编码器输出;(b) 码本分组:将 $d$ 维向量分成多组独立量化(product quantization);(c) 有限标量量化(FSQ):将每个维度独立量化到有限整数集,完全避免码本学习。
解码器是编码器的镜像结构,用转置卷积逐步上采样。训练损失包含:(a) 多尺度频谱重建损失——在多个FFT窗口大小下计算频谱L1距离,捕获不同时频分辨率的重建误差;(b) 对抗损失——使用多尺度判别器(multi-scale discriminator)和多周期判别器(multi-period discriminator),前者在不同音频分辨率上判别,后者在不同周期子采样上判别,二者互补覆盖频谱的不同区域;(c) 特征匹配损失——最小化判别器中间层特征的L1距离,稳定对抗训练。对抗训练是音频质量从"可用"到"透明"的关键跳跃。
RVQ产生 $T \times L$ 的二维token矩阵($T$为时间帧数,$L$为码本层数),需要展平为一维序列供自回归模型消费。主要策略:(a) 交错展平(interleave):按时间步交替排列各层token,序列长度 $T \times L$;(b) 延迟模式(delay pattern, MusicGen):每层引入一个时间步延迟,允许同一时间步的不同层token并行预测,有效序列长度接近 $T$;(c) 并行解码(SoundStorm):先自回归生成第一层token,再用masked parallel decoding同时生成所有剩余层,将生成速度提升一个数量级。
2D分词器将音频转换为对数梅尔频谱图(时间×频率的2D图像),然后用2D VQ-VAE或2D patch tokenization进行空间量化。每个patch对应一个时频区域的token。优势:(a) 避免RVQ的残差级联——所有token在同一层级,无顺序依赖;(b) 可直接复用视觉Transformer架构和预训练权重;(c) 时频结构被显式保留,有利于建模谐波关系。挑战:频谱图到波形的重建需要相位估计(如HiFi-GAN vocoder),引入额外误差源。
音频分词器是当前所有音频生成大模型(MusicGen、AudioGen、VALL-E、SoundStorm)的基础组件,直接决定生成质量上限。RVQ已成为工业标准,被Google、Meta、Microsoft、ByteDance等公司的音频产品采用。随着多模态大模型(如GPT-4o、Gemini)整合语音能力,音频分词器的重要性将持续上升——它是连接连续信号世界与离散语言模型世界的桥梁。
当前热点包括:(1) 语义-声学解耦分词——将语义信息和声学细节分离到不同token层级;(2) 超低码率分词(< 1kbps)用于实时通信;(3) 2D/视觉化分词器能否全面替代RVQ仍有争议;(4) 分词器与下游生成模型的联合训练(end-to-end)尚未成熟。