评测与部署用 lmms-eval 量化抗幻觉用 SGLang 把 VLM 推上线多模态大模型专栏⑧一句话讲透本篇同一个模型、同一张图、两次 greedy 推理可能给出不同分数——这往往不是模型变差了而是评分规则太脆弱。用 lmms-eval 跑标准基准、用 SGLang 部署服务本篇打通从训练到上线的最后一公里。写在前面经过前七篇文档 VLM 已经具备看图答问、SFT 对齐、DPO 抗幻觉的能力。但训出来不等于能用——还需回答两个问题模型究竟有多好评测以及如何让它服务真实流量部署。本篇覆盖评测与部署的完整链条。核心认知VLM 评测远不如 NLP 稳定部署也比纯 LLM 多几个坑动态分辨率、视觉 token 显存。一份零依赖 demo评测稳定性附带真实运行结果。阅读本篇后可获得✅ 识别 VLM 评测不稳定的三个根因掌握评分规则脆弱性这一最可控因素✅ 选择文档 VLM 的最小验证集与对应评分规则ANLS / relaxed acc / POPE F1✅ 用 lmms-eval 一条命令跑通多个基准并正确解读报告✅ 用 SGLang 完成部署的五个生命周期步骤掌握压测与量化决策一、VLM 评测为何不稳定VLM 评测有一个反直觉的特性同样提示、两次 greedy 推理可能给出不同答案。这源于三个原因原因机理缓解CUDA 非确定性即使do_sampleFalse 固定 seedattention kernel 在不同 batch 大小下浮点累加顺序不同1e-4 级差异经 softmax 放大后可能改变 argmax固定batch_size1或多次跑取众数Batch 组成漂移padding 长度受同 batch 其他样本影响改变某些算子的数值路径评测时batch_size1牺牲速度换确定性评分规则脆弱1,234 wan yuanvs1,234 万元vs1234 万元语义都对exact match 只认第一个用 benchmark 官方评分规则第三个原因贡献最大且最易控制。code/05_eval_deploy/eval_stability_demo.py纯标准库可跑用 ground truth1,234 wan yuan与 10 个候选输出前 8 个语义正确演示评分规则对比demo 实测候选输出exactnormalizededit-simnumeric1,234 wan yuan精确1.01.01.01.01,234 wan yuan多空格0.01.00.931.01,234 wan yuan.尾点0.01.00.931.01,234 万元中文单位0.00.00.431.0Revenue: 1,234 wan yuan前缀0.00.00.611.012,345 wan yuan真错0.00.00.800.0exact在 8 个正确答案里给 7 个打 0 分——这不是模型差是评分规则差。numeric match抽取数字比较对格式宽容、对幻觉数字严苛是文档 VLM 的推荐规则。同一模型、10 次运行的方差模拟同一模型对同一图采样 10 次仅表面形式变化各评分规则的均值评分规则10 次均值exact0.100在 0 与 1 间剧烈摆动normalized exact0.500edit similarity0.794numeric match0.800稳定exact的摆动是纯噪声——这就是重跑评测得到不同分数的根因。缓解策略用仍能捕捉真实错误的最宽松规则此处 numeric match并对 N≥3 次运行取均值。二、必跑基准与评分规则文档 VLM 的最小验证集为DocVQA ChartQA OCRBench POPE覆盖核心能力面理解 OCR 抗幻觉Benchmark测试内容评分规则文档相关度DocVQA文档 VQAANLS0–1 软分非 exact match⭐⭐⭐⭐⭐ChartQA图表问答relaxed accuracy±5% 容差⭐⭐⭐⭐⭐InfoVQA信息密集文档ANLS⭐⭐⭐⭐⭐OCRBenchOCR 能力专用 lookup table⭐⭐⭐⭐POPE物体存在幻觉F1 / accuracy⭐⭐HallusionBench综合幻觉自定义⭐⭐⭐三条评分规则速记ANLSAverage Normalized Levenshtein Similarity(1 − edit_distance / max_len)0–1 连续分允许拼写小错。DocVQA / InfoVQA 采用。relaxed accuracy数字答案在 GT ±5% 内即算对。ChartQA 采用。POPE F1是/否二分类看 F1 而非 accuracy——因为否占多数会刷高 accuracy掩盖保守倾向。三、lmms-eval 实操lmms-eval 一条命令跑多个 benchmark自动支持 Qwen2-VL / LLaVA / InternVL自动下载缓存数据集输出标准 JSON 报告。code/05_eval_deploy/eval.sh的核心调用python-mlmms_eval\--modelqwen2_5_vl\--model_argspretrained./merged_dpo_model,dtypebfloat16\--tasksdocvqa_val,chartqa_test,ocrbench,textvqa_val,infovqa_val,pope,mmbench_dev_en\--batch_size1\# 高分图安全起见用 1--output_path./eval_results\--log_samples典型报告建议同一 checkpoint 跑 3 次取 mean ± stdTaskMetricValueStd (3 runs)docvqa_valanls0.812±0.004chartqarelaxed_acc0.643±0.011ocrbenchscore547±3 (/1000500 及格)popef10.871±0.006popeaccuracy0.889±0.005报告解读要点DocVQA ANLS 0.81 约对应 EM ≈ 70%粗略换算ANLS×100−10 ≈ EM%POPE F1 accuracy 说明模型偏向答否保守常见于 DPO 后期需回调 β。四、部署为何选 SGLang选项优点缺点transformers简单稳定慢无 PagedAttentionvLLM快、生态大VLM 支持滞后SGLangVLM 最先支持、RadixAttention较新文档少TensorRT-LLM最快部署复杂VLM 模型少文档 VLM 推荐 SGLang原生支持 Qwen2-VL / LLaVA-OneVision对动态分辨率友好。两个杀手锏RadixAttention前缀复用多轮对话中前面的图 promptKV cache 可复用。同一张图第二次提问如先问有什么文字再问总营收前缀已在 cache吞吐提升 3–5×。对应参数--enable-radix-cache。视觉 token 高效调度把变长视觉 token 当软序列处理不会因 AnyRes 多 tile 就 OOM比 vLLM 在高分图上更稳定。五、部署的五步生命周期可上线的部署远不止launch_server1. 合并 LoRAswift export --merge_lora2. 起服务sglang.launch_server3. 冒烟测试file:// 与 base64 两种路径4. 压测确定并发上限5. 监控埋点显存/QPS/TTFT/TPOT步骤 1合并 LoRA——推理不需要 adapter必须先合并swiftexport--model_id_or_pathQwen/Qwen2.5-VL-7B-Instruct\--adapters./output_sft/checkpoint-xxx--merge_loratrue\--output_dir./merged_model步骤 2起服务code/05_eval_deploy/sglang_serve.shpython-msglang.launch_server\--model-path ./merged_model--port30000--host0.0.0.0\--dtypebfloat16 --mem-fraction-static0.85\--context-length8192--chat-template qwen2_5_vl\--enable-radix-cachemem-fraction-static 0.85留 15% 给 KV cache 增长与视觉 token buffer调高易 OOM。步骤 3冒烟测试——file://本地路径与 base64 内嵌两种图像传法都要测许多 bug 只在 base64 路径出现如 MIME 推断错误。步骤 4压测——VLM 压测不能只看 QPS图像大小决定首 token 延迟。关键指标TTFTtime to first token1024×1024 图应 ≤ 1.5s、TPOT≤ 30ms、显存峰值跑满并发时 95% 上限。A100 80GB 上 Qwen2.5-VL-7B 的可达成指标并发TTFT P50TPOT显存10.8s18ms28 GB81.4s25ms52 GB162.6s40ms71 GB32OOM 风险——步骤 5监控埋点——显存利用率OOM 预警、QPS/TTFT/TPOT、生成长度分布VLM 易无限描述设 max_tokens 截断、图像尺寸分布异常大图往往是上游 bug。六、量化决策与完成标准A100 80GB 无需量化其他卡按延迟要求决策极致延迟选 TensorRT-LLM INT8平衡选 AWQ INT4最常用易部署选 GPTQ INT4精度略低。VLM 量化的特殊风险视觉编码器对量化更敏感SigLIP 量化后 zero-shot 掉 3–5%常见做法是只量化 LLM、视觉编码器保 bf16SGLang 的--quantize llm_int8。文档 VLM 的完成标准指标及格线DocVQA ANLS≥ 0.80约 EM ≥ 70%ChartQA relaxed-acc≥ 60%OCRBench≥ 500POPE F1≥ 85%接口 TTFT P50≤ 2s1024×1024 图达不到 → 回阶段 3 调数据而非无脑训练。诊断顺序ANLS 低 OCRBench 低 → 分辨率不够开 AnyRes / 升到 1024ANLS 低 OCRBench 高 → 指令对齐不够加 SFT 数据多样性POPE F1 低 → 幻觉进阶段 4 做 DPO部署后掉点 → 99% 是 chat template / 预处理不一致。 本篇涉及代码文件说明code/05_eval_deploy/eval_stability_demo.py评测稳定性 / 评分规则对比零依赖code/05_eval_deploy/eval.shlmms-eval 多 benchmark 评测脚本code/05_eval_deploy/sglang_serve.shSGLang 部署脚本小结主题要点评测不稳定三因CUDA 非确定性、batch 漂移、评分规则脆弱最可控评分规则exact 脆弱文档任务用 numeric match / ANLS最小验证集DocVQA ChartQA OCRBench POPE部署框架SGLangRadixAttention 前缀复用 视觉 token 调度部署 5 步合并 LoRA → 起服务 → 冒烟 → 压测 → 监控量化仅量化 LLM视觉编码器保 bf16下一篇是专栏收尾的前沿方向Chameleon / Emu3 / Llama 4 的 early fusion 路线——视觉也被离散化为 vocab、单模型单 loss这是 VLM 的下一代范式。专栏《从 NLP 到 VLM多模态大模型研发实战》上一篇⑦ 多模态 RL · DPO GRPO 本篇⑧ 评测与部署 · lmms-eval SGLang 下一篇⑨ 前沿方向 · Early Fusion