正文
执行模型的前向传递。
在第 9 步
:
model.forward
将调用每个层的
forward
函数,大部分时间花费在自注意力部分。因此,注意力后端成为模型推理的瓶颈。除了性能之外,还有许多不同类型的注意力变体,如
MHA
,
MLA
,
GQA
,
Sliding Window
,
Local Attention
需要仔细优化的注意力后端实现。
注意力后端继承关系
以下是注意力变体的继承关系:
让我们通过
AttentionBackend
类中的方法来看看 SGLang 中的注意力后端是什么:
-
forward()
: 当
model.forward()
被调用时,
AttentionBackend
中的
forward
方法将被调用。它将根据
forward_batch.forward_mode
调用
forward_extend()
和
forward_decode()
。在这篇博客中,我们只关注
EXTEND
和
DECODE
模式。
-
forward_extend()
: 当
forward_mode
是
EXTEND
时,此方法将被调用。
-
forward_decode()
: 当
forward_mode
是
DECODE
时,此方法将被调用。
-
init_cuda_graph_state()
: 此方法将在服务器启动期间被调用,它将预分配那些将在 CUDA Graph 重放中使用的张量。
-
init_forward_metadata()
: 当
model.forward()
被调用时,此方法将被调用。它可以在整个
model.forward()
调用中预计算一些元数据,并被每个
layer
重用,这对于加速模型推理至关重要。有趣的是,这个元数据是注意力后端中最复杂的部分,一旦我们设置好它,在这种情况下的
计算就相当简单了。
-
init_forward_metadata_capture_cuda_graph()
: 此方法将在服务器启动期间被调用,
CUDAGraphRunner