把同一份 prompt 分别发到两台部署了相同权重的 vLLM 实例,temperature 设 0,输出却有 3 处措辞不同,业务方怀疑模型被换过。
一开始怀疑是「张量并行度不同导致 all-reduce 顺序变化」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。temperature 为 0 时仍存在浮点累加顺序差异。少数情况下是两台的 dtype 不同,一台 fp16 一台 bf16。
还有一种情况,两台的 max_tokens 或 stop 配置不一致。
动手时先记录两台的启动参数与 dtype
curl -s http://10.0.0.11:8000/v1/models | jq '.data[0].id'
固定 seed 与采样参数再各跑 5 次
python -c "import json;print(json.dumps({'temperature':0,'seed':42,'top_p':1}))"
接着对齐 dtype 与张量并行度后重启
python -m vllm.entrypoints.openai.api_server --model Qwen2.5-7B-Instruct --dtype bfloat16 --tensor-parallel-size 2
剩下的就是按 token 级做差异对比定位分歧位置
python diff_tokens.py --a out_a.txt --b out_b.txt
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
恢复的判定其实很直接。两台实例在相同参数下输出的前 200 token 完全一致,差异不再出现,业务方确认模型版本未变。
推理不是严格确定性的,dtype 与并行度都会影响累加顺序,要求可复现就必须把这两项也纳入配置基线。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
