跳转至

控制网

译者:片刻小哥哥

项目地址:https://huggingface.apachecn.org/docs/diffusers/training/controlnet

原始地址:https://huggingface.co/docs/diffusers/training/controlnet

向文本到图像扩散模型添加条件控制 (ControlNet) 作者:Lvmin 张和 Maneesh Agrawala。

这个例子是基于 原始 ControlNet 存储库中的训练示例 。它使用以下方法训练 ControlNet 来填充圆圈 小型合成数据集

安装依赖项

在运行脚本之前,请确保安装库的训练依赖项。

要成功运行示例脚本的最新版本,我们强烈建议 从源安装 并使安装保持最新。我们经常更新示例脚本并安装特定于示例的要求。

为此,请在新的虚拟环境中执行以下步骤:

git clone https://github.com/huggingface/diffusers
cd diffusers
pip install -e .

然后导航到 示例文件夹

cd examples/controlnet

现在运行:

pip install -r requirements.txt

并初始化一个 🤗加速 环境:

accelerate config

或者对于默认的🤗加速配置而不回答有关您的环境的问题:

accelerate config default

或者,如果您的环境不支持笔记本等交互式 shell:

from accelerate.utils import write_basic_config

write_basic_config()

圆形填充数据集

原始数据集托管在 ControlNet 中 回购 ,但我们重新上传了它 此处 与🤗数据集兼容,以便它可以处理训练脚本中的数据加载。

我们的训练示例使用 runwayml/stable-diffusion-v1-5 因为这就是原始 ControlNet 模型集的训练内容。然而,ControlNet 可以经过训练来增强任何兼容的稳定扩散模型(例如 CompVis/stable-diffusion-v1-4 ) 或者 stabilityai/stable-diffusion-2-1

要使用您自己的数据集,请查看 创建训练数据集 指导。

训练

下载以下图像来调节我们的训练:

wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_1.png

wget https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/controlnet_training/conditioning_image_2.png

指定 型号_名称 环境变量(集线器模型存储库 ID 或包含模型权重的目录的路径)并将其传递给 pretrained_model_name_or_path 争论。

训练脚本创建并保存 diffusion_pytorch_model.bin 文件在您的存储库中。

export MODEL_DIR="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="path to save model"

accelerate launch train_controlnet.py  --pretrained_model_name_or_path=$MODEL\_DIR  --output_dir=$OUTPUT\_DIR  --dataset_name=fusing/fill50k  --resolution=512  --learning_rate=1e-5  --validation_image "./conditioning\_image\_1.png" "./conditioning\_image\_2.png"  --validation_prompt "red circle with blue background" "cyan circle with brown floral background"  --train_batch_size=4  --push_to_hub

此默认配置需要 ~38GB VRAM。

默认情况下,训练脚本将输出记录到张量板。经过 --report_to wandb 使用权重 & 偏见。

具有较小批量大小的梯度累积可用于将训练要求降低至约 20 GB VRAM。

export MODEL_DIR="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="path to save model"

accelerate launch train_controlnet.py  --pretrained_model_name_or_path=$MODEL\_DIR  --output_dir=$OUTPUT\_DIR  --dataset_name=fusing/fill50k  --resolution=512  --learning_rate=1e-5  --validation_image "./conditioning\_image\_1.png" "./conditioning\_image\_2.png"  --validation_prompt "red circle with blue background" "cyan circle with brown floral background"  --train_batch_size=1  --gradient_accumulation_steps=4   --push_to_hub

使用多个 GPU 进行训练

‘加速’ 允许无缝的多 GPU 训练。按照说明操作 此处 用于运行分布式训练 ‘加速’ 。这是一个示例命令:

export MODEL_DIR="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="path to save model"

accelerate launch --mixed_precision="fp16" --multi_gpu train_controlnet.py  --pretrained_model_name_or_path=$MODEL\_DIR  --output_dir=$OUTPUT\_DIR  --dataset_name=fusing/fill50k  --resolution=512  --learning_rate=1e-5  --validation_image "./conditioning\_image\_1.png" "./conditioning\_image\_2.png"  --validation_prompt "red circle with blue background" "cyan circle with brown floral background"  --train_batch_size=4  --mixed_precision="fp16"  --tracker_project_name="controlnet-demo"  --report_to=wandb   --push_to_hub

结果示例

批量大小为 8 的 300 个步骤后

red circle with blue background
conditioning image red circle with blue background
cyan circle with brown floral background
conditioning image cyan circle with brown floral background

批量大小为 8 的 6000 步后:

red circle with blue background
conditioning image red circle with blue background
cyan circle with brown floral background
conditioning image cyan circle with brown floral background

在 16 GB GPU 上训练

启用以下优化以在 16GB GPU 上进行训练:

现在您可以启动训练脚本:

export MODEL_DIR="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="path to save model"

accelerate launch train_controlnet.py  --pretrained_model_name_or_path=$MODEL\_DIR  --output_dir=$OUTPUT\_DIR  --dataset_name=fusing/fill50k  --resolution=512  --learning_rate=1e-5  --validation_image "./conditioning\_image\_1.png" "./conditioning\_image\_2.png"  --validation_prompt "red circle with blue background" "cyan circle with brown floral background"  --train_batch_size=1  --gradient_accumulation_steps=4  --gradient_checkpointing  --use_8bit_adam   --push_to_hub

在 12 GB GPU 上训练

启用以下优化以在 12GB GPU 上进行训练:

export MODEL_DIR="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="path to save model"

accelerate launch train_controlnet.py  --pretrained_model_name_or_path=$MODEL\_DIR  --output_dir=$OUTPUT\_DIR  --dataset_name=fusing/fill50k  --resolution=512  --learning_rate=1e-5  --validation_image "./conditioning\_image\_1.png" "./conditioning\_image\_2.png"  --validation_prompt "red circle with blue background" "cyan circle with brown floral background"  --train_batch_size=1  --gradient_accumulation_steps=4  --gradient_checkpointing  --use_8bit_adam  --enable_xformers_memory_efficient_attention  --set_grads_to_none   --push_to_hub

使用时 enable_xformers_memory_efficient_attention ,请确保安装 xformers 经过 pip 安装 xformers

在 8 GB GPU 上训练

我们尚未详尽测试 DeepSpeed 对 ControlNet 的支持。虽然配置确实 节省内存,我们还没有确认配置训练是否成功。你很可能会 必须更改配置才能成功运行训练。

启用以下优化以在 8GB GPU 上进行训练:

DeepSpeed 可以将张量从 VRAM 卸载到 CPU 或 NVME。这需要更多的 RAM(大约 25 GB)。

您必须配置您的环境 加速配置 启用 DeepSpeed 第 2 阶段。

配置文件应如下所示:

compute\_environment: LOCAL\_MACHINE
deepspeed\_config:
  gradient\_accumulation\_steps: 4
  offload\_optimizer\_device: cpu
  offload\_param\_device: cpu
  zero3\_init\_flag: false
  zero\_stage: 2
distributed\_type: DEEPSPEED

文档 了解更多 DeepSpeed 配置选项。

将默认 Adam 优化器更改为 DeepSpeed 的 Adam deepspeed.ops.adam.DeepSpeedCPUAdam 给出了显着的加速但是 它需要与 PyTorch 版本相同的 CUDA 工具链。 8位优化器 目前似乎与 DeepSpeed 不兼容。

export MODEL_DIR="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="path to save model"

accelerate launch train_controlnet.py  --pretrained_model_name_or_path=$MODEL\_DIR  --output_dir=$OUTPUT\_DIR  --dataset_name=fusing/fill50k  --resolution=512  --validation_image "./conditioning\_image\_1.png" "./conditioning\_image\_2.png"  --validation_prompt "red circle with blue background" "cyan circle with brown floral background"  --train_batch_size=1  --gradient_accumulation_steps=4  --gradient_checkpointing  --enable_xformers_memory_efficient_attention  --set_grads_to_none  --mixed_precision fp16  --push_to_hub

推理

经过训练的模型可以使用以下命令运行 StableDiffusionControlNetPipeline 。 放 基本模型路径控制网络路径 到价值观 --pretrained_model_name_or_path--output_dir 分别在训练脚本中设置为。

from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler
from diffusers.utils import load_image
import torch

base_model_path = "path to model"
controlnet_path = "path to controlnet"

controlnet = ControlNetModel.from_pretrained(controlnet_path, torch_dtype=torch.float16, use_safetensors=True)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    base_model_path, controlnet=controlnet, torch_dtype=torch.float16, use_safetensors=True
)

# speed up diffusion process with faster scheduler and memory optimization
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
# remove following line if xformers is not installed
pipe.enable_xformers_memory_efficient_attention()

pipe.enable_model_cpu_offload()

control_image = load_image("./conditioning\_image\_1.png")
prompt = "pale golden rod circle with old lace background"

# generate image
generator = torch.manual_seed(0)
image = pipe(prompt, num_inference_steps=20, generator=generator, image=control_image).images[0]

image.save("./output.png")

稳定扩散XL

训练与 稳定扩散XL 还通过以下方式支持 train_controlnet_sdxl.py 脚本。请参考文档 此处


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组