本文档记录 prompthero/openjourney 在昇腾 NPU 环境的部署与验证结果。
openjourney 是 Stable Diffusion v1.5 的微调版本,使用 Midjourney 图像微调,能够生成类似 Midjourney 风格的图像。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.9.0 |
torch-npu | 2.9.0.post1+gitee7ba04 |
diffusers | 0.38.0 |
transformers | 4.57.6 |
Ascend 910B4 x 132 GB HBM./models/openjourney512 x 512# 安装依赖
pip install diffusers transformers torch_npu
# 下载模型权重(从 HF Mirror)
HF_ENDPOINT=https://hf-mirror.com python3 -c "
from huggingface_hub import snapshot_download
snapshot_download('prompthero/openjourney', local_dir='./models/openjourney')
"# 单提示词生成
python inference.py \
--model ./models/openjourney \
--prompt "mdjrnm-syle portrait photo of a girl, highly detailed" \
--steps 25 \
--seed 42 \
--output ./output
# 多提示词批量生成
python inference.py \
--model ./models/openjourney \
--prompt "mdjrnm-syle landscape" "mdjrnm-syle cat" \
--steps 30 \
--seed 123基础推理验证:
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained(
"./models/openjourney",
torch_dtype=torch.float16,
safety_checker=None,
).to("npu")
image = pipe(
"mdjrnm-syle portrait photo of a girl",
num_inference_steps=25,
).images[0]
image.save("smoke_test.png")验证结果:
测试条件:
Ascend 910B4 x 1float16 精度attention_slicing 启用512 x 512| Steps | Cold Start | Warm Avg (3 runs) | Steps/s |
|---|---|---|---|
| 10 | 71.86s | 2.55s | 3.92 |
| 20 | 4.65s | 4.77s | 4.20 |
| 30 | 17.90s | 6.89s | 4.36 |
显存占用:
| 指标 | 数值 |
|---|---|
| 峰值显存 (HBM) | 6.88 GB |
| 可用显存 | 22.61 GB / 29.49 GB |
说明:Cold Start 主要开销来自 NPU 第一次推理时的 JIT 编译(~50s),后续 warm run 无需重新编译。
| 指标 | 数值 |
|---|---|
| 对比基准 | CPU float32 单步 UNet 前向 |
| 评测方法 | 同输入、同权重、单步 UNet 输出比较 |
| 相对误差 | 0.029% |
| 阈值 | < 1% |
| 结论 | ✅ 通过 |
NPU 确定性测试:同 seed + 同输入 → 像素级完全一致(max diff = 0)。
说明:扩散模型多步迭代中 float16 与 float32 的数值误差会累积(全图对比约 25%),这是正常现象。单步 UNet 前向对比才是正确的精度度量。
| 文件 | 说明 |
|---|---|
inference.py | NPU 推理脚本 |
benchmark.py | 性能基准测试脚本 |
readme.md | 本文档——部署指南与验证报告 |
verify_accuracy.py | 精度验证脚本 |