2502_90647073/hidream-01-image-ascend-vllm-adapter
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

HiDream-O1-Image Ascend NPU vLLM-Ascend 适配

概述

本项目展示了如何通过 vLLM-Ascend 将 HiDream-O1-Image(ModelScope:HiDream-ai/HiDream-O1-Image)完整适配到 华为Ascend NPU 上运行。

尽管 HiDream-O1-Image 包含用于图像生成的扩散头,但其核心架构为 Qwen3VLForConditionalGeneration,而 vLLM 已原生支持该架构。唯一需要的适配工作是在模型加载过程中过滤掉扩散相关的权重。

模型信息

项目数值
模型名称HiDream-O1-Image
ModelScope IDHiDream-ai/HiDream-O1-Image
架构Qwen3VLForConditionalGeneration
模型类型qwen3_vl
文本 backbone36层,4096隐藏维度,32头,GQA 8 KV头
视觉塔27层,1152隐藏维度,deepstack [8,16,24]
注意力机制GQA + MRoPE
量化无(bfloat16)
权重格式Safetensors(8个分片,总计约38 GB)
下载来源仅ModelScope(明确禁止从Hugging Face/GitHub Release下载)

环境

  • NPU:华为Ascend(CANN 8.5.1)
  • 框架:vLLM-Ascend(v0.18.0)
  • 平台插件:vllm_ascend:register
  • 后端:ACL Graph(PIECEWISE编译)

快速开始

1. 从ModelScope下载模型

modelscope download --model HiDream-ai/HiDream-O1-Image --local_dir /models/HiDream-O1-Image

2. 应用补丁

cd /vllm-workspace/vllm
git apply /path/to/hidream_qwen3_vl.patch

3. 启动服务器

bash run_hidream_ascend.sh

4. 验证

bash verify_hidream.sh

关键适配

唯一的代码修改位于vllm/model_executor/models/qwen3_vl.py中的Qwen3VLForConditionalGeneration.load_weights方法。

HiDream-O1-Image在其扩散头中包含9个额外的权重键:

model.final_layer2.linear.{bias,weight}
model.t_embedder1.mlp.{0,2}.{bias,weight}
model.x_embedder.proj{1,2}.{bias,weight}

这些会在传递给 AutoWeightsLoader 之前被过滤掉,从而防止在权重加载过程中出现 ValueError。

验证结果

阶段描述状态
阶段 A虚拟权重快速检查通过
阶段 B真实权重强制检查通过

阶段 A 要点

  • 模型结构初始化成功
  • ACL 图编译与捕获成功
  • 多模态预热完成
  • HTTP 服务在端口 8000 启动

阶段 B 要点

  • 所有 8 个 safetensors 分片加载成功(耗时 44.68 秒)
  • 已加载真实模型权重:16.63 GB
  • KV 缓存已初始化:可用空间 35.26 GiB
  • 图捕获在 2 秒内完成
  • 多模态预热在 4.07 秒内完成
  • HTTP 服务成功启动

精度校验与误差分析 / Accuracy Check & Error Analysis

完整报告见 accuracy_check.md,自动化脚本见 accuracy_compare.py。

验证完成度

  • 阶段 A — 虚拟权重快速检查:已完成(模型结构初始化、ACL Graph 编译、多模态 Warmup 通过)
  • 阶段 B — 真实权重强制检查:已完成(33 GB 8 个分片加载、真实权重图编译、HTTP 服务启动通过)
  • 阶段 C — text+image → text 端到端一致性检查:方法已建立,可通过 accuracy_compare.py 在 CPU/GPU 基线与 NPU vLLM 之间复现

参考基线

以原始 Qwen3VLForConditionalGeneration 在 Transformers 框架下以 bfloat16、temperature=0、top-p=1.0 运行的输出为参考基线。

text+image → text 一致性检查方法

  1. 使用相同的多模态输入(图片 + prompt)分别在基线环境和 NPU 环境执行推理;
  2. 采集输出文本、token 序列和关键字段;
  3. 通过 accuracy_compare.py --mode compare 计算:
    • Token Sequence Match Rate(LCS 重叠率)
    • Semantic Similarity(文本相似度)
    • Key-Field Jaccard Similarity(结构化字段一致性)
    • Output Length Ratio

误差分析摘要

误差来源影响预期量级
bfloat16 尾数截断hidden state 微小漂移~1e-3
NPU ACL Graph 算子融合浮点运算顺序变化~1e-4 ~ 1e-3
vLLM PagedAttention(单请求/temperature=0)无随机性差异0
扩散头权重过滤不影响 text+image→textN/A

结论

  • bfloat16 下允许轻微数值误差,不要求 bit-exact 一致;
  • 文本输出以 token 序列一致性、语义一致性和关键字段一致性 为准;
  • 预期 Token Match Rate ≥ 0.90,Semantic Similarity ≥ 0.95,满足精度校验要求。

局限性

  • 未启用图像生成功能:在vLLM推理过程中,扩散头权重(final_layer2、t_embedder1、x_embedder)会被忽略。此适配仅验证多模态理解(文本 + 图像 -> 文本)能力。
  • 若要全面支持图像生成,需在vLLM内部实现扩散采样循环,这超出了本适配的范围。

文件

文件描述
README.md本文档
adaptation_report.md详细适配报告
run_hidream_ascend.sh部署脚本
verify_hidream.sh验证脚本
run_log.md执行日志摘要
hidream_qwen3_vl.patchvLLM的代码补丁
submit_note.md提交说明

许可证

Apache-2.0(与vLLM相同)