SGLang实现确定性推理与可重现RL训练

本文介绍SGLang团队在实现确定性推理方面的努力,以及与slime团队合作推动可重现RL训练的进展。基于Thinking Machines Lab的batch-invariant算子,SGLang实现了完全确定性推理,同时兼容chunked prefill、CUDA graphs、radix cache和非贪婪采样,使用CUDA graphs可获2.8x加速,性能开销仅34.35%(优于TML的61.5%)。进一步,与slime结合,实现100%可重现RL训练,在Qwen3-8B上验证两轮独立训练曲线完全一致。通过全面测试套件验证确定性,支持FlashInfer、FlashAttention 3和Triton后端,适用于调试与科学实验。未来将优化性能至20%以内开销。

TL;DR:本文分享SGLang实现确定性推理的努力,以及与slime合作推动可重现RL训练的进展。

近日,Thinking Machines Lab发布了一篇博客,详述其研究发现。此后,业界反响热烈,期待开源推理引擎实现稳定、实用的确定性推理,甚至进一步实现完全可重现的RL训练。如今,SGLang与slime联手提供了解决方案。

基于Thinking Machines Lab的batch-invariant算子,SGLang实现了完全确定性推理,同时保持与chunked prefillCUDA graphsradix cachenon-greedy sampling的兼容性。启用CUDA graphs后,SGLang带来2.8x加速,性能开销降至34.35%(对比TML的61.5%)。

在此基础上,SGLang与slime团队合作,进一步解锁100%可重现RL训练——仅需少量代码修改即可实现。在Qwen3-8B上的验证实验显示,两轮独立训练产生完全相同的曲线,为严谨的科学实验提供可靠保障。

slime可重现RL训练指南

*可重现指南*

为什么确定性推理如此重要

大型语言模型(LLMs)推理的一致性输出能力日益重要。例如,推理结果的不确定性可能将on-policy强化学习(RL)隐式转化为off-policy RL(如研究者指出)。即使在SGLang中将temperature设为0,采样仍非确定性,因为动态批处理和radix cache的影响(过去讨论见此处)。

如TML博客所述,最大不确定性来源是批次大小变化:用户重复提交相同prompt时,因与其他请求批处理,批次大小差异导致非确定性输出。具体而言,不同批次大小影响内核的reduction splitting,导致reduction block顺序和大小变化,由于浮点运算非结合性,产生非确定输出。为解决此问题,他们用batch-invariant实现替换了reduction内核(RMSNorm、矩阵乘法、注意力等),并以伴生库形式开源。

Thinking Machines Lab击败LLM推理非确定性示意图

He, Horace and Thinking Machines Lab, "Defeating Nondeterminism in LLM Inference", Thinking Machines Lab: Connectionism, Sep 2025.

基于TML工作,SGLang提供高吞吐量的确定性LLM推理解决方案,结合batch-invariant内核、CUDA graphs、radix cache和chunked prefill,性能高效。通过全面测试和RL训练实验验证确定性。

关键增强包括:

  • 集成TML的batch-invariant内核,包括mean、log-softmax和矩阵乘法内核。
  • 实现batch-invariant注意力内核,固定split-KV大小,支持FlashInfer、FlashAttention 3和Triton等多种后端。
  • 完全兼容常见推理特性,如chunked prefill、CUDA graph、radix cache,在确定性模式下均支持。
  • 暴露per-request seed,允许temperature > 0时启用确定性推理。
  • 性能优化:对比TML博客的61.5% slowdown,SGLang在FlashInfer和FlashAttention 3后端平均仅34.35%,CUDA graphs下达2.8x加速。

实验结果

验证确定性行为

我们引入确定性测试套件,验证不同批处理条件下推理结果一致性。测试覆盖三个子测试,从简单到复杂:

  • Single:相同prompt在不同批次大小下运行,检查输出一致。
  • Mixed:同一批次混入短/长prompt,验证一致性。
  • Prefix:从同一长文本派生不同前缀长度prompt,随机批处理,测试可重现性。

50次采样试验结果,数字表示每个子测试的唯一输出计数(越低越确定)。

Attention BackendModeSingle TestMixed Test (P1/P2/Long)Prefix Test (prefix_len=1/511/2048/4097)
FlashInferNormal43 / 3 / 25 / 8 / 18 / 2
FlashInferDeterministic11 / 1 / 11 / 1 / 1 / 1
FA3Normal33 / 2 / 24 / 4 / 10 / 1
FA3Deterministic11 / 1 / 11 / 1 / 1 / 1
TritonNormal32 / 3 / 15 / 4 / 13 / 2
TritonDeterministic11 / 1 / 11 / 1 / 1 / 1

*测试于QWen3-8B。启用CUDA graph和chunked prefill,FlashInfer和Triton禁用radix cache(支持开发中)。

CUDA Graph加速

CUDA graphs通过合并多个内核启动为单一启动加速推理。评估16个请求(输入/输出各1024 tokens)的总吞吐量,结果显示所有注意力内核至少2.79x加速。

Attention BackendCUDA GraphThroughput (tokens/s)
FlashInferDisabled441.73
FlashInferEnabled1245.51 (2.82x)
FA3Disabled447.64
FA3Enabled1247.64 (2.79x)
TritonDisabled419.64
TritonEnabled1228.36 (2.93x)

*配置:QWen3-8B, TP1, H100 80GB。所有性能基准禁用radix cache。

离线推理性能测量

使用三种常见RL rollout工作负载(256请求,不同输入/输出长度)测量端到端延迟。确定性模式开销25%-45%,FlashInfer和FA3平均34.35%。主要开销来自未优化的batch-invariant内核,优化空间大。

Attention BackendModeInput 1024 Output 1024Input 4096 Output 4096Input 8192 Output 8192
FlashInferNormal30.85332.321623.87
FlashInferDeterministic43.99 (+42.6%)485.16 (+46.0%)2020.13 (+24.4%)
FA3Normal34.70379.851438.41
FA3Deterministic44.14 (+27.2%)494.56 (+30.2%)1952.92 (+35.7%)
TritonNormal36.91400.591586.05
TritonDeterministic57.25 (+55.1%)579.43 (+44.64%)2296.60 (+44.80%)

*配置:QWen3-8B, TP1, H200 140GB。禁用radix cache。

确定性推理虽较正常模式慢,建议用于调试和可重现性。未来工作聚焦加速,目标开销降至20%以下或与正常模式持平。

使用方法

环境设置

安装SGLang ≥0.5.3版本:

pip install "sglang[all]>=0.5.3"

启动服务器

SGLang支持多模型确定性推理。例如Qwen3-8B仅需添加--enable-deterministic-inference标志:

python3 -m sglang.launch_server \ --model-path Qwen/Qwen3-8B \ --attention-backend <flashinfer|fa3|triton> \ --enable-deterministic-inference

技术细节

Chunked Prefill

SGLang的chunked prefill技术用于处理长上下文请求,但默认分块策略违反注意力内核的确定性要求。如图所示,考虑两个长度6000的序列seq_a和seq_b,最大chunk大小8192,确定性注意力所需split-KV大小2048。每个序列可被分块处理...