超参数调优#

实现峰值吞吐量#

实现大的批处理大小是获得高吞吐量最重要的事情。

当服务器满负荷运行时,在日志中查找以下内容

解码 批次. #正在运行的请求: 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 减小到 40962048

  • 如果在 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.compilemax-autotune-no-cudagraphs 模式。自动调优可能很慢。如果你想在许多不同的机器上部署模型,可以将 torch.compile 缓存传输到这些机器上,跳过编译步骤。这基于 PyTorch 官方文档

示例

  1. 通过设置 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
    
  2. 将缓存文件夹复制到其他机器,并使用 TORCHINDUCTOR_CACHE_DIR 启动服务器。

调整 --schedule-policy#

如果工作负载有许多共享前缀,请使用默认的 --schedule-policy lpm。其中 lpm 代表最长前缀匹配。

当你完全没有共享前缀,或者你总是将带有共享前缀的请求一起发送时,你可以尝试 --schedule-policy fcfs。其中 fcfs 代表先到先服务。这个策略具有较低的调度开销。