跳到主要内容

Llama-2 的推理特性

· 阅读需 5 分钟
Aman

Llama-2 比你想象的要昂贵。在这篇文章中,我们探讨为什么它通常比 gpt-3.5-turbo 更贵。

Llama-2-70B 是 gpt-3.5 的一个诱人替代品,但如果你在寻找一个便宜的语言模型,偏离 OpenAI 的 API 可能并不值得。

从价格和延迟的角度考虑:

你不应该将 Llama-2 用于以生成为主的工作负载

相反,Llama 最适合以提示为主的任务,比如分类。在以下情况下,Llama-2 也可能有意义:

  1. 你的工作负载没有提示词 tokens(这很反直觉,但我们稍后会解释)
  2. 你在执行批处理作业

否则,gpt-3.5 应该更便宜且更快。

需要快速声明一下,使用 Llama 而不是 gpt-3.5 的一个原因是微调。但在这篇文章中,我们只探讨成本和延迟。我不会将 Llama-2 与 GPT-4 进行比较,因为它更接近于 3.5 级别的模型。基准测试性能也支持这一说法。

Transformer 数学入门

通过一些简单的数学计算,我们将展示 Llama-2 的以下特性。对于序列长度 N 和批量大小 B:

每个 token 的 FLOPS = 140 · 10⁹ FLOPs 每个 token 的内存带宽 = 140 GB/s + 320·N·B KB/s

140 来自模型参数数量的两倍,320 KB/s 是通过一些算术得出的。在接下来的部分中,我们将解释如何得到这些数字。

计算模型 FLOPS

前向传递的 FLOPS 数量 ≈ 2P,其中 P 是模型中的参数数量。我们模型中的每个参数都属于某个权重矩阵 M∈Rᵐˣⁿ。对于每个输入 token,每个矩阵在与表示该 token 的向量进行矩阵乘法时恰好使用一次。

完成时的内存需求高于提示时

在生成 token 时,我们需要重新读取所有模型权重和 KV 缓存来生成每个 token。这意味着什么?要执行任何矩阵乘法,我们需要将每个矩阵的权重从 RAM 加载到 GPU 的寄存器中。当有足够多的唯一矩阵时,实际加载权重会成为瓶颈,而不是矩阵乘法本身。

transformer 中生成 token 的内存路径

为了说明这一点,我们可以跟踪一个简单的单层 transformer 生成一批 token 的(非常粗略的)路径:

  1. 我们读取输入嵌入矩阵 Wₑ 并计算批次中每个输入的相应嵌入向量
  2. 我们从内存中读取每个 Wq、Wk、Wv 矩阵来计算批次中每个输入的 qᵢ、kᵢ、vᵢ(向量)
  3. 我们执行注意力操作 - 这需要读取缓存的键和值
  4. 我们从内存中读取 Wo 并与前一步的输出相乘
  5. 我们读取步骤 1 的输出并将其添加到步骤 4 的输出中,然后执行层归一化
  6. 我们读取 Wff₁ 并相乘以获得第一个前馈层的输出
  7. 我们读取 Wff₂ 并相乘以获得第二个前馈层的输出
  8. 我们读取步骤 5 的输出并将其添加到步骤 7 的输出中,然后执行层归一化
  9. 我们读取反嵌入层 Wₑᵀ,然后进行矩阵-矩阵乘法以获得批次中每个输入的 token 对数概率
  10. 我们采样下一个 token 并将其反馈到步骤 1

结论

基于上述分析,我们可以得出以下结论:

  1. 对于生成任务,Llama-2 的成本通常高于 gpt-3.5-turbo
  2. 对于以提示为主的任务(如分类),Llama-2 可能更具成本效益
  3. 批处理可以提高效率,但会增加延迟
  4. 在选择模型时,需要仔细权衡成本、延迟和具体用例

如果你对这些挑战感兴趣,欢迎加入我们的团队!我们正在解决这些有趣的问题,并努力使 AI 编程工具更加高效和实用。