HuggingFace镜像/Qwen-Image-Edit
模型介绍模型推理文件和版本分析
下载使用量0

一、准备运行环境

表 1 版本配套表

配套版本环境准备指导
Python3.10 or 3.11-
torch2.1.0-

1.1 获取CANN&MindIE安装包&环境准备

  • 设备支持 Atlas 800I/800T A2(8*64G)推理设备:支持的卡数最小为1
  • Atlas 800I/800T A2(8*64G)
  • 环境准备指导

1.2 CANN安装

# 增加软件包可执行权限,{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

1.3 MindIE安装

# 增加软件包可执行权限,{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

1.4 Torch_npu安装

下载 pytorch_v{pytorchversion}_py{pythonversion}.tar.gz

tar -xzvf pytorch_v{pytorchversion}_py{pythonversion}.tar.gz
# 解压后,会有whl包
pip install torch_npu-{pytorchversion}.xxxx.{arch}.whl

二、下载权重

2.1 权重及配置文件说明

  1. Qwen-Image权重链接:
https://huggingface.co/Qwen/Qwen-Image-Edit

三、Qwen-Image-Edit使用

3.1 推理前准备

#  1. 下载代码
git clone https://modelers.cn/MindIE/Qwen-Image-Edit.git && cd Qwen-Image-Edit

# 2. python相关依赖安装
pip install diffusers==0.35.1
pip install transformers==4.52.4
pip install yunchang==0.6.0

3.2 Qwen-Image-Edit推理

3.2.1 单卡性能测试

3.2.1.1 等价优化

执行命令:

# 等价优化
export ROPE_FUSE=1
export ADALN_FUSE=1

python run_edit.py  \
--model_path ./Qwen-Image-Edit  \
--device_id 0

参数说明:

  • model_path: 权重路径
  • device_id: 执行模型推理的芯片id
3.2.2.1 等价优化+算法优化

执行命令:

# 等价优化
export ROPE_FUSE=1
export ADALN_FUSE=1
# cache算法优化
export COND_CACHE=1
export UNCOND_CACHE=1

python run_edit.py  \
--model_path ./Qwen-Image-Edit  \
--device_id 0
 

参数说明:

  • model_path: 权重路径
  • device_id: 执行模型推理的芯片id

3.2.2 多卡性能测试

3.2.2.1 8卡性能测试

执行命令:

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"

# 等价优化  需要时开启
# 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_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

参数说明:

  • ASCEND_RT_VISIBLE_DEVICES: 选择的机器上的卡的编号,对于16卡机器,需要设定为连续的前8张或后8张
  • model_path: 权重路径
  • num_inference_steps: 推理的步数
  • seed: 设定种子
  • output_dir: 保存推理结果的路径
  • ulysses_size: ulysses并行数,使用时设定为24的因数
  • cfg_size: cfg并行数,使用时只能设定为2
3.2.2.2 16卡性能测试

执行命令:

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"

# 等价优化  需要时开启
# 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_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

参数说明:

  • ASCEND_RT_VISIBLE_DEVICES: 选择的机器上的卡的编号
  • model_path: 权重路径
  • num_inference_steps: 推理的步数
  • seed: 设定种子
  • output_dir: 保存推理结果的路径
  • ulysses_size: ulysses并行数,使用时设定为24的因数
  • cfg_size: cfg并行数,使用时只能设定为2

四、量化功能支持

本项目新增量化功能,支持权重 8 位(w8)与激活 8 位 / 16 位(a8/a16)的量化组合,可减少模型显存占用并保持推理性能

4.1 安装量化工具msModelSlim

参考官方README

  1. git clone下载msit仓代码
  2. 进入到msit/msmodelslim的目录: cd msit/msmodelslim;并在进入的msmodelslim目录下,运行安装脚本: bash install.sh

4.2 量化模型生成

通过quantization/quant.py脚本生成量化模型及描述文件,需基于原始模型权重进行量化。

4.2.1 量化脚本运行示例

生成8bit权重+8bit激活的动态量化模型(w8a8):

# w8a8量化
export PYTHONPATH=".:$PYTHONPATH"  # 添加当前目录到Python搜索路径

model_path="/mnt/weights/Qwen-Image-Edit"
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_withoutData_use_disable_quant_layers

参数说明:

  • model_path: 原始模型权重路径
  • device_id: 执行模型推理的芯片id
  • quant_mode: 量化模式(权重+激活位宽)
  • w_sym: 是否对权重使用对称量化(默认False,加此参数表示启用)
  • is_dynamic: 是否启用动态量化(默认False,加此参数表示启用)
  • act_method: 激活量化方法(1=min-max,2=histogram,3=auto-mixed,推荐3)
  • quant_save_dir: 量化模型保存路径

执行后,quant_w8a8_dynamic目录下会生成两个文件:

  • quant_model_description_w8a8_dynamic.json:量化配置描述文件(包含量化位宽、层映射等元信息)
  • quant_model_weight_w8a8_dynamic.safetensors:量化后的权重文件(采用safe tensor格式,兼容Hugging Face生态)

4.3 安装量化模型推理工具NNAL神经网络加速库和torch_atb

4.3.1 获取安装包

  • 支持设备:Atlas 800I A2
  • 环境准备指导

4.3.2 安装

# 增加软件包可执行权限,{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

4.4 使用量化模型推理

使用量化模型进行推理时,需在原有命令中添加--quant_desc_path参数,指向量化描述文件(quant_model_description_*.json)路径,该路径需要是绝对路径,其余参数与原生模型推理一致。

4.4.1 单卡量化推理示例

运行命令:

model_path="/mnt/weights/Qwen-Image-Edit"
quant_desc_path="/home/Qwen-Image-Edit/quant_w8a16_withoutData_use_disable_quant_layers/quant_model_description_w8a16.json"

# 算子优化  需要时开启
# export ROPE_FUSE=1
# export ADALN_FUSE=1

# cache 算法优化  需要时开启
# export COND_CACHE=1
# export UNCOND_CACHE=1

python run_edit.py  \
    --model_path ${model_path}  \
    --device_id 0 \
    --quant_desc_path ${quant_desc_path}

4.4.2 多卡量化推理示例

运行命令:

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"
quant_desc_path="/home/Qwen-Image-Edit/quant_w8a16_withoutData_use_disable_quant_layers/quant_model_description_w8a16.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_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}

4.4.3 量化推理注意事项

  • 路径要求:--quant_desc_path需指向完整的量化描述文件路径(即quant_model_description_*.json),且该路径要求填写绝对路径。量化权重文件(.safetensors)需与描述文件在同一目录下,否则会提示权重加载失败。

五、推理结果参考

Atlas 800I A2(1*64G) 64核(arm)性能数据(开启CFG功能,不使用cache算法加速)

模型分辨率迭代次数卡数E2E耗时
Qwen-Image1664×928501193.1s

Atlas 800I A2(1*64G) 64核(arm)性能数据(开启CFG功能,使用cache算法加速)

模型分辨率迭代次数卡数E2E耗时
Qwen-Image1664×92850192.55s

五、Q&A

若使用torch2.2以下版本时,需要注释掉"$DIFFUSERS_PATH/models/attention_dispatch.py"中481行和490行的torch.library接口的使用,否则会由于兼容性问题报错。修改后的代码如下所示:

# @torch.library.custom_op("flash_attn_3::_flash_attn_forward", mutates_args=(), device_types="cuda")
def _wrapped_flash_attn_3_original(
    query: torch.Tensor, key: torch.Tensor, value: torch.Tensor
) -> Tuple[torch.Tensor, torch.Tensor]:
    out, lse = flash_attn_3_func(query, key, value)
    lse = lse.permute(0, 2, 1)
    return out, lse


# @torch.library.register_fake("flash_attn_3::_flash_attn_forward")
def _(query: torch.Tensor, key: torch.Tensor, value: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
    batch_size, seq_len, num_heads, head_dim = query.shape
    lse_shape = (batch_size, seq_len, num_heads)
    return torch.empty_like(query), query.new_empty(lse_shape)

声明

  • 本代码仓提到的数据集和模型仅作为示例,这些数据集和模型仅供您用于非商业目的,如您使用这些数据集和模型来完成示例,请您特别注意应遵守对应数据集和模型的License,如您因使用数据集或模型而产生侵权纠纷,华为不承担任何责任。
  • 如您在使用本代码仓的过程中,发现任何问题(包括但不限于功能问题、合规问题),请在本代码仓提交issue,我们将及时审视并解答。