Synth Daily

Reiner Pope——LLM 训练与部署背后的数学原理

这场技术讲座探讨了前沿大语言模型的训练与推理机制。通过简单的数学公式,揭示了批量大小 (batch size)、KV 缓存、专家混合模型 (MoE)、流水线并行内存带宽如何共同决定推理的延迟与成本。许多模型的 API 定价和架构选择都可以从这些底层约束中反推出来。此外,分析还表明,由于强化学习 (RL) 的引入,当前的模型可能已经比“Chinchilla 最优点”过度训练了约 100 倍。最后,还讨论了神经网络与密码学在“信息混合”和可逆结构上的相似之处。

批量大小如何影响成本与速度

影响推理速度和成本的关键因素是批量大小 (batch size),即同时处理的用户请求数量。如果不将多个用户的请求批量处理,成本和经济效益可能会差上千倍。

对模型推理时间的分析主要基于两个原则:

  • 硬件性能限制 (Roofline Analysis): 考察芯片的内存带宽计算性能 (FLOPs)
  • 模型操作时间: 考察处理模型权重 (weights)和处理上下文KV 缓存 (KV cache)所需的时间。

推理时间主要受两个因素制约:

  • T_compute (计算时间) = (批量大小 * 激活参数数量) / 芯片算力
  • T_memory (内存时间) = (总参数读取时间 + KV 缓存读取时间) / 内存带宽

批量大小与延迟的关系:

  • 当批量大小增加时,计算时间呈线性增长。
  • 内存读取时间有一个固定的基础(读取模型权重),然后随着批量大小线性增长(读取 KV 缓存)。
  • 因此,总延迟有一个无法逾越的下限,即从内存中读取所有模型参数所需的时间。你无法比用尽全部内存带宽更快。

批量大小与成本的关系:

  • 每 Token 成本 = 总时间 / 批量大小。
  • 当批量大小为 1 时,成本极高,因为读取整个模型权重的开销没有被分摊。
  • 随着批量大小增加,读取权重的成本被分摊,每 Token 成本迅速下降,最终趋近于一个由计算时间决定的下限。这就是为什么提供“慢速模式”以换取更低价格并不总能大幅降低成本的原因。

一个关键的平衡点是当内存时间等于计算时间时。通过简化和求解,可以得出一个大致的结论: 最佳批量大小 ≈ 300 × (总参数数量 / 激活参数数量)

这个公式中的 300 是一个在多代 GPU 硬件上都相对稳定的硬件参数(算力/内存带宽比),而括号内则是模型的稀疏度。这意味着,对于一个给定的稀疏模型,我们可以估算出为了实现成本效益最大化所需的并发用户规模。

MoE 模型如何分布在 GPU 机架上

稀疏的专家混合模型 (MoE) 是提升效率的关键。标准的做法是采用专家并行 (expert parallelism),即将不同的“专家”分布在不同的 GPU 上。

  • 通信模式: 在 MoE 层中,一个“路由器”决定将输入的 Token 发送给哪些专家处理。这意味着任何一个 GPU 上的 Token 都可能需要被发送到集群中的任何其他 GPU 上。这形成了一种“全对全 (all-to-all)”的通信模式。
  • 机架的限制: 现代 GPU 机架(如 Blackwell NVL72)内部通过高速互联(如 NVLink)实现了全对全的连接,非常适合 MoE 的通信需求。然而,机架与机架之间的通信带宽通常要慢得多(约 8 倍)。
  • 结论: 如果一个 MoE 层需要跨越多个机架,跨机架的慢速通信将成为瓶颈。因此,单个机架的规模(物理尺寸、供电、散热和布线密度)决定了单个 MoE 专家层的最大规模。这解释了为什么业界一直在推动构建越来越大的单一互联域。

流水线并行如何将模型分布于不同机架

除了专家并行,另一种重要的并行策略是流水线并行 (pipeline parallelism),它将模型的不同层(layers)分布在不同的机架上。

  • 工作方式: 第一个机架处理模型的前几层,然后将结果传递给第二个机架处理后续层,以此类推,像流水线一样。
  • 优势: 流水线并行可以节省单个机架的内存容量。由于每个机架只需存储模型的一部分权重,这使得运行超出单个机架内存容量的巨大模型成为可能。
  • 劣势与权衡:
    • 它会引入跨机架通信的额外延迟
    • 为了保持所有机架都处于忙碌状态,需要同时处理多个“微批次 (micro-batches)”,这增加了系统的复杂性。
    • 一个关键的发现是:流水线并行无法有效降低 KV 缓存的内存占用。因为虽然每个机架只处理部分层,但为了保持流水线运转,需要在系统中同时保留更多批次的上下文信息,两者相互抵消。

“我们现在知道,流水线并行并不明智。”

这句话的背景是,虽然流水线并行解决了模型权重的存储问题,但对于越来越重要的 KV 缓存,它却无能为力。随着上下文长度的增加,KV 缓存成为主要的内存消耗者,而流水线并行对此的优化效果很小。

模型可能已“过度训练”百倍

传统的 Chinchilla 缩放定律指出,在固定的计算预算下,模型大小和训练数据量之间存在一个最佳平衡点。然而,这个定律只考虑了预训练 (pre-training)成本。在现实世界中,总成本还包括强化学习/微调 (RL/fine-tuning)推理 (inference)的成本。

  • 成本均衡启发法: 一个合理的策略是,当一个系统的总成本由多个部分组成时,最优解往往出现在各个部分成本大致相等的地方。
  • 成本构成:
    1. 预训练成本: 6 * 激活参数 * 预训练数据量
    2. RL 成本: 由于包含大量生成(前向传播),RL 的每 Token 计算成本高于预训练。
    3. 推理成本: 2 * 激活参数 * 推理数据量
  • 推论: 为了让这三部分成本大致均衡,模型需要服务海量的推理请求。根据对当前 API 流量的估算,一个模型在其生命周期内(例如 2 个月)处理的推理 Token 总量可能高达数百亿。
  • 结论: 为了摊销巨大的推理成本,需要在预训练和 RL 阶段投入更多的计算资源。计算表明,当前的前沿模型在预训练数据量上,可能已经是 Chinchilla 定律建议的最佳值的 100 倍左右。这意味着它们被显著地“过度训练”了,以便在推理时更便宜、更高效。

从 API 定价中推断模型细节

公开的 API 定价并非随意制定,它们往往直接反映了底层的成本结构。

  • 长上下文的额外费用: 为什么当上下文超过一定长度(如 200k Token)时,价格会上涨 50%?

    • 在较短的上下文长度下,推理是计算受限的。
    • 随着上下文长度增加,读取 KV 缓存的开销越来越大,直到某个点,推理变为内存带宽受限
    • 这个价格跳升点,很可能就是模型从计算受限转向内存受限的拐点
  • 输入与输出 Token 的价格差异: 为什么输出(生成)Token 通常比输入(处理)Token 贵 3-5 倍?

    • 输入 (Prefill): 处理输入时,可以并行计算所有 Token,这使得计算成本被有效分摊,此时系统通常是计算受限的。
    • 输出 (Decode): 生成时,模型必须一个 Token 一个 Token地自回归生成,每次生成都需要读取整个历史上下文的 KV 缓存。这使得系统严重受内存带宽限制,效率更低,因此成本更高。

神经网络与密码学的趋同进化

神经网络和密码学协议在底层架构上展现出惊人的相似性,这是一种“趋同进化”。

  • 共同目标:信息混合。 两者都需要将输入信息充分地“搅乱”和“混合”。
    • 密码学希望任何输入的微小变化都能导致输出的巨大、不可预测的变化(雪崩效应),以保证安全性。
    • 神经网络(特别是注意力机制)需要让模型中的每个部分都能感知到其他所有部分的信息,以捕捉复杂的依赖关系。
  • 相似的结构: 许多加密协议和神经网络层都采用了类似的“混合-置换”结构。
  • 可逆结构 (Feistel 网络):
    • 密码学中一种经典的可逆构造,可以将一个不可逆的函数(如 MLP)构建成一个完全可逆的层。
    • 这种结构已被引入神经网络(称为 RevNets),它使得整个网络可以被反向运行。
    • 优势: 在训练过程中,不再需要存储每一层的激活值来用于反向传播,可以在需要时通过反向计算“重新生成”它们。这极大地节省了内存,代价是需要更多的计算。这是一种用计算换内存的典型权衡。