作者​:昇腾实战派
知识地图​: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(两卡混部)

image
image

根因分析

  1. 错误发生在 serving_chat.py 文件中对 ChatCompletionResponse 的序列化阶段,具体为 UsageInfo 字段的 Pydantic 校验失败。
    image
  2. 查阅 vllm/entrypoints/openai/engine/protocol.pyUsageInfo 的定义,确认其结构符合上游 vLLM 的规范,理论上不应触发校验错误。
    image
  3. 检查是否存在其他代码冲突,定位到文件patch_minimax_usage_accounting.py该 patch 文件中存在对 vllm 协议定义的重写行为。该文件通过 猴子补丁(Monkey Patching)方式,覆盖了 vllm 原生 engine_protocol、chat_protocol 及 chat_serving 模块中的 UsageInfo 定义,与 vllm 的 Pydantic 模型校验逻辑冲突,从而导致推理流程异常。
  4. vLLM 内部的 Pydantic 模型默认配置为 extra='allow',通过将参数传递方式调整为字典(Dict),可规避该校验限制。
  5. 经与相应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 的校验机制产生冲突。通过临时规避校验回退补丁,可快速恢复服务稳定性。长期建议升级至更新版本,以获得更完善的兼容性保障。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐