本项目展示了如何通过 vLLM-Ascend 将 HiDream-O1-Image(ModelScope:HiDream-ai/HiDream-O1-Image)完整适配到 华为Ascend NPU 上运行。
尽管 HiDream-O1-Image 包含用于图像生成的扩散头,但其核心架构为 Qwen3VLForConditionalGeneration,而 vLLM 已原生支持该架构。唯一需要的适配工作是在模型加载过程中过滤掉扩散相关的权重。
| 项目 | 数值 |
|---|---|
| 模型名称 | HiDream-O1-Image |
| ModelScope ID | HiDream-ai/HiDream-O1-Image |
| 架构 | Qwen3VLForConditionalGeneration |
| 模型类型 | qwen3_vl |
| 文本 backbone | 36层,4096隐藏维度,32头,GQA 8 KV头 |
| 视觉塔 | 27层,1152隐藏维度,deepstack [8,16,24] |
| 注意力机制 | GQA + MRoPE |
| 量化 | 无(bfloat16) |
| 权重格式 | Safetensors(8个分片,总计约38 GB) |
| 下载来源 | 仅ModelScope(明确禁止从Hugging Face/GitHub Release下载) |
vllm_ascend:registermodelscope download --model HiDream-ai/HiDream-O1-Image --local_dir /models/HiDream-O1-Imagecd /vllm-workspace/vllm
git apply /path/to/hidream_qwen3_vl.patchbash run_hidream_ascend.shbash 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 | 真实权重强制检查 | 通过 |
完整报告见
accuracy_check.md,自动化脚本见accuracy_compare.py。
accuracy_compare.py 在 CPU/GPU 基线与 NPU vLLM 之间复现以原始 Qwen3VLForConditionalGeneration 在 Transformers 框架下以 bfloat16、temperature=0、top-p=1.0 运行的输出为参考基线。
accuracy_compare.py --mode compare 计算:
| 误差来源 | 影响 | 预期量级 |
|---|---|---|
| bfloat16 尾数截断 | hidden state 微小漂移 | ~1e-3 |
| NPU ACL Graph 算子融合 | 浮点运算顺序变化 | ~1e-4 ~ 1e-3 |
| vLLM PagedAttention(单请求/temperature=0) | 无随机性差异 | 0 |
| 扩散头权重过滤 | 不影响 text+image→text | N/A |
final_layer2、t_embedder1、x_embedder)会被忽略。此适配仅验证多模态理解(文本 + 图像 -> 文本)能力。| 文件 | 描述 |
|---|---|
README.md | 本文档 |
adaptation_report.md | 详细适配报告 |
run_hidream_ascend.sh | 部署脚本 |
verify_hidream.sh | 验证脚本 |
run_log.md | 执行日志摘要 |
hidream_qwen3_vl.patch | vLLM的代码补丁 |
submit_note.md | 提交说明 |
Apache-2.0(与vLLM相同)