表 1 版本配套表
| 配套 | 版本 | 环境准备指导 |
|---|---|---|
| Python | 3.10 or 3.11 | - |
| torch | 2.1.0 | - |
# 增加软件包可执行权限,{version}表示软件版本号,{arch}表示CPU架构,{soc}表示昇腾AI处理器的版本。
chmod +x ./Ascend-cann-toolkit_{version}_linux-{arch}.run
chmod +x ./Ascend-cann-kernels-{soc}_{version}_linux.run
# 校验软件包安装文件的一致性和完整性
./Ascend-cann-toolkit_{version}_linux-{arch}.run --check
./Ascend-cann-kernels-{soc}_{version}_linux.run --check
# 安装
./Ascend-cann-toolkit_{version}_linux-{arch}.run --install
./Ascend-cann-kernels-{soc}_{version}_linux.run --install
# 设置环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh# 增加软件包可执行权限,{version}表示软件版本号,{arch}表示CPU架构。
chmod +x ./Ascend-mindie_${version}_linux-${arch}.run
./Ascend-mindie_${version}_linux-${arch}.run --check
# 方式一:默认路径安装
./Ascend-mindie_${version}_linux-${arch}.run --install
# 设置环境变量
cd /usr/local/Ascend/mindie && source set_env.sh
# 方式二:指定路径安装
./Ascend-mindie_${version}_linux-${arch}.run --install-path=${AieInstallPath}
# 设置环境变量
cd ${AieInstallPath}/mindie && source set_env.sh下载 pytorch_v{pytorchversion}_py{pythonversion}.tar.gz
tar -xzvf pytorch_v{pytorchversion}_py{pythonversion}.tar.gz
# 解压后,会有whl包
pip install torch_npu-{pytorchversion}.xxxx.{arch}.whlhttps://huggingface.co/Qwen/Qwen-Image-Edit-2509# 1. 下载代码
git clone https://modelers.cn/MindIE/Qwen-Image-Edit-2509.git && cd Qwen-Image-Edit-2509
# 2. python相关依赖安装
pip install diffusers==0.35.1
pip install transformers==4.52.4
pip install yunchang==0.6.0执行命令:
# 等价优化
export ROPE_FUSE=1
export ADALN_FUSE=1
python run_edit_2509.py \
--model_path ./Qwen-Image-Edit-2509 \
--device_id 0 \
--img_paths ./yarn-art-pikachu.png \
--prompt_file "./edit_prompts.txt" \
--width 1024 \
--height 1024 \
--vae_tiling \
--vae_slicing \
参数说明:
img1,img2执行命令:
# 等价优化
export ROPE_FUSE=1
export ADALN_FUSE=1
# cache算法优化
export COND_CACHE=1
export UNCOND_CACHE=1
python run_edit_2509.py \
--model_path ./Qwen-Image-Edit-2509 \
--device_id 0 \
--img_paths ./yarn-art-pikachu.png
--prompt_file "./edit_prompts.txt" \
--width 1024 \
--height 1024 \
--vae_tiling \
--vae_slicing \参数说明:
img1,img2执行命令:
export LCCL_DETERMINISTIC=true
export HCCL_DETERMINISTIC=true
export ATB_MATMUL_SHUFFLE_K_ENABLE=0
export ATB_LLM_LCOC_ENABLE=true
export CLOSE_MATMUL_K_SHIFT=true
model_path="/mnt/weights/Qwen-Image-Edit-2509"
# 等价优化 需要时开启
# export ROPE_FUSE=1
# export ADALN_FUSE=1
# cache算法优化 需要时开启
# export COND_CACHE=1
# export UNCOND_CACHE=1
# 等价优化+cache算法优化 需要时开启
# export ROPE_FUSE=1
# export ADALN_FUSE=1
# export COND_CACHE=1
# export UNCOND_CACHE=1
# 8卡并行,cfg_size * ulysses_size = 8
# (cfg_size=2, ulysses_size=4) 优于 (cfg_size=1, ulysses_size=8)
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
# export ASCEND_RT_VISIBLE_DEVICES=8,9,10,11,12,13,14,15
torchrun --nproc_per_node=8 --master-port 29508 run_edit_2509_cfg_usp.py \
--model_path ${model_path} \
--num_inference_steps 50 \
--seed 42 \
--output_dir "baseline_cfg2_ulysses4_optimize_1+2_50steps" \
--ulysses_size 4 \
--cfg_size 2 \
--img_paths ./yarn-art-pikachu.png \
--prompt_file "./edit_prompts.txt" \
--width 1024 \
--height 1024 \
--vae_tiling \
--vae_slicing \参数说明:
img1,img2执行命令:
export LCCL_DETERMINISTIC=true
export HCCL_DETERMINISTIC=true
export ATB_MATMUL_SHUFFLE_K_ENABLE=0
export ATB_LLM_LCOC_ENABLE=true
export CLOSE_MATMUL_K_SHIFT=true
model_path="/mnt/weights/Qwen-Image-Edit-2509"
# 等价优化 需要时开启
# export ROPE_FUSE=1
# export ADALN_FUSE=1
# cache算法优化 需要时开启
# export COND_CACHE=1
# export UNCOND_CACHE=1
# 等价优化+cache算法优化 需要时开启
# export ROPE_FUSE=1
# export ADALN_FUSE=1
# export COND_CACHE=1
# export UNCOND_CACHE=1
# 8卡并行,cfg_size * ulysses_size = 16
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
# export ASCEND_RT_VISIBLE_DEVICES=8,9,10,11,12,13,14,15
torchrun --nproc_per_node=8 --master-port 29508 run_edit_2509_cfg_usp.py \
--model_path ${model_path} \
--num_inference_steps 50 \
--seed 42 \
--output_dir "baseline_cfg2_ulysses4_optimize_1+2_50steps" \
--ulysses_size 8 \
--cfg_size 2 \
--img_paths ./yarn-art-pikachu.png \
--prompt_file "./edit_prompts.txt" \
--width 1024 \
--height 1024 \
--vae_tiling \
--vae_slicing \参数说明:
img1,img2本项目新增量化功能,支持权重 8 位(w8)与激活 8 位 / 16 位(a8/a16)的量化组合,可减少模型显存占用并保持推理性能
参考官方README
通过quantization/quant.py脚本生成量化模型及描述文件,需基于原始模型权重进行量化。
执行命令:
export PYTHONPATH=".:$PYTHONPATH" # 添加当前目录到Python搜索路径
model_path="/mnt/weights/Qwen-Image-Edit-2509"
# w8a8量化
python quantization/quant.py \
--model_path ${model_path} \
--device_id 0 \
--quant_mode w8a8 \
--w_sym \
--is_dynamic \
--act_method 3 \
--quant_save_dir ./quant_w8a8_dynamic_withoutData_use_disable_quant_layers参数说明:
执行后,quant_w8a8_dynamic_withoutData_use_disable_quant_layers目录下会生成两个文件:
quant_model_description_w8a8_dynamic.json:量化配置描述文件(包含量化位宽、层映射等元信息)quant_model_weight_w8a8_dynamic.safetensors:量化后的权重文件(采用safe tensor格式,兼容Hugging Face生态)执行命令:
export PYTHONPATH=".:$PYTHONPATH" # 添加当前目录到Python搜索路径
model_path="/mnt/weights/Qwen-Image-Edit-2509"
# w8a16量化
python quantization/quant.py \
--model_path ${model_path} \
--device_id 0 \
--quant_mode w8a16 \
--w_sym \
--act_method 3 \
--quant_save_dir ./quant_w8a16_withoutData_use_disable_quant_layers
参数说明:
执行后,quant_w8a16_withoutData_use_disable_quant_layers目录下会生成两个文件:
quant_model_description_w8a16.json:量化配置描述文件(包含量化位宽、层映射等元信息)quant_model_weight_w8a16.safetensors:量化后的权重文件(采用safe tensor格式,兼容Hugging Face生态)# 增加软件包可执行权限,{version}表示软件版本号,{arch}表示CPU架构。
chmod +x Ascend-cann-nnal_<version>_linux-<arch>.run
# 默认路径安装:
./Ascend-cann-nnal_<version>_linux-<arch>.run --install --torch_atb
# 配置环境变量:
source ${HOME}/Ascend/nnal/atb/set_env.sh使用量化模型进行推理时,需在原有命令中添加--quant_desc_path参数,指向量化描述文件(quant_model_description_*.json)路径,该路径需要是绝对路径,其余参数与原生模型推理一致。
以w8a8量化为例子,运行命令:
model_path="/mnt/weights/Qwen-Image-Edit-2509"
quant_desc_path="/home/Qwen-Image-Edit-2509/quant_w8a8_dynamic_withoutData_use_disable_quant_layers/quant_model_description_w8a8_dynamic.json"
# 算子优化 需要时开启
# export ROPE_FUSE=1
# export ADALN_FUSE=1
# cache 算法优化 需要时开启
# export COND_CACHE=1
# export UNCOND_CACHE=1
python run_edit_2509.py \
--model_path ${model_path} \
--device_id 0 \
--quant_desc_path ${quant_desc_path} \
--img_paths ./yarn-art-pikachu.png
--prompt_file "./edit_prompts.txt" \
--width 1024 \
--height 1024 \以w8a8量化为例子,运行命令:
export LCCL_DETERMINISTIC=true
export HCCL_DETERMINISTIC=true
export ATB_MATMUL_SHUFFLE_K_ENABLE=0
export ATB_LLM_LCOC_ENABLE=true
export CLOSE_MATMUL_K_SHIFT=true
model_path="/mnt/weights/Qwen-Image-Edit-2509"
quant_desc_path="/home/Qwen-Image-Edit-2509/quant_w8a8_dynamic_withoutData_use_disable_quant_layers/quant_model_description_w8a8_dynamic.json"
# 算子优化 需要时开启
# export ROPE_FUSE=1
# export ADALN_FUSE=1
# 算法优化 需要时开启
# export COND_CACHE=1
# export UNCOND_CACHE=1
# 8卡并行
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
torchrun --nproc_per_node=8 --master-port 29508 run_edit_2509_cfg_usp.py \
--model_path ${model_path} \
--num_inference_steps 50 \
--seed 42 \
--output_dir "baseline_cfg2_ulysses4_optimize_1+2_50steps" \
--ulysses_size 4 \
--cfg_size 2 \
--quant_desc_path ${quant_desc_path} \
--img_paths ./yarn-art-pikachu.png \
--prompt_file "./edit_prompts.txt" \
--width 1024 \
--height 1024 \--quant_desc_path需指向完整的量化描述文件路径(即quant_model_description_*.json),且该路径要求填写绝对路径。量化权重文件(.safetensors)需与描述文件在同一目录下,否则会提示权重加载失败。1、本工程选用 GEdit-Bench 数据集进行精度评测,该数据集来源论文:Step1X-Edit: A Practical Framework for General Image Editing。 2、本工程的评测代码在 GEdit-Bench 文件夹下,该代码基于Step1X-Edit工程进行了部分修改适配。 3、在 GEdit-Bench官方评测文档:GEdit-Bench EVAL里提到可以采用GPT-4.1或Qwen2.5VL-72B-Instruct-AWQ模型来对生成的图像进行打分。
GEdit-Bench 数据集下载链接,二选一: 🤗 huggingface 🤖 ModelScope
Qwen2.5VL-72B-Instruct 模型权重下载链接,二选一: 🤗 huggingface 🤖 ModelScope
model_path="/home/weight/Qwen-Image-Edit-2509/"
quant_desc_path="/home/Qwen-Image-Edit-2509/quant_w8a8_withoutData_use_disable_quant_layers/quant_model_description_w8a8_dynamic.json"
# 算子优化 需要时开启
# export ROPE_FUSE=1
# export ADALN_FUSE=1
# cache 算法优化 需要时开启
# export COND_CACHE=1
# export UNCOND_CACHE=1
# GEdit-Bench数据集的使用示例
dataset_path="/mnt/datasets/GEdit-Bench"
python run_edit_2509.py \
--model_path ${model_path} \
--device_id 0 \
--dataset_name "GEdit-Bench" \
--dataset_path ${dataset_path} \
--num_inference_steps 50 \
--seed 42 \
--output_dir "GEdit-Bench_baseline" \
--vae_tiling \
--vae_slicing \
# 有量化权重时候,使用量化时才开启
# --quant_desc_path ${quant_desc_path}参数说明:
# 确定性运算
export LCCL_DETERMINISTIC=true
export HCCL_DETERMINISTIC=true
export ATB_MATMUL_SHUFFLE_K_ENABLE=0
export ATB_LLM_LCOC_ENABLE=true
export CLOSE_MATMUL_K_SHIFT=true
model_path="/home/weight/Qwen-Image-Edit-2509/"
quant_desc_path="/home/Qwen-Image-Edit-2509/quant_w8a8_withoutData_use_disable_quant_layers/quant_model_description_w8a8_dynamic.json"
# 算子优化 需要时开启
# export ROPE_FUSE=1
# export ADALN_FUSE=1
# cache 算法优化 需要时开启
# export COND_CACHE=1
# export UNCOND_CACHE=1
# GEdit-Bench数据集的使用示例, 8卡并行 cfg_size=2 ulysses_size=4
dataset_path="/mnt/datasets/GEdit-Bench"
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
torchrun --nproc_per_node=8 --master-port 29503 run_edit_2509_cfg_usp.py \
--model_path ${model_path} \
--dataset_name "GEdit-Bench" \
--dataset_path ${dataset_path} \
--num_inference_steps 50 \
--seed 42 \
--output_dir "GEdit-Bench_cfg2_ulysses4_optimize_1+2_50steps" \
--ulysses_size 4 \
--cfg_size 2 \
--vae_tiling \
--vae_slicing \
# 有量化权重时候,使用量化时才开启
# --quant_desc_path ${quant_desc_path}参数说明:
进入 GEdit-Bench 文件夹,运行 run_score.sh 脚本,该脚本内容:
# 4张卡
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3
export QWEN_MODEL_PATH="/mnt/share/weight/Qwen2.5-VL-72B-Instruct"
python run_gedit_score.py \
--model_name Qwen-Image-Edit-2509 \
--dataset_dir /mnt/datasets/GEdit-Bench \
--edited_images_dir /mnt/Qwen-Image-Edit-2509/GEdit-Bench_cfg2_ulysses4_optimize_1+2_40steps \
--backbone qwen25vl \
--save_dir ./score_dir \参数说明:
运行后会得到打分结果文件:.csv格式文件。
运行 run_statistics.sh 脚本,该脚本内容:
python calculate_statistics.py \
--model_name Qwen-Image-Edit-2509 \
--save_path ./score_dir \
--backbone qwen25vl \
--language all参数说明:
运行后,会得到具体精度指标。
下面给出在Qwen-Image-Edit-2509在8卡推理场景下(叠加等价优化、算法优化、w8a8动态量化) 的精度指标
| 任务类型 | 语义对齐得分 (Semantics) | 图像质量得分 (Quality) | 综合得分 (Overall) |
|---|---|---|---|
| background_change | 8.000 | 7.675 | 7.828 |
| color_alter | 7.925 | 7.250 | 7.432 |
| material_alter | 7.200 | 6.975 | 6.925 |
| motion_change | 7.550 | 7.650 | 7.388 |
| ps_human | 6.443 | 7.429 | 6.360 |
| style_change | 6.250 | 7.217 | 6.244 |
| subject-add | 7.867 | 7.700 | 7.694 |
| subject-remove | 6.895 | 7.719 | 6.682 |
| subject-replace | 7.850 | 7.417 | 7.472 |
| text_change | 8.263 | 7.515 | 7.628 |
| tone_transfer | 6.250 | 7.375 | 6.373 |
| 全量平均 | 7.317 | 7.447 | 7.093 |
交集样本平均:语义7.393 | 画质7.492 | 综合7.184
| 任务类型 | 语义对齐得分 (Semantics) | 图像质量得分 (Quality) | 综合得分 (Overall) |
|---|---|---|---|
| background_change | 7.950 | 7.700 | 7.817 |
| color_alter | 7.950 | 7.200 | 7.505 |
| material_alter | 6.900 | 7.050 | 6.543 |
| motion_change | 7.575 | 7.700 | 7.533 |
| ps_human | 6.386 | 7.443 | 6.252 |
| style_change | 6.517 | 7.250 | 6.486 |
| subject-add | 8.000 | 7.767 | 7.863 |
| subject-remove | 7.000 | 7.754 | 6.872 |
| subject-replace | 7.800 | 7.383 | 7.435 |
| text_change | 7.949 | 7.505 | 7.419 |
| tone_transfer | 6.350 | 7.125 | 6.165 |
| 全量平均 | 7.307 | 7.443 | 7.081 |
交集样本平均:语义7.259 | 画质7.431 | 综合7.037
| 模型 | 卡数 | 图片输出分辨率 | 算子优化 | Cache算法优化 | 量化 | 50步 E2E耗时(s) |
|---|---|---|---|---|---|---|
| Qwen-Image-Edit-2509 | 1 | 1024*1024 | / | / | / | 93.4 |
| Qwen-Image-Edit-2509 | 1 | 1024*1024 | Y | / | / | 90.9 |
| Qwen-Image-Edit-2509 | 1 | 1024*1024 | Y | 保守 | / | 59.9 |
| Qwen-Image-Edit-2509 | 1 | 1024*1024 | Y | 偏激进 | / | 43.0 |
| Qwen-Image-Edit-2509 | 1 | 1024*1024 | Y | 偏激进 | w8a8 | 38.1 |
| 模型 | 卡数 | 图片输出分辨率 | 算子优化 | Cache算法优化 | 量化 | 50步 E2E耗时(s) |
|---|---|---|---|---|---|---|
| Qwen-Image-Edit-2509 | 8 | 1024*1024 | / | / | / | 17.9 |
| Qwen-Image-Edit-2509 | 8 | 1024*1024 | Y | / | / | 17.7 |
| Qwen-Image-Edit-2509 | 8 | 1024*1024 | Y | 保守 | / | 12.1 |
| Qwen-Image-Edit-2509 | 8 | 1024*1024 | Y | 偏激进 | / | 9.0 |
| Qwen-Image-Edit-2509 | 8 | 1024*1024 | Y | 偏激进 | w8a8 | 8.6 |
1、若使用torch2.2以下版本时,会遇到"$DIFFUSERS_PATH/models/attention_dispatch.py"中481行和490行的torch.library接口的使用的不兼容保错,在主程序代码中开头我已加入修正代码来解决兼容性报错。 2、运行代码遇到加载工程中yarn-art-pikachu.png图片报错,可能是git下载时没下载图片成功,可以尝试手动下载图片下来