Diffsynth-Studio
Qwen Image Edit
模型介绍
Qwen Image Edit 是基于 Qwen Image 基础模型扩展的图像编辑功能,通过引入输入图像编辑机制实现对现有图像的修改能力。Qwen Image Edit 继承了 Qwen Image 的完整Dit架构 QwenImageDit 和其他核心组件 QwenImageTextEncoder、QwenImageVAE,使用 Qwen2VLProcessor 处理包含图像和文本的编辑指令,采用特殊的提示模板,将编辑图像和文本指令联合编码。Qwen Image 系列的核心结构创新在于采用 MSRoPE 多模态位置编码解决文本与图像位置混淆问题;功能上以卓越的多语言文本渲染(尤其中文)和精准图像编辑为特色,同时具备强大的通用图像生成能力。
版本说明
参考实现
url=https://github.com/modelscope/Diffsynth-Studio
commit_id=084bc2fc78422fd15b37f7a8db02ad924eaf2917
变更记录
2025.11.18: 首次发布Qwen Image Edit
微调
环境搭建
【模型开发时推荐使用配套的环境版本】
请参考安装指南
-
软件与驱动安装
# 创建并激活python环境,安装 torch 和 torch_npu,请参考上述安装指南 # 将shell脚本中的环境变量路径修改为真实路径,下面为参考路径 source /usr/local/Ascend/cann/set_env.sh -
克隆仓库到本地服务器
git clone --branch 2.3.0 https://gitcode.com/Ascend/MindSpeed-MM.git -
模型搭建
3.1 【下载 Qwen Image Edit 项目 GitHub参考实现 在模型根目录下执行以下命令,安装模型对应PyTorch版本需要的依赖】
git clone https://github.com/modelscope/DiffSynth-Studio.git cd DiffSynth-Studio git checkout 084bc2f bash ../MindSpeed-MM/examples/diffsynth/qwen_image_edit/replace_npu_patch.sh3.2【安装其余依赖库】
pip install -e . pip install -r requirements.txt # 安装对应依赖
微调
-
【下载权重】
用户可访问modelscope官网自行下载完整模型库Qwen Image Edit 模型权重
-
【准备微调数据集】
用户可自行获取数据集UltraEdit 数据集,该数据集规模庞大,可仅下载一个parquet文件。parquet格式数据需要转换为下文规定的格式。用户也可以自行构建数据集,构建后的数据集应符合以下几点要求:
-
数据集文件夹应按照以下规范形式存放
dataset_name ├── metadata_edit.csv └── images ├── edited_00010000.jpg ├── source_00010000.jpg └── ......说明:
dataset_name代表数据集名称。metadata_edit.csv是结构化数据索引/配置文件,使用表格的形式记录数据的路径、标签、元数据、配对关系等信息。images是存放图像的文件夹,所有图像均存放在此文件夹中。 -
metadata_edit.csv对图像编辑任务所需的一对输入图像进行信息记录的示例如下:image edit_image prompt sample_id images/source_00010000.jpg images/edited_00010000.jpg transform the bird into a butterfly 10000 images/source_00010001.jpg images/edited_00010001.jpg change the cat's fur color to orange 10001 说明:
image是编辑前的图像,图像命名打头为source_,后跟图像序号;edit_image则是编辑后的图像,图像命名打头为edited_,后跟图像序号。prompt是图像编辑指令。sample_id是图像序号,一对image和edit_image使用共同的图像序号。
-
-
【配置 Lora 微调脚本】
下载好权重和数据集之后,即可根据实际存放路径修改模型微调shell脚本
train_qwen_image_edit_lora.sh-
根据权重路径修改
transformer_path、text_encoder_path、model_paths、tokenizer_path、processor_pathmodel_paths存放transformer、text_encoder、vae三个模型组件的权重路径,对于使用多个分片文件保存的权重,需要使用[]将其囊括并使用,和换行符相分隔,修改后的model_paths参数示例如下:transformer_path="Qwen/Qwen-Image-Edit/transformer" text_encoder_path="Qwen/Qwen-Image-Edit/text_encoder" model_paths='[ [ "'"${transformer_path}"'/diffusion_pytorch_model-00001-of-00005.safetensors", "'"${transformer_path}"'/diffusion_pytorch_model-00002-of-00005.safetensors", "'"${transformer_path}"'/diffusion_pytorch_model-00003-of-00005.safetensors", "'"${transformer_path}"'/diffusion_pytorch_model-00004-of-00005.safetensors", "'"${transformer_path}"'/diffusion_pytorch_model-00005-of-00005.safetensors" ], [ "'"${text_encoder_path}"'/model-00001-of-00004.safetensors", "'"${text_encoder_path}"'/model-00002-of-00004.safetensors", "'"${text_encoder_path}"'/model-00003-of-00004.safetensors", "'"${text_encoder_path}"'/model-00004-of-00004.safetensors" ], "/path/Qwen-Image-Edit/vae/diffusion_pytorch_model.safetensors" ]'tokenizer_path存放tokenizer地址,processor_path存放processor地址:tokenizer_path="Qwen/Qwen-Image-Edit/tokenizer" processor_path="Qwen/Qwen-Image-Edit/processor" -
根据数据集路径修改
dataset_base_path、dataset_metadata_pathdataset_base_path存放所构建数据集的dataset_name,dataset_metadata_path则存放csv文件地址:dataset_base_path="/path/dataset" dataset_metadata_path="/path/dataset/metadata_edit.csv" -
根据分布式训练配置修改accelerate配置
accelerate_config.yaml默认设置单机8卡进行zerostage2切分策略训练,如需更改lora训练的配置,请在./examples/qwen_image/model_training/lora/accelerate_config.yaml中进行修改,同时将该文件的相对路径放置在config_file参数后。 -
根据数据集规模、
dataset_repeat、num_epochs控制train steps:dataset_repeat指数据集的样本重复次数、num_epochs则指训练epoch数。dataset_repeat应设置得较小,以免训练时显存溢出。Qwen Image Edit的训练步数由以下公式求得:training_steps = len(dataloader) × num_epochs
-
-
【修改代码文件】
- 根据NPU特性使用patch
打开
train.py文件```shell vim ./examples/qwen_image/model_training/train.py # 进入Python文件 ``` - 在import栏(第4行之前插入代码) ```python # 添加代码 from diffsynth.models.qwen_image_edit_patch import apply_patches apply_patches() from diffsynth.pipelines.qwen_image import QwenImagePipeline, ModelConfig # 原代码 ```-
【Optional】多机运行
修改config文件
vim ./examples/qwen_image/model_training/lora/accelerate_config.yaml将文件中的
deepspeed_multinode_launcher,main_process_ip, 以及main_process_port消除注释而进行使用,主节点IP在组成多机的所有机器中保持一致,根据实际使用需要修改num_machines、num_processes。所有机器的CANN版本应保持一致。zero_stage: 2 deepspeed_multinode_launcher: standard main_process_ip: localhost # 主节点IP main_process_port: 6000 # 主节点port machine_rank: 0 # 当前机器的rank num_machines: 1 # 总共的机器数 num_processes: 8 # 总共的卡数
-
【启动 Qwen Image Edit微调脚本】
本任务主要提供train_qwen_image_edit_lora微调脚本,支持多卡训练。
启动 Qwen Image Edit lora微调脚本
bash examples/qwen_image/model_training/lora/train_qwen_image_edit_lora.sh
微调性能
吞吐
Qwen Image Edit 在 昇腾芯片 和 参考芯片 上的性能对比:
| 芯片 | 卡数 | 任务 | FPS | batch_size | AMP_Type | Torch_Version | deepspeed |
|---|---|---|---|---|---|---|---|
| Atlas 900 A2 PODc | 8p | Qwen Image Edit-LoRA微调 | 20.59 | 8 | bf16 | 2.7.1 | ✔ |
| 竞品A | 8p | Qwen Image Edit-LoRA微调 | 17.47 | 8 | bf16 | 2.7.1 | ✔ |
推理
环境搭建及运行
同微调对应章节
【Qwen Image Edit模型推理】
vim ./examples/qwen_image/model_inference/inference_qwen_image_edit_bf16.py # 进入运行推理的Python文件
- 修改路径
```python
transformer_path = "Qwen/Qwen-Image-Edit/transformer"
transformer_files = "${transformer_path}/diffusion_pytorch_model*.safetensors"
text_encoder_path = "Qwen/Qwen-Image-Edit/text_encoder"
text_encoder_files = "${text_encoder_path}/model*.safetensors"
vae_file = "Qwen/Qwen-Image/vae/diffusion_pytorch_model.safetensors"
tokenizer_file = "Qwen/Qwen-Image/tokenizer"
processor_file = "Qwen/Qwen-Image/processor"
```
`transformer_files`和`text_encoder_files`若为分片保存的多文件权重,需要使用`[]`将其囊括并使用`,`和换行符相分隔:
```python
transformer_path = "Qwen/Qwen-Image-Edit/transformer"
transformer_files = [
"${transformer_path}/diffusion_pytorch_model-00001-of-00005.safetensors",
"${transformer_path}/diffusion_pytorch_model-00002-of-00005.safetensors",
"${transformer_path}/diffusion_pytorch_model-00003-of-00005.safetensors",
"${transformer_path}/diffusion_pytorch_model-00004-of-00005.safetensors",
"${transformer_path}/diffusion_pytorch_model-00005-of-00005.safetensors"
]
text_encoder_path = "Qwen/Qwen-Image-Edit/text_encoder"
text_encoder_files = [
"${text_encoder_path}/model-00001-of-00004.safetensors",
"${text_encoder_path}/model-00002-of-00004.safetensors",
"${text_encoder_path}/model-00003-of-00004.safetensors",
"${text_encoder_path}/model-00004-of-00004.safetensors"
]
```
-
运行代码
source /usr/local/Ascend/cann/set_env.sh python examples/qwen_image/model_inference/inference_qwen_image_edit_bf16.py
【lora微调Qwen Image Edit模型推理】
vim ./examples/qwen_image/model_inference/inference_qwen_image_edit_lora_bf16.py
- 修改路径
```python
transformer_path = "Qwen/Qwen-Image-Edit/transformer"
transformer_files = "${transformer_path}/diffusion_pytorch_model*.safetensors"
text_encoder_path = "Qwen/Qwen-Image-Edit/text_encoder"
text_encoder_files = "${text_encoder_path}/model*.safetensors"
vae_file = "Qwen/Qwen-Image/vae/diffusion_pytorch_model.safetensors"
tokenizer_file = "Qwen/Qwen-Image/tokenizer"
processor_file = "Qwen/Qwen-Image/processor"
lora_path = "Qwen-Image-LoRA/model.safetensors"
```
`lora_path`是存放 lora 权重的绝对路径,其他权重同上
-
运行代码
source /usr/local/Ascend/cann/set_env.sh python examples/qwen_image/model_inference/inference_qwen_image_edit_lora_bf16.py
环境变量声明
| 环境变量 | 描述 | 取值说明 |
|---|---|---|
ASCEND_SLOG_PRINT_TO_STDOUT |
是否开启日志打印 | 0: 关闭日志打屏1: 开启日志打屏 |
ASCEND_GLOBAL_LOG_LEVEL |
设置应用类日志的日志级别及各模块日志级别,仅支持调试日志 | 0: 对应DEBUG级别1: 对应INFO级别2: 对应WARNING级别3: 对应ERROR级别4: 对应NULL级别,不输出日志 |
TASK_QUEUE_ENABLE |
用于控制开启task_queue算子下发队列优化的等级 | 0: 关闭1: 开启Level 1优化2: 开启Level 2优化 |
COMBINED_ENABLE |
设置combined标志。设置为0表示关闭此功能;设置为1表示开启,用于优化非连续两个算子组合类场景 | 0: 关闭1: 开启 |
CPU_AFFINITY_CONF |
控制CPU端算子任务的处理器亲和性,即设定任务绑核 | 设置0或未设置: 表示不启用绑核功能1: 表示开启粗粒度绑核2: 表示开启细粒度绑核 |
HCCL_CONNECT_TIMEOUT |
用于限制不同设备之间socket建链过程的超时等待时间 | 需要配置为整数,取值范围[120,7200],默认值为120,单位s |
PYTORCH_NPU_ALLOC_CONF |
控制缓存分配器行为 | expandable_segments:<value>: 使能内存池扩展段功能,即虚拟内存特征 |
HCCL_EXEC_TIMEOUT |
控制设备间执行时同步等待的时间,在该配置时间内各设备进程等待其他设备执行通信同步 | 需要配置为整数,取值范围[68,17340],默认值为1800,单位s |
ACLNN_CACHE_LIMIT |
配置单算子执行API在Host侧缓存的算子信息条目个数 | 需要配置为整数,取值范围[1, 10,000,000],默认值为10000 |
TOKENIZERS_PARALLELISM |
用于控制Hugging Face的transformers库中的分词器(tokenizer)在多线程环境下的行为 | False: 禁用并行分词True: 开启并行分词 |
OMP_NUM_THREADS |
设置执行期间使用的线程数 | 需要配置为整数 |
引用
公网地址说明
代码涉及公网地址参考 公网地址