为什么大模型推理服务要计算首个token的延迟?其他token的耗时不需要考虑吗?

Создано: 6 февраля 2025 г.

Отвечено с использованием O1 Pro от Chat01

Вопрос

为什么大模型推理服务要计算首个token的延迟?其他token的耗时不需要考虑吗?

Мысль

理解推理延迟

我正在探讨大模型推理服务测量首个标记延迟的原因,这关乎推理时间。首个标记可能需完整前向通,把缓存开销考虑在内,后续标记则可能延迟较小或不同。实时用户体验上,首个标记的响应时间尤为关键。

反思用户体验

实时流应用中,首个标记至关重要。用户关注首个标记,因为它确认系统在运行,而对整个文本或后续标记的时间要求较低。

节省资源延迟

后续标记通常采用增量推断,既能节省资源,又能减少延迟。KV缓存的使用使得后续标记生成速度更快。

已推理,持续 1m 13s

Ответ

在实际的大模型推理(尤其是多轮交互或流式输出场景)中,“首个 token 的延迟”(time to first token)往往是用户侧最关注的指标之一,这和后续 token 的生成方式、系统开销以及用户体验特点都有关系。主要原因包括:

  1. 用户体验视角:首token是“可见响应”的标志

    • 在与大模型进行交互式对话时,最能影响用户感知的并不是完整回答生成所需的总时长,而是系统开始“有回应”的时间,也就是生成第一个可见输出的速度。首token一旦输出,用户就能够察觉到系统已经开始工作,而并不会感到“卡住”或“无响应”。
    • 因此,无论是做实时服务还是在前端做流式展示,“首token延迟”几乎是衡量交互体验好坏的最关键指标之一。
  2. 推理过程视角:首token计算开销通常最高

    • 大模型在生成第一个 token 时,通常需要完成一次完整的前向计算,其中包括获取上下文、对输入进行编码、以及准备好后续推理所需的内部缓存(例如注意力的 K/V 缓存)等。
    • 当生成后续 token 时,就可以使用前面已经计算并缓存的特征,进行增量式计算,后续每个 token 的推理开销往往比首token低不少。
  3. 服务指标视角:首token延迟 + 吞吐/速度

    • 在很多大模型推理服务的指标体系中,往往将首token的延迟(Latency to First Token,或 TTFB)和平均生成速度(Tokens per Second,TPS)分开衡量。首token的延迟可以体现系统在单次请求上的“启动速度”和交互响应能力;而后续 token 的生成速度则更能体现整体的模型计算效率和吞吐能力。
    • 对运维和服务调优而言,TTFB 过高通常表示模型加载、预处理或底层计算存在瓶颈,需要优化模型结构、硬件或软件栈来降低初次计算时的开销;而 TPS 指标过低则意味着在批量生成长文本时整体效率不足,需要从并行化、缓存利用等方面去优化。
  4. 实际需求不同,考量重点不同

    • 如果是聊天机器人等交互式应用,用户往往希望尽快获得反馈,因此首token延迟是最关键的体验指标。而后续 token 的生成可以以一定速率流式给出,满足“边看边出结果”的需求。
    • 如果是批量离线推理(例如对一批文档做摘要),则会更加关注总时长或平均吞吐量,而不是首token延迟。不过即使在这些场景下,通常还是要先做一次前向计算才能真正开始生成,所以首token延迟依旧有优化价值。

综上,大模型推理服务往往把“首个 token 的延迟”作为核心指标,是因为它直接关系到交互场景下用户的即时响应体验;后续 token 通常使用增量计算、耗时更低,且用户对于后续输出的延迟敏感度也不如“首个字符何时出现”那么高。因此,在衡量大模型性能时,人们往往既看“首token延迟”,也关注“后续 token 生成的吞吐速度(或整体耗时)”,二者缺一不可,但在不同场合下的关注度会有所侧重。

Вопрос

请详细解释下,为什么后续token生成可采用增量更新,因此花销比首token小

Мысль

考虑这个问题时,主要看首个token的延迟,因为它是推理的起点。后续token生成可以增量更新,花销较小,保持效率。

聚焦首个token

优先计算首个token的延迟,因为它是推理流程的起点。后续token可以利用增量更新,从而减少时间和资源的消耗。

已推理,持续 几秒

Ответ

后续 token 的生成相比首个 token 的计算开销较小,主要是因为在生成过程中,很多计算可以通过增量更新(incremental computation)来优化,从而大大减少了重复计算的工作量。具体来说,以下几个因素解释了为何后续 token 生成的花销通常比首 token 小:

1. 缓存机制与增量计算

大多数现代大模型(如 Transformer 类模型)在推理过程中,处理每个 token 时会使用到“注意力机制”(Attention Mechanism)。为了生成一个新的 token,模型需要根据上下文(输入的 tokens)来计算当前 token 的表示。

  • 首个 token 的计算

    • 首个 token 的生成需要从头开始计算。首先,模型要对输入的初始上下文(如某些提示语句或开始符号)进行编码(例如,文本的嵌入层),然后对其进行多层的计算以生成第一个 token 的预测。这一过程涉及了从模型的输入到生成第一个输出的全面计算。
    • 此外,Transformer 模型还需要在每一层的计算中存储、更新一些中间变量,特别是注意力机制中的键(K)、值(V)和查询(Q)矩阵的计算,所有这些都需要在第一个 token 生成时进行完整的计算。
  • 后续 token 的生成

    • 当生成第二个 token 时,模型已经对首个 token 做了计算并产生了一个输出。此时,生成后续 token 时,模型会将第一个 token 的输出作为新的上下文,并基于这个已有的上下文进行增量更新。
    • 增量更新的关键是,模型不需要重复计算已经处理过的部分。例如,在 Transformer 中,计算每一层的 attention 时,注意力的 K 和 V 会被缓存,在生成新的 token 时,模型只需要使用这些已缓存的信息,同时计算新的 token 的查询(Q)并更新模型的输出。
    • 由于大部分计算都可以通过增量更新的方式复用之前的计算结果,后续 token 的生成相较于首个 token 要更高效,因为它避免了重复计算已处理的上下文和中间表示。

2. 自注意力机制的工作原理

Transformer 模型的核心计算就是自注意力机制(Self-Attention),其关键思想是对输入的所有 token 进行相互之间的加权求和。在生成每个 token 时,需要计算当前 token 对所有前面已经生成的 token 的影响。

  • 在生成首个 token 时,模型需要从零开始生成上下文,并计算每个 token 的影响和权重。
  • 在生成后续 token 时,已经生成的 token 会作为上下文传入模型,并影响后续 token 的生成。每次生成新的 token 时,模型只需要对当前生成的 token 和前面的所有 token 进行一次新的计算,这意味着后续 token 的计算可以通过增量更新完成,不需要重新处理所有 token。

例如,在解码器阶段(如 GPT 系列的自回归生成),每生成一个 token 后,它会被追加到当前的上下文中,然后基于更新后的上下文继续生成下一个 token。因为之前生成的 token 的计算结果已被缓存,所以生成每个新的 token 时,计算量大大减少。

3. 模型的内部缓存

大多数现代语言模型(如 GPT 或 T5)使用内部缓存机制来优化生成过程。具体来说:

  • 在生成第一个 token 时,模型需要为每一层的计算存储相关的中间变量,例如注意力的 K、V 和 Q 矩阵。
  • 在生成后续 token 时,已经存储的 K 和 V 矩阵不需要重新计算,而是直接在缓存中使用。这使得生成后续 token 时的计算成本比首个 token 低很多。

由于缓存机制,后续每个 token 的生成仅需要计算新生成的 token 的查询(Q)向量与之前生成的键(K)和值(V)的相互作用,避免了重复计算之前已经生成的内容。

4. 加速技术:批量计算与并行化

为了进一步降低后续 token 生成的计算开销,一些模型采用了并行化和批量计算的技术:

  • 批量生成:在许多实现中,可以同时生成多个 token(比如使用 beam search 或并行解码策略)。这样,模型的计算可以在多个 token 之间共享相同的计算资源,从而减少重复计算。

  • 并行化计算:由于每个 token 生成时只需要考虑已经生成的 token,并不会依赖于未来的 token,这种特性使得模型能够在一定程度上并行化后续 token 的计算。虽然这种并行化通常会受到硬件架构的限制,但仍能显著提高生成效率。

5. 累积推理与局部性原理

在生成后续 token 时,通常会使用之前生成的 token 来逐步改进模型的推理。这个过程中,模型的推理依赖于局部上下文(即前面生成的 token)。相比于完全从头开始的首个 token 生成,后续 token 的生成仅依赖于较小的局部上下文,从而能够更快速地推理。

总结

总的来说,后续 token 生成的计算花销通常低于首个 token,因为:

  1. 增量计算:后续 token 只需要基于前面已生成的 token 来更新当前输出,避免了重复计算。
  2. 缓存机制:已经计算好的中间结果(如 K 和 V)可以复用,不需要重新计算。
  3. 并行化:后续 token 的生成过程更适合并行化计算和批量生成,从而提高推理效率。
  4. 自注意力的局部性:后续 token 的生成只涉及局部上下文,相比首个 token 的全局计算,减少了计算量。

这些因素共同作用,使得生成后续 token 时的计算开销显著低于生成首个 token。

Поделиться этим Q&A