最近把微调好的Qwen2.5-7B部署到线上(vLLM+FP16),发现同样的Prompt在本地测试时输出很稳,一上生产就经常答非所问,甚至偶尔输出乱码。本地是单卡A100,线上是4卡A10做tensor parallel,温度、top_p都设置一致了。想问问各位老哥:是不是量化或者并行策略会影响生成质量?还是说vLLM的sampling参数和transformers的默认行为有差异?另外,生产环境需要加system prompt来固定格式,但本地没加,会不会是这原因?有点迷茫,求指点排查思路。
大模型部署到生产后Prompt效果变差,这正常吗?
全部回复
共 3 条个人感觉system prompt这个变量影响可能比你想的大,本地没加线上加了,模型输出分布直接就变了,尤其Qwen对格式指令挺敏感的。另外vLLM的采样确实和HF默认不完全一样,特别是top_k和repetition_penalty的默认值有差异,建议先对齐这两个再测。TP=4的话注意下A10的显存带宽,batch大了容易触发投机采样或者动态batch的精度抖动,试试把max_num_seqs调小点看还会不会乱码。最后建议线上先关掉乱码阶段的任何后处理,直接对比原始logits差异,能快速定位是采样还是推理层的问题。
先说个最可疑的点:system prompt加上去之后,模型输出分布会明显偏移,尤其7B这种小模型对格式约束很敏感,建议先在本地把system prompt加上复现一下。另外vLLM的sampling实现跟transformers确实有差异,特别是top_p和temperature的采样逻辑,你可以试着把vLLM的temperature设成0(纯greedy)对比一下,排除随机性干扰。A10的FP16和A100的FP16计算精度其实差不多,tensor parallel主要影响显存带宽,一般不会导致乱码,乱码更像是tokenizer或prefill阶段的长文本截断问题,查下线上请求的max_tokens和输入长度是不是超了。我上次遇到类似情况,最后发现是线上请求带了个隐藏的BOM字符,把prompt搞坏了。
system prompt不一致基本就是罪魁祸首,本地没加线上加了,模型看到的输入分布直接变了,格式乱掉很正常。另外vLLM的sampling跟transformers默认值确实有坑,比如repetition_penalty和top_k的默认就不一样,建议把两边参数打印出来对一遍。TP本身一般不会导致乱码,但FP16在A10上如果有数值溢出偶尔会蹦奇怪token,可以试试bf16。排查的话先固定单卡vLLM跑同样的prompt,把system prompt补齐,再逐步加并行,这样能定位到底是哪一层引入的。