Diffusers0.25.0 for Pytorch
目录
简介
模型介绍
扩散模型 (Diffusion Models) 是一种生成模型,可生成各种各样的高分辨率图像。Diffusers 是Huggingface发布的模型套件,是最先进的预训练扩散模型的首选库,用于生成图像,音频甚至分子的3D结构。套件包含基于扩散模型的多种个模型,提供了各种下游任务的训练与推理的实现。 本仓库主要将SDXL、SVD模型的多个任务迁移到了昇腾NPU上,并进行极致性能优化。
注意: diffusers0.25.0目录下面的SDXL模型已经集成到MindSpeed-MM中,当前目录下的SDXL模型不再维护,MindSpeed-MM是面向大规模分布式训练的昇腾多模态大模型套件,同时支持多模态生成及多模态理解,欢迎大家使用。
支持任务列表
本仓已经支持以下模型任务类型
| 模型 | 任务列表 | 是否支持 |
|---|---|---|
| SDXL | 预训练 | ✔ |
| SDXL | Lora | ✔ |
| SDXL | Controlnet | ✔ |
| SDXL | 文生图推理 | ✔ |
| SVD | 文生视频推理 | ✔ |
代码实现
-
参考实现:
url=https://github.com/huggingface/diffusers commit_id=7f551e29ff4ad05615cb38530a8940811f9e5936 -
适配昇腾 AI 处理器的实现:
url=https://gitcode.com/ascend/ModelZoo-PyTorch.git code_path=PyTorch/built-in/diffusion/
SDXL
准备训练环境
安装模型环境
表 1 三方库版本支持表
| 三方库 | 支持版本(PT2.1) | 支持版本(PT2.4) |
|---|---|---|
| PyTorch | 2.1.0 | 2.4.0 |
| diffusers | 0.25.0 | 0.25.0 |
| accelerate | 0.25.0 | 0.25.0 |
| deepspeed | 0.12.6 | 0.15.2 |
在模型根目录下执行以下命令,安装模型对应PyTorch版本需要的依赖。
pip install -e . # 安装本地diffusers代码仓
# PyTorch 2.1请使用requirements_sdxl_2_1.txt
pip install -r examples/text_to_image/requirements_sdxl_2_1.txt # 安装ModelZoo目录下的对应依赖
# PyTorch 2.4请使用requirements_sdxl_2_4.txt
pip install -r examples/text_to_image/requirements_sdxl_2_4.txt # 安装ModelZoo目录下的对应依赖
安装昇腾环境
请参考昇腾社区中《Pytorch框架训练环境准备》文档搭建昇腾环境,本仓已支持表2中软件版本。
表 2 昇腾软件版本支持表
| 软件类型 | 支持版本 |
|---|---|
| FrameworkPTAdapter | 6.0.RC1 |
| CANN | 8.0.RC1 |
| 昇腾NPU固件 | 24.1.RC1 |
| 昇腾NPU驱动 | 24.1.RC1 |
准备数据集
预训练数据集准备
-
用户需自行获取并解压LAION_5B数据集,并在以下启动shell脚本中将
dataset_name参数设置为本地数据集的绝对路径。test/train_8p_text_to_image_sdxl_pretrain_fp16.sh test/train_8p_text_to_image_sdxl_pretrain_bf16.sh数据结构如下:
$LAION5B ├── 000000000.jpg ├── 000000000.json ├── 000000000.txt └── ...说明: 该数据集的训练过程脚本只作为一种参考示例。 用户可获取COCO数据集替换Laion_5B数据集,需按要求预处理为以上格式,例如以下处理脚本:
import torchvision.datasets as dset
dt = dset.CocoCaption(root="coco_path",
annFile="coco_path/annotations/captions_train2017.json")
path = "data_path"
for index, target in enumerate(dt):
target[0].save(path + str(index) + ".jpg")
with open(path + str(index) + ".txt", mode="w+", encoding="utf-8") as f:
f.writelines(target[1][0])
f.close()
微调数据集准备
LoRA微调
- 联网情况下,数据集会自动下载。
- 无网络情况下,用户需自行获取pokemon-blip-captions数据集,并在以下启动shell脚本中将
dataset_name参数设置为本地数据集的绝对路径。
test/train_8p_sdxl_lora.sh
test/train_8p_sdxl_lora_deepspeed.sh
pokemon-blip-captions数据集格式如下:
pokemon-blip-captions
├── dataset_infos.json
├── README.MD
└── data
├── dataset_infos.json
└── train-001.parquet
说明: 该数据集的训练过程脚本只作为一种参考示例。
Controlnet微调
- 联网情况下,数据集会自动下载。
- 无网络情况下,用户需自行获取fill50k数据集,并在以下启动shell脚本中将
dataset_name参数设置为本地数据集的绝对路径,以及需要修改里面fill50k.py文件。
test/train_8p_controlnet_sdxl.sh
test/train_8p_controlnet_sdxl_deepspeed.sh
注意: 需要修改数据集下面的fill50k.py文件中的57到59行,修改示例如下:
metadata_path = "数据集路径/fill50k/train.jsonl" images_dir = "数据集路径/fill50k" conditioning_images_dir = "数据集路径/fill50k"
fill50k数据集格式如下:
fill50k
├── images
├── conditioning_images
├── train.jsonl
└── fill50k.py
说明: 该数据集的训练过程脚本只作为一种参考示例。
获取预训练模型
-
联网情况下,预训练模型会自动下载。
-
无网络时,用户可访问huggingface官网自行下载,文件namespace如下:
stabilityai/stable-diffusion-xl-base-1.0 #预训练模型 madebyollin/sdxl-vae-fp16-fix #vae模型 -
获取对应的预训练模型后,在以下shell启动脚本中将
model_name参数设置为本地预训练模型绝对路径,将vae_name参数设置为本地vae模型绝对路径。test/train_8p_text_to_image_sdxl_pretrain_fp16.sh test/train_8p_text_to_image_sdxl_pretrain_bf16.sh test/train_8p_sdxl_lora.sh test/train_8p_sdxl_lora_deepspeed.sh test/train_8p_controlnet_sdxl.sh test/train_8p_controlnet_sdxl_deepspeed.sh
快速开始
预训练任务
本任务主要提供混精fp16和混精bf16两种8卡训练脚本,默认使用deepspeed分布式训练。
开始训练
-
进入解压后的源码包根目录。
cd /${模型文件夹名称} -
运行预训练脚本。
该模型支持单机8卡训练。
-
单机8卡训练
bash test/train_8p_text_to_image_sdxl_pretrain_fp16.sh # 8卡训练,混精fp16 bash test/train_8p_text_to_image_sdxl_pretrain_fp16.sh --max_train_steps=200 # 8卡性能,混精fp16 bash test/train_8p_text_to_image_sdxl_pretrain_bf16.sh # 8卡训练,混精bf16 bash test/train_8p_text_to_image_sdxl_pretrain_bf16.sh --max_train_steps=200 # 8卡性能,混精bf16注:
- 预训练默认开启动态分辨率,如需使用静态分辨率需要使用:
- 数据集原图像分辨率大小足够大;
- 设置最大、最小动态分辨率桶均为1024。
- 根据以下指引修改环境中deepspeed仓库的参数以获得性能加速:
- 预训练默认开启动态分辨率,如需使用静态分辨率需要使用:
-
# 位于deepspeed/runtime/bf16_optimizer.py文件中第66行: self.nccl_start_alignment_factor = 2 #修改为: self.nccl_start_alignment_factor = 128 # 位于deepspeed/runtime/zero/stage_1_and_2.py文件中第276行: self.nccl_start_alignment_factor = 2 #修改为: self.nccl_start_alignment_factor = 128
- 训练完成后,模型权重文件,训练精度和性能等信息保存在
test/output路径下。
- 模型训练python训练脚本参数说明如下。
examples/text_to_image/train_text_to_image_sdxl_pretrain.py
--max_train_steps //训练步数
--pretrained_model_name_or_path //预训练模型名称或者地址
--dataset_name //加载数据集的方式,从官网或者本地cache中读取数据
--vae_name //预训练vae模型名称或者地址
--dataset_config_name //数据集配置
--train_batch_size //设置batch_size
--image_column //图片所在列
--caption_column //图片caption所在列
--max_train_samples //最大训练样本数
--validation_prompts //验证提示词
--output_dir //输出路径
--resolution //分辨率
--num_train_epochs //训练epoch数
--gradient_accumulation_steps //梯度累计步数
--mixed_precision //精度模式
--num_train_epochs //训练回合数
--enable_bucket //启动动态分辨率
--max_bucket_reso //设置最大动态分辨率桶,默认2048
--min_bucket_reso //设置最小动态分辨率桶,默认512
训练结果
性能
| 芯片 | 卡数 | FPS | batch_size | AMP_Type | Torch_Version |
|---|---|---|---|---|---|
| 竞品A | 8p | 22.61 | 4 | bf16 | 2.1 |
| Atlas 200T A2 Box16 | 8p | 23.18 | 4 | bf16 | 2.1 |
| 竞品A | 8p | 22.32 | 4 | fp16 | 2.1 |
| Atlas 200T A2 Box16 | 8p | 22.81 | 4 | fp16 | 2.1 |
微调任务
本任务主要提供LoRA和Controlnet两种微调下游任务的8卡训练脚本,包括使用和不使用deepspeed分布式训练。
开始训练
-
进入解压后的源码包根目录。
cd /${模型文件夹名称} -
运行训练的脚本。
-
单机八卡微调
bash test/train_8p_controlnet_sdxl_deepspeed.sh #8卡deepspeed训练 sdxl_controlnet fp16 bash test/train_8p_sdxl_lora_deepspeed.sh #8卡deepspeed训练 sdxl_lora fp16 bash test/train_8p_controlnet_sdxl.sh #8卡训练 sdxl_controlnet fp16 bash test/train_8p_sdxl_lora.sh #8卡训练 sdxl_lora fp16 -
微调脚本参数说明如下
examples/text_to_image/train_text_to_image_lora_sdxl.py or examples/text_to_image/train_controlnet_sdxl.py
--pretrained_model_name_or_path //基础模型路径
--dataset_name //数据集名称
--resolution //分辨率大小
--train_batch_size //训练batchsize
--num_train_epochs //训练epochs次数
--checkpointing_steps //每steps保存一次
--learning_rate //学习率
--lr_scheduler //学习率衰减策略
--lr_warmup_steps //warmup步数
--mixed_precision //混合精度
--max_train_steps //最大训练轮次
--validation_prompt //验证的prompt
--validation_epochs //每epochs验证一次
--validation_steps //每steps验证一次(仅controlnet微调脚本使用)
--seed //随机数种子
--output_dir //模型输出的路径
--gradient_accumulation_steps //梯度累计步数
--validation_image //验证使用的图片(仅controlnet微调脚本使用)
训练结果
性能
| 芯片 | 卡数 | 任务 | FPS | batch_size | AMP_Type | Torch_Version | deepspeed |
|---|---|---|---|---|---|---|---|
| 竞品A | 8p | LoRA | 23.38 | 7 | fp16 | 2.1 | ✔ |
| Atlas 200T A2 Box16 | 8p | LoRA | 28.75 | 7 | fp16 | 2.1 | ✔ |
| 竞品A | 8p | LoRA | 19.48 | 3 | fp16 | 2.1 | ✘ |
| Atlas 200T A2 Box16 | 8p | LoRA | 18.76 | 3 | fp16 | 2.1 | ✘ |
| 竞品A | 8p | Controlnet | 32.5 | 5 | fp16 | 2.1 | ✔ |
| Atlas 200T A2 Box16 | 8p | Controlnet | 28.42 | 5 | fp16 | 2.1 | ✔ |
| 竞品A | 8p | Controlnet | 20.52 | 2 | fp16 | 2.1 | ✘ |
| Atlas 200T A2 Box16 | 8p | Controlnet | 32.69 | 2 | fp16 | 2.1 | ✘ |
推理任务
本任务主要以预训练模型为主,展示推理任务,包括单卡预训练推理。
开始推理
-
进入解压后的源码包根目录。
cd /${模型文件夹名称} -
运行推理的脚本。
-
单机单卡推理
bash test/infer_full_1p_text_to_image_sdxl_fp16.sh # 混精fp16 预训练任务推理 -
微调脚本参数说明如下
examples/text_to_image/infer_text_to_image.py --mixed_precision //混合精度 --ckpt_path //模型地址 --output_path //输出地址 --device_id //设备id
SVD(在研版本)
准备训练环境
安装模型环境
表 3 三方库版本支持表
| 三方库 | 支持版本 |
|---|---|
| PyTorch | 2.1.0 |
| TorchVision | 0.16.0 |
| diffusers | 0.25.0 |
| accelerate | 0.27.2 |
在模型根目录下执行以下命令,安装模型对应PyTorch版本需要的依赖。
pip install -e . # 安装本地diffusers代码仓
cd examples/stable_video_diffusion/ # 根据下游任务安装对应依赖
pip install -r requirements_svd.txt
安装昇腾环境
请参考昇腾社区中《Pytorch框架训练环境准备》文档搭建昇腾环境,本仓已支持表4中软件版本。
表 4 昇腾软件版本支持表
| 软件类型 | 支持版本 |
|---|---|
| FrameworkPTAdaper | 在研版本 |
| CANN | 在研版本 |
| 昇腾NPU固件 | 在研版本 |
| 昇腾NPU驱动 | 在研版本 |
准备数据集
-
用户自行获取i2vgen-xl数据集,放到模型目录下,并重命名为
svd_testdata -
用户自行准备数据路径txt文件,存放测试图片的文件名
参考数据集结构为
diffusers0.25.0 ├── svd_testdata | ├── img_0001.jpg | ├── img_0002.jpg | ├── ... | ├── imglist.txt说明: 该数据集的推理过程脚本只作为一种参考示例。
获取预训练权重
-
联网情况下,预训练模型会自动下载。
-
无网络时,用户可访问huggingface官网自行下载,文件namespace如下:
stabilityai/stable-video-diffusion-img2vid-xt -
获取对应的预训练模型后,在shell启动脚本中将
ckpt_path参数,设置为本地预训练模型路径,填写一级目录。
快速开始
推理任务
本任务主要提供混精fp16的单卡和8卡推理脚本。
开始训练
-
进入源码根目录。
cd /${模型文件夹名称} -
运行推理脚本。
该模型支持单机单卡和8卡推理。
-
单机单卡推理
bash test/infer_full_1p_svd_fp16.sh --ckpt_path=xxx --test_data_dir=xxx --test_file=xxx # 单卡推理,混精fp16 -
单机8卡推理
bash test/infer_full_8p_svd_fp16.sh --ckpt_path=xxx --test_data_dir=xxx --test_file=xxx # 八卡推理,混精fp16
-
模型推理脚本参数说明如下。
infer_full_8p_svd_fp16.sh
--ckpt_path // 模型权重加载地址
--batch_size // 推理的图像全局批大小
--test_file // 测试图片路径文件
--test_data_dir // 测试数据集存放目录
test_stable_video_diffusion.py
--ckpt // 模型权重加载地址
--global-batch-size // 推理的图像全局批大小
--test-file // 测试图片路径文件
--test-data-dir // 测试数据集存放目录
--export-video // 是否导出视频文件
--num-frames // 生成帧数
--seed // 随机种子
--image-size // 输入图片resize分辨率
--num-workers // 读取数据集的线程数
--output-dir // 生成文件的保存目录
--eval-metrics // 是否评估推理精度
--benchmark-dir // 评估对比图片的目录
推理结果
性能
| 芯片 | 卡数 | Denoise FPS | batch_size | AMP_Type | Torch_Version |
|---|---|---|---|---|---|
| 竞品A | 8p | 4.88 | 8 | fp16 | 2.1 |
| Atlas 200T A2 Box16 | 8p | 4.06 | 8 | fp16 | 2.1 |
注:denoise FPS是根据denoise的单步时间计算的FPS(帧数/时间),等于BatchSize/denoise step time.
公网地址说明
代码涉及公网地址参考 public_address_statement.md
变更说明
变更
2024.01.30:SDXL fp16预训练任务首次发布。
2024.01.31:SDXL微调任务首次发布。
2024.02.05:SDXL bf16预训练任务首次发布。
2024.03.06:SDXL 预训练任务添加deepspeed config。
2024.03.14:SVD 推理任务首次发布。
2024.06.11:SDXL 性能极限变更。