note
一、Sglang推理框架介绍
技术特点:
- RadixAttention:通过共享前缀请求和高效缓存策略,SGLang能在理论上实现十万级token/s的超高吞吐量,同时显著降低响应延迟;
- 分布式调度:支持跨节点自动负载均衡;
- 高效结构化输出:内置高性能JSON解析模块,便于构建面向结构化数据查询的API服务,适合复杂自动化工作流;
- 轻量模块化架构:采用灵活的模块化设计,便于快速集成新技术(如FlashInfer内核),不断优化推理效率;
- 混合精度计算:FP16与FP32智能切换
sglang也是ucb的团队,但是跟vllm是不同的一拨人,核心团队不到10人。有借鉴了一款叫做lightllm的推理引擎,也import很多vllm代码,后续会完全去掉对vllm的依赖。其优势在于:
第一,sglang的性能是目前最优的(在2024年)。这里说的性能主要是吞吐。sglang通过多进程zmp传输中间数据来cover掉cpu的开销,高负载下gpu利用率可以到80%以上。还有一些美中不足的就是,实现prompt cache的逻辑也被放在了forward()主进程里,不然的话GPU利用率应该可以跟lmdeploy一样保持在95%左右。我看最近好像也已经在优化这部分了,到时候吞吐还能提10%。除此之外,sglang在推理的各个环节都有做各种细致的工程优化。
第二,sglang的代码可拓展性很高,主流功能都有支持的情况下,代码比vllm清晰简单很多,这对于二次开发来说是很重要的。
第三,sglang的社区活跃度虽然比不上vllm,但是作者都很积极地回复issue。而且现在开发节奏基本上是一周一个版本,有些功能还不太完善的地方下一个版本基本马上就更新了。
二、Sglang启动推理服务
(1)安装:pip install "sglang[all]>=0.4.6.post1"
,截止20250705能用
(2)下面是一个基础的启动推理服务的例子,相关重要的参数有:
- 该推理服务可以作为实现OpenAI API协议的服务器进行部署。默认情况下,它将在 http://localhost:30000 启动服务器。您可以通过 --host 和 --port 参数来自定义地址。
tensor-parallel-size
:使用张量并行的分布式推理,下面设置为4就是在4块GPU上使用张量并行reasoning-parser
:设置为qwen3
时,调用推理服务得到的有content
和reasoning_content
字段tool-call-parser
:SGLang 支持将模型生成的工具调用内容解析为结构化消息,具体可以参考:https://qwen.readthedocs.io/zh-cn/latest/framework/function_call.htmlmem-fraction-static
:控制每个 GPU 的显存预分配比例,默认值为 0.9,适当调整此值可以平衡显存占用和推理性能api-key
:可选host
:运行推理服务的主机地址port
:运行推理服务端口号context-length
:模型能够处理的最长上下文json-model-override-args
:以 JSON 格式覆盖模型的参数,用于动态调整模型的某些配置,这里可以设置rope_type
为yarn(rope的缩放技术,实现模型外推)- Qwen3 模型在预训练中的上下文长度最长为 32,768 个 token,如果场景是需要最大长度为65,536 个 token,则最好将 factor 设置为 2.0。
- 如果模型输入不是很长,这个参数可以不设置
model_path="/root/xx"
model_name="qw3_test_model"
PYTORCH_NVML_BASED_CUDA_CHECK=1 \
CUDA_VISIBLE_DEVICES=3,1,0,2 \
TRANSFORMERS_OFFLINE=1 \
HF_DATASETS_OFFLINE=1 \
python -m sglang.launch_server \
--model-path $model_path \
--trust-remote-code --served-model-name $model_name \
--tensor-parallel-size 4 \
--mem-fraction-static 0.90 \
--api-key sk-123456 \
--host 0.0.0.0 --port 8000 \
--tool-call-parser qwen25 \
--reasoning-parser qwen3 \
--context-length 131072 \
--json-model-override-args '{"rope_scaling":{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}}'
启动推理服务后的python请求代码如下,注意:
enable_thinking
并非OpenAI API定义的参数,具体传入方式可能因推理框架不同而不同
from openai import OpenAI
# Set OpenAI's API key and API base to use SGLang's API server.
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:30000/v1"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
chat_response = client.chat.completions.create(
model="Qwen/Qwen3-8B",
messages=[
{"role": "user", "content": "Give me a short introduction to large language models."},
],
max_tokens=32768,
temperature=0.6,
top_p=0.95,
extra_body={
"top_k": 20,
},
)
print("Chat response:", chat_response)
- 要完全禁用思考,可以在启动模型时使用自定义聊天模板:
python -m sglang.launch_server --model-path Qwen/Qwen3-8B --chat-template ./qwen3_nonthinking.jinja
,该聊天模板会阻止模型生成思考内容,即使用户通过 /think 指示模型这样做
# qwen3最初的模版结尾:
{%- if add_generation_prompt %}
{{- '<|im_start|>assistant\n' }}
{%- if enable_thinking is defined and enable_thinking is false %}
{{- '<think>\n\n</think>\n\n' }}
{%- endif %}
{%- endif %}
# qwen3_nonthinking.jinja模板结尾
{%- if add_generation_prompt %}
{{- '<|im_start|>assistant\n<think>\n\n</think>\n\n' }}
{%- endif %}
Reference
[1] sglang官方文档: https://docs.sglang.ai/backend/quantization.html#examples-of-offline-model-quantization
[2] https://github.com/sgl-project/sglang
[3] Qwen3如何实现快慢混合思考、可启动关闭