LLM推理不确定性根源与确定性方案
19900
画布
|大纲
内容详情
背景与问题
现象
- 温度=0仍不一致
- 贪婪采样(temperature=0)理论上确定,但API与开源引擎(vLLM/SGLang)仍输出不同结果
- 影响
- 科学可重复性缺失
- 在线策略RL退化为离线策略
误区:并发+浮点假说
常见解释
- 浮点非结合性
- (a+b)+c≠a+(b+c)因舍入误差
- 并发原子加
- 多线程完成顺序随机→累加顺序随机
反例
- 矩阵乘法实验
- 同一GPU重复运行torch.mm得按位相同结果→并发本身非元凶
真因:批次大小敏感性(缺乏批次不变性)
定义
- 批次不变性
- 同一请求的输出与batch中其他请求存在与否无关
- 观察
- 同一matmul,单元素vs整批提取首元素,差值可达1e3量级
系统视角
- 推理服务器内部
- 前向pass确定(无原子加)
- 用户视角
- 并发负载随机→batch size随机→数值路径随机→输出随机
核心算子批次不变性改造
RMSNorm
- 数据并行策略
- 每SM处理整行→缩减顺序固定
- 小batch挑战
- SM过剩→需split-reduction,破坏不变性
- 解决方案
- 忽略小batch性能或采用固定缩减策略
MatMul
- 数据并行tiling
- 输出tile整块归约保留于单SM
- Split-K与Stream-K
- 沿K维拆分→多SM累加→顺序随机
- 固定策略
- 统一tile配置/PTX指令,牺牲<20%性能换确定性
Attention(FlashAttention)
- 数据并行Q
- 沿Q并行,K/V归约留在单SM
- KV-cache边界
- 分块预填充→块数变→归约顺序变
- Split-KV解码
- 查询长度短→需沿KV拆分→策略随长度变
- 固定拆分大小
- 每段长度固定,段数随总长变化→归约顺序恒定
实现与验证
工具链
- vLLM + FlexAttention
- 非侵入式替换PyTorch算子
- 仓库
- thinking-machines-lab/batch-invariant-ops
实验
- 不确定性量化
- Qwen3-235B温度0,1000次生成→80种不同完成;启用批不变内核→100%一致
- 性能评估
- Qwen-8B单GPU:默认26s→确定性55s→优化注意力42s
在线策略RL
- 问题
- 采样/训练数值不一致→隐式离策略
- 解决
- 位级确定性→KL=0,奖励曲线平稳,无需重要性加权
