推理阶段不同batch size对大模型推理结果的影响 SGLang最新版本提供了确定性推理的方法:SGLang的确定性推理!!!Thinking Machines Lab对这个问题基本上画上了句号在其官方blog大模型推理阶段进行batch inference批处理推理解码会像预期的那样速度很快推完吗会不会有什么问题batch inference推理的结果居然会和一条一条推理结果差的很远Batch Decoding/Inference of LLMs will cause different outputs with different batch size?!行为表现测试中可以发现即使是在推理阶段不是在训练阶段对于多模态大模型VLLM如果推理时候为了加速推理不是一条一条数据让模型推而是一次推理batch_size1条数据对比batch_size1和batch_size1的结果会发现这两份结果分布是不一样的why可能表现为batch_size1测下来的模型推理结果基本上都是对的例如本身让模型回复“是”或者“否”很短的回答模型回答的挺好的不仅正确而且简短没有废话调试好了之后大规模数据上batch inference批处理batch_size1发现推理没有变快推理结果还有问题准确性大幅下降模型甚至给出了很多长回复(例如模型开始解释或者开始模棱两可说为什么不能回答这个问题)是否是模型随机种子、采样影响推理阶段影响模型随机性的参数推理阶段影响模型随机性的参数可以控制的主要有3个分别为temperature、topK和topPtemperature:温度参数影响输出的概率分布当温度接近0时模型会变得非常确定性几乎总是选择具有最高概率的下一个词从而产生更加一致但可能较为重复或缺乏创意的输出。如果希望减少随机性可以将温度设得低一些topK只考虑最有可能的k个词汇并从中进行随机选取设置一个较小的k值可以帮助减小随机性因为只有少量高概率的词汇会被选中topP它基于累积概率来决定候选词汇集。具体来说模型会选择累积概率达到p阈值的最少数量的词汇作为候选。p值通常设定为0.8或0.9左右这意味着大约80%或90%的累计概率被覆盖。如果想进一步降低随机性可以提高这个值有的人会觉得batch inference结果的差异是模型本身随机性导致的从分布里面采样采出来结果不可能每次都一样。为了去掉随机性干扰可以把temperature设置为0topK和topP都做类似的设置。当然最好的方式直接设置do_sample或者是samplingFalse解码时不进行随机采样这样结果按理就是确定的。结果表明即使samplingFalsebatch inference的结果还是会和batch_size1不一样batch inference结果受到哪些因素影响在do_sampleFalse的情况下已知的会影响推理结果的因素主要有batch size不同batch size大小结果会很不一样padding side (left/right)无论左还是右都不能消除左和右的推理结果也会很不一样padding value (unkeosbos0)用不同的padding值都不能消除差异不同padding的值也会右影响dtype数据类型也会有影响有人怀疑是RMSNorm导致的浮点溢出的问题FP32、BF16、FP16等都会有影响即使和原始模型的dtype一样batch inference解码结果也会不一样KV-cache是否打开KV-cache也会影响但是关闭KV-cache并不能解决问题已知的会影响到的模型包括所有使用旋转位置编码的模型解决方法无目前还没有修复可以参考下面的github上gante的comment缓解的方式在使用多模型模型MiniCPM-V-2.6尝试保证每个batch里面输入的token长度是一样的都是问同一个问题并且图片的数量一样这种情况下就不需要padding得到的batch inference的结果统计下来和batch_size1的结果是一致的避免的方式微调模型如果是需要确定性回答的比如让模型做分类任务输出class标签或者VQA做选择题让微调时prompt和inference一样被batch size影响的程度会比较小目前测下来是这样的可能F1上偏差3%参考探究inference阶段batch inference差异的论文The batch size can affect inference resultsOpenreviewgithub上的深入探究huggingface的探究