Mini-SGLang 源码阅读(一):一次 LLM 请求如何穿过推理引擎
大模型推理框架并不只是执行一次 model.forward()。在线服务面对的是持续到达、长度不同、生成进度不同的请求,它必须同时解决文本编解码、动态批处理、KV Cache、GPU 执行和流式返回。 Mini-SGLang 把这些问题压缩在一套相对紧凑的代码中。本文先不进入具体优化,而是建立阅读后续源码所需的整体模型:一次请求如何从 HTTP 文本进入系统,经过 Prefill 和多轮 Decode,最后以流式文本返回。 本文基于 Mini-SGLang 提交 9a91cfa。 一、推理为何分成 Prefill 和 Decode 输入 prompt 包含多个 token。模型第一次执行时,需要同时处理全部输入 token,并为每一层生成 Key、Value。这一阶段称为 Prefill。 输入: [t0, t1, t2, t3] 计算: 同时处理多个位置 产物: 最后位置的 logits + 四个位置的 KV Cache 接下来每轮只生成一个 token。已有 token 的 K、V 不应重复计算,只需读取缓存并计算新 token: 已有: [t0, t1, t2, t3] 第 1 轮 Decode:输入 t3,生成 t4 第 2 轮 Decode:输入 t4,生成 t5 第 3 轮 Decode:输入 t5,生成 t6 因此两阶段的计算形态不同:Prefill 计算量大、输入长度不等;Decode 单次计算小,但会循环很多轮。现代推理引擎通常分别为两者设计调度与 Attention kernel。 ...