上海闵行区 网站建设,全球外贸网,中国光大国际建设工程公司网站,网站开发 运行及维护stable diffusion微调总结 stable diffusion模型类别#xff1a;SDSD2SDXLSDXL LCM#xff08;潜在一致性模型#xff09;SDXL DistilledSDXL Turbo 安装accelerate通过pip安装配置 accelerate config查看配置 安装diffusers数据处理BLIP模型优化 微调方法Dreambooth微调准备… stable diffusion微调总结 stable diffusion模型类别SDSD2SDXLSDXL LCM潜在一致性模型SDXL DistilledSDXL Turbo 安装accelerate通过pip安装配置 accelerate config查看配置 安装diffusers数据处理BLIP模型优化 微调方法Dreambooth微调准备数据模型训练脚本模型推理模型转换脚本 DreamLORA微调模型训练脚本模型推理脚本 Full FineTune数据格式训练脚本推理脚本 LORA微调数据格式训练脚本推理脚本 stable diffusion
模型类别
SD SD是一个基于latent的扩散模型它在UNet中引入text condition来实现基于文本生成图像。SD的核心来源于Latent Diffusion这个工作常规的扩散模型是基于pixel的生成模型而Latent Diffusion是基于latent的生成模型它先采用一个autoencoder将图像压缩到latent空间然后用扩散模型来生成图像的latents最后送入autoencoder的decoder模块就可以得到生成的图像。 SD2 SD 2.0相比SD 1.x版本的主要变动在于模型结构和训练数据两个部分。 首先是模型结构方面SD 1.x版本的text encoder采用的是OpenAI的CLIP ViT-L/14模型其模型参数量为123.65M而SD 2.0采用了更大的text encoder基于OpenCLIP在laion-2b数据集上训练的CLIP ViT-H/14模型其参数量为354.03M相比原来的text encoder模型大了约3倍。 SDXL Stable Diffusion XL (SDXL) 是一种强大的文本到图像生成模型它以三种关键方式迭代以前的 Stable Diffusion 模型 UNet 增大了 3 倍SDXL 将第二个文本编码器 (OpenCLIP ViT-bigG/14) 与原始文本编码器相结合显着增加了参数数量引入大小和裁剪调节以防止训练数据被丢弃并更好地控制生成图像的裁剪方式引入两阶段模型过程基本模型也可以作为独立模型运行生成图像作为细化器模型的输入该**模型添加了额外的高质量细节
SDXL LCM潜在一致性模型
SDXL 潜在一致性模型 LCM 如“潜在一致性模型使用几步推理合成高分辨率图像”中提出的那样通过减少所需的步骤数彻底改变了图像生成过程。它将原始 SDXL 模型提炼成一个需要更少步骤4 到 8 个而不是 25 到 50 个步骤来生成图像的版本。该模型对于需要在不影响质量的情况下快速生成图像的应用特别有利。值得一提的是它比原来的 SDXL 小 50%快 60%。
SDXL Distilled
SDXL Distilled 是指为特定目的而“蒸馏”的 SDXL 模型版本。例如Segmind 稳定扩散模型 SSD-1B 是 SDXL 的精炼版本体积缩小了 50%速度提高了 60%同时保持了高质量的文本到图像生成功能。此版本对于速度至关重要但图像质量不能受到影响的场景特别有用。
SDXL Turbo
SDXL Turbo 是 SDXL 1.0 的新版本专为“实时合成”而开发。这意味着它可以非常快速地生成图像这一功能由一种称为对抗扩散蒸馏 ADD 的新训练方法提供支持。这种变体是独一无二的因为它具有有损自动编码组件尽管在图像的编码和解码过程中会导致一些信息丢失但可以更快地生成图像。
安装accelerate
通过pip安装 pip install accelerate 配置 accelerate config -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------In which compute environment are you running?在本机服务器上就选择This machine This machine -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Which type of machine are you using?单机多卡选择multi-GPU单卡选第一个选项 multi-GPU How many different machines will you use (use more than 1 for multi-node training)? [1]: 1 几台机器用来训练 Do you wish to optimize your script with torch dynamo?[yes/NO]: Do you want to use DeepSpeed? [yes/NO]: Do you want to use FullyShardedDataParallel? [yes/NO]: Do you want to use Megatron-LM ? [yes/NO]: How many GPU(s) should be used for distributed training? [1]:2 用几张卡 What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]:all 全部都用来训练 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Do you wish to use FP16 or BF16 (mixed precision)? fp16 选择训练精度类型 accelerate configuration saved at /root/.cache/huggingface/accelerate/default_config.yaml 配置文件保存位置可修改 查看配置 accelerate env 安装diffusers
注意必须从源码安装最新的版本不然无法通过版本审核。
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install -e .数据处理 我们需要筛除分辨率较低质量较差**比如说768*768分辨率的图片 100kb**存在破损以及和任务目标无关的数据接着去除数据里面可能包含的水印干扰文字等最后就可以开始进行数据标注了。 数据标注可以分为自动标注和手动标注。自动标注主要依赖像BLIP和Waifu Diffusion 1.4这样的模型手动标注则依赖标注人员。 BLIP 图像字幕开放式视觉问答多模态/单模态特征提取图文匹配 数据注意事项 当我们训练人物主题时一般需要10-20张高质量数据当我们训练画风主题时需要100-200张高质量数据当我们训练抽象概念时则至少需要200张以上的数据。 不管是人物主题画风主题还是抽象概念一定要保证数据集中数据的多样性比如说猫女姿态角度全身半身的多样性。 每个数据都要符合我们的审美和评判标准
模型注意事项 1. 底模型的选择至关重要SDXL LoRA的很多底层能力与基础概念的学习都来自于底模型的能力。 并且底模型的优秀能力需要与我们训练的主题比如说人物画风或者某个抽象概念相适配。如果我们要训练二次元LoRA则需要选择二次元底模型如果我们要训练三次元LoRA则需要选择三次元底模型以此类推。 模型以savetensor为后缀的是加密的ckpt是开源的。 模型优化
1.剪枝剪枝后的模型pruned泛化性好存储空间小。
2.ema: ema是一种常用的优化神经网络的方法他可以平滑模型的参数更新降低模型训练过程中的波动和震荡增强模型的鲁棒性和泛化能力
微调方法
目前主流训练 Stable Diffusion 模型的方法有
Full FineTune 全量训练数据以图片标注的形式。 Dreambooth DreamBooth是一种训练技术通过对某个主题或风格的几张图像进行训练来更新整个扩散模型。它的工作原理是将提示中的特殊单词与示例图像相关联。 Text Inversion 文本反转是一种训练技术用于通过一些您希望其学习内容的示例图像来个性化图像生成模型。该技术的工作原理是学习和更新文本嵌入新嵌入与您必须在提示中使用的特殊单词相关联以匹配您提供的示例图像。 LoRA LoRA大型语言模型的低秩适应是一种流行的轻量级训练技术可显着减少可训练参数的数量。它的工作原理是向模型中插入较少数量的新权重并且仅对这些权重进行训练。这使得 LoRA 的训练速度更快、内存效率更高并产生更小的模型权重几百 MB更容易存储和共享。LoRA 还可以与 DreamBooth 等其他训练技术相结合以加速训练。 Dreambooth微调
准备数据
https: //huggingface.co/datasets/diffusers/dog-example模型训练脚本
export MODEL_NAMEstable-diffusion-2
export INSTANCE_DIRdog
export OUTPUT_DIRpath-to-save-modelaccelerate launch train_dreambooth.py \--pretrained_model_name_or_path$MODEL_NAME \--instance_data_dir$INSTANCE_DIR \--output_dir$OUTPUT_DIR \--instance_prompta photo of sks dog \--resolution768 \--train_batch_size1 \--gradient_accumulation_steps1 \--learning_rate5e-6 \--lr_schedulerconstant \--lr_warmup_steps0 \--max_train_steps400 \train_dreambooth.py: 脚本位置为https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py
pretrained_model_name_or_path: 模型的路径
instance_data_dir 训练的图片位置
output_dir 微调模型保存位置
instance_prompt罕见字符使用 Stable Diffusion 模型去生成一个已有相关主题class 的先验知识并在训练中充分考虑原 class 和新 instance 的 prior preservation loss从而避免新 instance 图片特征渗透到其他生成里。
resolution 图片尺寸和训练的模型相对应
train_batch_size 训练批次
gradient_accumulation_steps
gradient_accumulation_steps通过累计梯度来解决本地显存不足问题。 假设原来的batch_size6样本总量为24。 那么参数更新次数24/64。
如果我的显存不够6batch想调成3batch那么我的参数更新次数就是24/38次
但是我设置了gradient_accumulation_steps2batch还是6但是内部是按照batch3来算的计算两次batch3后进行累计梯度即batch_size6/23参数更新次数不变24/3/24在梯度反传时每gradient_accumulation_steps次进行一次梯度更新之前照常利用loss.backward()计算梯度。
learning_rate学习率
lr_scheduler 策略
lr_warmup_steps预热的步数
max_train_steps训练步数
模型推理
from diffusers import StableDiffusionPipeline
import torchmodel_id stable_finetine/path-to-save-model
pipe StableDiffusionPipeline.from_pretrained(model_id, torch_dtypetorch.float16).to(cuda)prompt A photo of dog in a bucket
image pipe(prompt, num_inference_steps50, guidance_scale7.5).images[0]image.save(dog-bucket2.png)模型转换脚本
python convert_diffusers_to_original_stable_diffusion.py --model_path path-to-save-model --checkpoint_path dreambooth_dog.safetensors --use_safetensorsconvert_diffusers_to_original_stable_diffusion.py 脚本位置在https://github.com/huggingface/diffusers/blob/main/scripts/convert_diffusers_to_original_stable_diffusion.py
model_path经过dreambooth训练出来的模型
checkpoint_path 自定义命名
DreamLORA微调
模型训练脚本
export MODEL_NAMEstable-diffusion-2
export INSTANCE_DIRdog
export OUTPUT_DIRpath-to-save-lora-modelaccelerate launch train_dreambooth_lora.py \--pretrained_model_name_or_path$MODEL_NAME \--instance_data_dir$INSTANCE_DIR \--output_dir$OUTPUT_DIR \--instance_prompta photo of sks dog \--resolution768 \--train_batch_size1 \--gradient_accumulation_steps1 \--checkpointing_steps100 \--learning_rate1e-4 \--report_towandb \--lr_schedulerconstant \--lr_warmup_steps0 \--max_train_steps500 \--validation_promptA photo of sks dog in a bucket \--validation_epochs50 \--seed0 \--mixed_precision nomixed_precision: 默认是fp16会报错ValueError: Attempting to unscale FP16gradients
需要改成no则是fp36。
train_dreambooth_lora.py该脚本自带转换模型
模型推理脚本
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
import torchpipe DiffusionPipeline.from_pretrained(stable-diffusion-2, torch_dtypetorch.float16)
pipe.scheduler DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe.to(cuda)
# pipe.unet.load_attn_procs(path-to-save-lora-model)
pipe.load_lora_weights(path-to-save-lora-model)
image pipe(A picture of a sks dog in a bucket, num_inference_steps25).images[0]
image.save(dog-bucket-lora.png)
注意点
原文档中是:
pipe.unet.load_attn_procs(path-to-save-lora-model)但是加载后的推理并没有明显的效果怀疑根本没有加载到。作者后续更新了新方法测试新方法有效果
pipe.load_lora_weights(path-to-save-lora-model)Full FineTune
数据格式
folder/train/metadata.jsonl
folder/train/0001.png
folder/train/0002.png
folder/train/0003.pngmetadata.jsonl
{file_name: 0001.png, additional_feature: This is a first value of a text feature you added to your images}
{file_name: 0002.png, additional_feature: This is a second value of a text feature you added to your images}
{file_name: 0003.png, additional_feature: This is a third value of a text feature you added to your images}或者用huggingface上现成的数据
pokemon-blip-captions
├── data
│ └── train-00000-of-00001-566cc9b19d7203f8.parquet
└── dataset_infos.json训练脚本
export MODEL_NAMEstable-diffusion-2
export DATASET_NAMEpokemon-blip-captionsaccelerate launch --mixed_precisionfp16 train_full_finetune.py \--pretrained_model_name_or_path$MODEL_NAME \--dataset_name$DATASET_NAME \--use_ema \--resolution768 --center_crop --random_flip \--train_batch_size1 \--gradient_accumulation_steps4 \--gradient_checkpointing \--max_train_steps15000 \--learning_rate1e-05 \--max_grad_norm1 \--lr_schedulerconstant --lr_warmup_steps0 \--output_dirsd-pokemon-model推理脚本
import torch
from diffusers import StableDiffusionPipelinemodel_path sd-pokemon-model
pipe StableDiffusionPipeline.from_pretrained(model_path, torch_dtypetorch.float16)
pipe.to(cuda)image pipe(prompta drawing of a pokemon stuffed animal,num_inference_steps50).images[0]
image.save(yoda-pokemon.png)LORA微调
数据格式 同full Fine Tune 训练脚本
export MODEL_NAMEstable-diffusion-2
export DATASET_NAMEpokemon-blip-captionsaccelerate launch --mixed_precisionno train_lora.py \--pretrained_model_name_or_path$MODEL_NAME \--dataset_name$DATASET_NAME --caption_columntext \--resolution768 --random_flip \--train_batch_size2 \--num_train_epochs100 --checkpointing_steps5000 \--learning_rate1e-04 --lr_schedulerconstant --lr_warmup_steps0 \--seed42 \--output_dirsd-pokemon-model-lora \--validation_promptcute dragon creature推理脚本
from diffusers import StableDiffusionPipeline
import torchmodel_path sd-pokemon-model-lora/checkpoint-10000
pipe StableDiffusionPipeline.from_pretrained(stable-diffusion-2, torch_dtypetorch.float16)
pipe.load_lora_weights(model_path)
pipe.to(cuda)prompt A pokemon with green eyes and red legs.
image pipe(prompt, num_inference_steps30, guidance_scale7.5).images[0]
image.save(pokemon.png)