问题出现得很突然,日志倒是留得挺全。用 vLLM 0.6.3 起 Qwen2.5-VL-7B-Instruct 的 AWQ 4bit 权重,chat 接口按 OpenAI 格式传图,问「图里红框按钮在什么位置」,模型返回坐标 (312,480),实际位置在 (1248,1920) 附近,原图 1920×1080。同一张图换 bfloat16 权重回答就对了,试过把 temperature 降到 0 也没用。
刚开始盯着「模型按缩放后的分辨率输出坐标,客户端却按原图尺寸还原」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。量化后的视觉塔输出有偏差,坐标回归对小数值变化特别敏感。少数情况下是请求里没写 detail 参数,服务端按默认 336 像素做了缩放。
不容易想到的是,AWQ 校准集里缺少文档类截图,视觉分支的量化误差偏大。
第一件事是确认服务端实际收到的图片尺寸
curl -s http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"qwen2.5-vl","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"data:image/png;base64,...","detail":"high"}},{"type":"text","text":"输出红框按钮坐标"}]}]}'
随后按缩放比例把坐标乘回去再跟原图比对
python -c "w,h=1920,1080;print(312*w/336, 480*h/336)"
再往下换 bfloat16 权重跑同一张图做对照
python -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-VL-7B-Instruct --dtype bfloat16 --port 8001
末了让模型输出千分位归一化坐标再由客户端还原
python -c "print('返回 0-1000 归一化坐标 x1 y1 x2 y2')"
改完先别撤,确认这几项。同一张图用 bfloat16 与 4bit 各跑三遍,坐标与人工标注的偏差都在 20 像素以内,返回体里的顺序稳定不再跳。
量化对坐标这类连续回归任务的影响比纯文本任务大得多,做定位和测量类需求时宁可多占一张卡的显存,也别拿 4bit 顶上去。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
