超参数调优#
实现峰值吞吐量#
实现大的批处理大小是获得高吞吐量最重要的事情。
当服务器满负荷运行时,在日志中查找以下内容
解码 批次. #正在运行的请求: 233, #token: 370959, token 使用率: 0.82, 生成 吞吐量 (token/秒): 4594.01, #队列中的请求: 317
调整你的请求提交速度#
#queue-req
表示队列中的请求数量。如果你经常看到 #queue-req == 0
,这表明你的瓶颈是请求提交速度。
#queue-req
的健康范围是 50 - 500
。
另一方面,不要让 #queue-req
过大,因为它也会增加服务器的调度开销,尤其是在使用默认的最长前缀匹配调度策略(--schedule-policy lpm
)时。
调整 --schedule-conservativeness
#
token usage
表示服务器的 KV 缓存内存利用率。token usage > 0.9
表示良好的利用率。如果你经常看到 token usage < 0.9
且 #queue-req > 0
,这意味着服务器在接收新请求方面过于保守。你可以将 --schedule-conservativeness
减小到 0.3 之类的值。服务器过于保守的情况可能发生在用户发送许多具有较大 max_new_tokens
的请求,但由于 EOS 或停止字符串导致请求很早停止时。
另一方面,如果你看到 token usage
非常高,并且经常看到诸如 decode out of memory happened, #retracted_reqs: 1, #new_token_ratio: 0.9998 -> 1.0000
的警告,你可以将 --schedule-conservativeness
增加到 1.3 之类的值。如果你偶尔看到 decode out of memory happened
但不频繁,那也没关系。
调整 --dp-size
和 --tp-size
#
数据并行对吞吐量更好。当有足够的 GPU 内存时,始终优先选择数据并行以获得更高的吞吐量。请参阅 sglang 路由器 以获得更好的数据并行性,而不是使用 dp_size
参数。
通过调整 --chunked-prefill-size
, --mem-fraction-static
, --max-running-requests
避免内存不足#
如果你看到内存不足 (OOM) 错误,可以尝试调整以下参数。
如果在 prefill 期间发生 OOM,请尝试将
--chunked-prefill-size
减小到4096
或2048
。如果在 decoding 期间发生 OOM,请尝试减小
--max-running-requests
。你也可以尝试减小
--mem-fraction-static
,这会减少 KV 缓存内存池的内存使用,对 prefill 和 decoding 都有帮助。
为 torch.compile
启用缓存#
要启用 torch.compile
加速,请添加 --enable-torch-compile
。它可以在小批量大小下加速小型模型。默认情况下,torch.compile
会自动将 FX 图和 Triton 缓存到 /tmp/torchinductor_root
中,该目录可能会根据系统策略被清除。你可以导出环境变量 TORCHINDUCTOR_CACHE_DIR
将编译缓存保存在你希望的目录中,以避免不必要的删除。你还可以与其他机器共享缓存以减少编译时间。
SGLang 使用 torch.compile
的 max-autotune-no-cudagraphs
模式。自动调优可能很慢。如果你想在许多不同的机器上部署模型,可以将 torch.compile
缓存传输到这些机器上,跳过编译步骤。这基于 PyTorch 官方文档。
示例:
通过设置
TORCHINDUCTOR_CACHE_DIR
并运行模型一次来生成缓存。TORCHINDUCTOR_CACHE_DIR=/root/inductor_root_cache python3 -m sglang.launch_server --model meta-llama/Llama-3.1-8B-Instruct --enable-torch-compile
将缓存文件夹复制到其他机器,并使用
TORCHINDUCTOR_CACHE_DIR
启动服务器。
调整 --schedule-policy
#
如果工作负载有许多共享前缀,请使用默认的 --schedule-policy lpm
。其中 lpm
代表最长前缀匹配。
当你完全没有共享前缀,或者你总是将带有共享前缀的请求一起发送时,你可以尝试 --schedule-policy fcfs
。其中 fcfs
代表先到先服务。这个策略具有较低的调度开销。