昇腾平台vLLM-Omni 服务中 Pydantic 校验异常问题的定位与解决
作者:昇腾实战派
知识地图:https://blog.csdn.net/Lumos_Lovegood/article/details/161601003
背景概述
在基于 vLLM-Omni 框架部署模型(如 Qwen-Image、Qwen-Image-Edit)的推理服务过程中,服务虽能正常启动并完成推理流程,但在返回结果阶段频繁抛出 pydantic_core._pydantic_core.ValidationError 错误,导致客户端收到 500 Bad Request 响应,且图像等多模态输出无法正常返回。本文将从问题现象出发,深入分析根因,并提供多种可选的解决方案,帮助开发者快速定位并修复该类兼容性问题。
问题现象
vLLM-Omni 服务可正常启动,推理过程无异常中断。在返回结果阶段 ChatCompletionResponse ,抛出如下异常:
pydantic_core._pydantic_core.ValidationError: 1 validation error for ChatCompletionResponse
最终返回 500 BadRequestError。图片不能正常返回,但推理服务本身未崩溃。
- 复现环境:
- 模型:Qwen-Image / Qwen-Image-Edit
- 软件版本:
quay.io/ascend/vllm-omni:v0.18.0 - 硬件平台:Atlas 800I A2(两卡混部)


根因分析
- 错误发生在
serving_chat.py文件中对ChatCompletionResponse的序列化阶段,具体为UsageInfo字段的 Pydantic 校验失败。
- 查阅
vllm/entrypoints/openai/engine/protocol.py中UsageInfo的定义,确认其结构符合上游 vLLM 的规范,理论上不应触发校验错误。
- 检查是否存在其他代码冲突,定位到文件patch_minimax_usage_accounting.py该 patch 文件中存在对 vllm 协议定义的重写行为。该文件通过 猴子补丁(Monkey Patching)方式,覆盖了 vllm 原生 engine_protocol、chat_protocol 及 chat_serving 模块中的 UsageInfo 定义,与 vllm 的 Pydantic 模型校验逻辑冲突,从而导致推理流程异常。
- vLLM 内部的 Pydantic 模型默认配置为
extra='allow',通过将参数传递方式调整为字典(Dict),可规避该校验限制。 - 经与相应PR确认,该补丁仅用于优化 Minimax 推理场景优化,在使用 vllm-omni 时可安全回退。
临时解决方案
方案一:规避校验限制
问题源于返回结果中 UsageInfo 对象的序列化与校验机制。vllm 的 Pydantic 模块默认配置了 extra=‘allow’,通过将参数传递方式调整为字典(Dict),可规避该校验限制。
UsageInfo 仅用于统计 Token 消耗量,修改为字典格式不影响模型推理的核心逻辑。
修改 vllm-omni 服务文件 serving_chat.py,将 usage 字段从 UsageInfo 对象实例改为字典结构:
修改文件路径:/vllm-workspace/vllm-omni/vllm_omni/entrypoints/openai/serving_chat.py
修改位置:第 2257–2261 行
修改前:
usage=UsageInfo(
prompt_tokens=len(prompt.split()),
completion_tokens=1,
total_tokens=len(prompt.split()) + 1,
)
修改后:
usage = {
"prompt_tokens": len(prompt.split()),
"completion_tokens": 1,
"total_tokens": len(prompt.split()) + 1
}
修改完成后,重新测试推理流程,原有 Pydantic 校验错误已消除,服务运行恢复正常。
方案二:回退平台补丁
相关补丁仅针对 Minimax 推理场景优化,在使用 vllm-omni 时可安全回退。
编辑 vllm-ascend 平台补丁的初始化文件:vim /vllm-workspace/vllm-ascend/vllm_ascend/patch/platform/__init__.py
注释 32-33 行的补丁导入,(注意:补丁存在依赖,不可单独注释)
# import vllm_ascend.patch.platform.patch_minimax_usage_accounting # noqa
# import vllm_ascend.patch.platform.patch_glm_tool_call_parser # noqa
回退补丁后,推理流程恢复正常,原有 Pydantic 校验错误已消失。
长期解决方案
vLLM-Ascend 主线分支已修改相关补丁,理论上该兼容性问题已不再存在。建议升级至 vLLM-Omni 镜像版本 > v0.18.0,即可自动规避该问题,无需手动修改代码或配置。
验证方法
启动服务:
vllm serve /data2/Qwen-Image/ --omni --host 0.0.0.0 --port 1025 -tp 2
发送测试请求:
curl -s http://localhost:1025/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "A beautiful landscape painting"}
],
"extra_body": {
"height": 1024,
"width": 1024,
"num_inference_steps": 50,
"true_cfg_scale": 4.0,
"seed": 42
}
}' | jq -r '.choices[0].message.content[0].image_url.url' | cut -d',' -f2- | base64 -d > output.png
验证结果:
执行测试命令后,当前目录下应生成 output.png 文件,且服务日志无 Pydantic 相关报错。
总结
本问题源于平台补丁对 vLLM 原生模型定义的非预期修改,与 Pydantic 的校验机制产生冲突。通过临时规避校验或回退补丁,可快速恢复服务稳定性。长期建议升级至更新版本,以获得更完善的兼容性保障。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)