SGLang 是什么
SGLang 是一种面向 LLM 和 VLM 的高性能推理框架。主要的功能就是为用户提供与模型更高效、更可控的交互方式。
目前主流的大模型推理框架包括: - vLLM - OpenLLM - Text Generation Inference - …
目前大家常用的两种是 vLLM 和 SGLang,也常常将二者性能进行比较。SGLang 相对于 vLLM 拥有更高的吞吐量,但是 vLLM 支持更多的模型,拥有更加丰富的生态。
SGLang 结构

如上图所示,SGLang 的结构主要分为三个部分: - SGLang Client:前端部分,用户主要通过这个部分提供的原语发送请求 - SGLang Runtime:后端部分,这个部分的任务是处理用户请求,并调用大模型进行推理 - Interpreter: 构建前端到后端运行时的「桥梁」
SGLang Client
前端是一种专为 LLM 设计的,可以嵌入在 Python 中使用的领域特定语言。它提供了一些针对 LLM 编程的原语,目的就是简化 LLM 程序的编写。更简单粗暴地理解,就是前端提供了一些 API 函数,用户可以直接调用这些函数,而不用去了解底层的细节。前端主要解决的是调度和控制问题。
SGLang 中提供原语主要有以下几种: - gen:用于调用 LLM 生成 - select:用于让 LLM 从列表中选择概率最高的选项 - += 或 extend:用于扩展当前的提示 - fork / join:分叉或者合并提示状态
以下是一个简单的例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28dimensions = ["Clarity", "Originality", "Evidence"]
def multi_dimensional_judge(s, path, essay):
s += system("Evaluate an essay about an image.")
s += user(image(path) + "Essay:" + essay)
s += assistant("Sure!")
# Return directly if it is not related
s += user("Is the essay related to the image?")
s += assistant(select("related", choices=["yes", "no"]))
if s["related"] == "no": return
# Judge multiple dimensions in parallel
forks = s.fork(len(dimensions))
for f, dim in zip(forks, dimensions):
f += user("Evaluate based on the following dimension:" +
dim + ". End your judgment with the word 'END'")
f += assistant("Judgment:" + gen("judgment", stop="END"))
# Merge the judgments
judgment = "\n".join(f["judgment"] for f in forks)
# Generate a summary and a grade. Return in the JSON format.
s += user("Provide the judgment, summary, and a letter grade")
s += assistant(judgment + "In summary," + gen("summary", stop=".")
+ "The grade of it is" + gen("grade"))
schema = r'\{"summary": "[\w\d\s]+\.", "grade": "[ABCD][+-]?"\}'
s += user("Return in the JSON format.")
s += assistant(gen("output", regex=schema))
state = multi_dimensional_judge.run(...)
print(state["output"])
比如第 5 行通过 += 将用户输入加入到当前提示中,第 9 行通过 select 让 LLM 从列表中选择概率最高的选项,第 12 行通过 fork 分叉提示状态为多个维度,第 16 行通过 gen 生成文本。
Interpreter
在 SGLang 中,提示被视作是异步流。也就是说在执行 gen 等原语时,解释器会将这些原语提交到流中进行异步执行。这些提交调用是非阻塞的,允许 Python 解释器继续执行其他代码,而不需要等待 LLM 生成完成。主要管理程序内部的并行性和同步性。
SGLang 还提供了编译器的方式,支持将程序编译成计算图,并且应用图执行器运行。
SGLang Runtime
SGLang 的后端是一个集成了推理请求调度、KV Cache 管理和 GPU 推理优化的全栈后端引擎。主要解决的是推理加速的问题。这一部分也是当前优化的重点。
核心技术亮点包括: - RadixAttention - 压缩有限状态机高效解码(详见此文) - API 推测性执行
RadixAttention 和压缩有限状态机打算单独介绍。
API 推测性执行的目的是减少 API 的调用。比如以下例子:1
s += context + "name:" + gen("name", stop="\n") + "job:" + gen("job", stop="\n")
gen 需要两次调用 API 来实现。SGLang 的推测性执行机制会在首次调用的时候(gen("name", stop="\n"))智能地忽略停止条件,继续生成一些额外的 token。解释器会保留这些预生成的输出。在后续调用的时候(gen("job", stop="\n"))进行精确的匹配和复用。这需要精心设计的提示,让模型的输出能够被复用。通过这种方式,可以减少 API 调用的延迟和输入成本。