Inference Optimization

对 Batch 的理解

batch 的概念总能听到,而我们能普遍接触到的就是普通用户使用网页端大模型的这个视角

  1. 训练阶段的 batch 是 dataloader 产生的,因为输入数据集自然包含了多个用户的输入
1
2
3
4
5
6
7
8
sample 1:
"The cat sits on the mat"

sample 2:
"Transformer is powerful"

sample 3:
"Deep learning ..."

由此自然就组合为了 batch 的输入

1
2
3
4
5
6
7
Batch:
[
  sample1 tokens,
  sample2 tokens,
  sample3 tokens,
  ...
]
  1. 推理阶段。从单个用户的视角来说,每个人的请求都只是一个 batch,例如下面三个用户的请求
1
2
3
4
5
6
7
8
用户 A:
帮我写一个论文摘要

用户 B:
解释一下 Transformer

用户 C:
写一个 Python 程序

但是对于底层的推理引擎来说,从性能角度考虑,一定不会逐用户的处理三项请求,而是会产生如下的 batch 数据

1
2
3
4
5
6
7
8
GPU batch:

[
 request A token sequence,
 request B token sequence,
 request C token sequence,
 request D token sequence
]
  1. MOE 阶段的 batch

MoE 中 expert 接收的 batch size 和 LLM serving 中的用户数量完全不是一个概念

如果从 Transformer 数据流来看,Attention 的输出为 $X \in \mathbb{R}^{B \times S \times H}$

进入 MOE FFN layer 后,X 会 从 [B, S, H] reshape 为 [T, H]。之后会将 T 个 token 分配给不同的 expert,每个 expert 拿到的 token 数量则是这个 expert 的 batch size。这一点其实是可以同 FFN 的计算公式对应上的

Inference & Serving

  1. LLM inference 研究模型怎么算得快
  2. LLM serving 研究很多人同时调用模型时,整个系统怎么服务得好。

Inference 侧重 kernel/parallelism; Serving 建立在 inference 之上,但增加了调度、资源管理和多用户场景。

0%