深度学习 Diffusers 库(自留)

(本文将围绕 安装Diffusers库及其依赖、理解Diffusers核心概念:Pipeline, Model, Scheduler 、使用预训练模型进行推理(文生图、图生图等) 、 自定义模型和调度器 、训练自己的扩散模型(可选,需要大量资源)、以及高级应用:ControlNet、LoRA等进行展开)

官网链接:huggingface

镜像链接:mirror

一、安装Diffusers库

Diffusers 已在 Python 3.8+、PyTorch 1.7.0+ 和 Flax 上进行了测试。请按照以下适用于您正在使用的 Deep Learning Library 的安装说明进行作:

# 使用 conda 安装
# 激活虚拟环境后,使用 (由社区维护):conda
conda install -c conda-forge diffusers
# 从源码安装
# 在从源安装 🤗 Diffusers 之前,请确保您已安装 PyTorch 和 🤗 Accelerate。
# 要安装 🤗 Accelerate:
pip install accelerate
# 然后从源码安装 🤗 Diffusers:
pip install git+https://github.com/huggingface/diffusers可编辑安装
git clone https://github.com/huggingface/diffusers.git
cd diffusers克隆更新到最新版本的 🤗 Diffusers:
cd ~/diffusers/
git pull

      此命令将安装最前沿版本,而不是最新版本。 该版本有助于及时了解最新发展。 例如,如果自上次正式发布以来已修复错误,但尚未推出新版本。 但是,这意味着版本可能并不总是稳定的。 我们努力保持版本可运行,大多数问题通常会在几小时或一天内得到解决。 如果您遇到问题,请打开https://github.com/huggingface/diffusers/issues/new/choose

二、模型文件和布局

     扩散模型以各种文件类型保存,并按不同的布局进行组织。Diffusers 将模型权重作为 safetensors 文件存储在 Diffusers-multifolder 布局中,它还支持从 diffusion 生态系统中常用的单文件布局加载文件(如 safetensors 和 ckpt 文件)。每种布局都有自己的优点和用例,本指南将向您展示如何加载不同的文件和布局,以及如何转换它们。

1. Safetensors 库

Safetensors 是一种安全快速的文件格式,用于安全地存储和加载张量。Safetensors 限制 header 大小以限制某些类型的攻击,支持延迟加载(对分布式设置很有用),并且通常具有更快的加载速度。

# 确保已安装 Safetensors 库。
!pip install safetensors

     Diffusers 库是 Hugging Face 官方开发的 开源 Python 库,专门用于简化扩散模型(Diffusion Models)的部署与应用。

  1. Diffusers-multifolder 布局:可能有几个单独的 safetensors 文件,每个管道组件(文本编码器、UNet、VAE)一个,组织在子文件夹中(查看 stable-diffusion-v1-5/stable-diffusion-v1-5 存储库作为示例)
  2. 单文件布局:所有模型权重都可以保存在一个文件中(查看 WarriorMama777/OrangeMixs 存储库作为示例)

2.LoRA 文件

LoRA 是一种轻量级适配器,训练快速且易于,因此在以某种方式或样式生成图像方面特别受欢迎。这些适配器通常存储在 safetensors 文件中,并且在 civitai 等模型共享平台上广泛流行。LoRA 使用 load_lora_weights() 方法加载到基础模型中。

from diffusers import StableDiffusionXLPipeline
import torch# base model
pipeline = StableDiffusionXLPipeline.from_pretrained("Lykon/dreamshaper-xl-1-0", torch_dtype=torch.float16, variant="fp16"
).to("cuda")# download LoRA weights
!wget https://civitai.com/api/download/models/168776 -O blueprintify.safetensors# load LoRA weights
pipeline.load_lora_weights(".", weight_name="blueprintify.safetensors")
prompt = "bl3uprint, a highly detailed blueprint of the empire state building, explaining how to build all parts, many txt, blueprint grid backdrop"
negative_prompt = "lowres, cropped, worst quality, low quality, normal quality, artifacts, signature, watermark, username, blurry, more than one bridge, bad architecture"image = pipeline(prompt=prompt,negative_prompt=negative_prompt,generator=torch.manual_seed(0),
).images[0]
image

 3.CKPT

PyTorch 的 torch.save 函数使用 Python 的 pickle 实用程序来序列化和保存模型。这些文件保存为 ckpt 文件,并且包含整个模型的权重。

使用 from_single_file() 方法直接加载 ckpt 文件。

from diffusers import StableDiffusionPipelinepipeline = StableDiffusionPipeline.from_single_file("https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/blob/main/v1-5-pruned.ckpt"
)

4.存储布局

有两种方式组织模型文件,一种是 Diffusers-multifolder 布局,另一种是单文件布局。Diffusers-multifolder 布局是默认布局,每个组件文件(文本编码器、UNet、VAE)都存储在单独的子文件夹中。Diffusers 还支持从单文件布局加载模型,其中所有组件都捆绑在一起。

Diffusers-multifolder

Diffusers-multifolder 布局是 Diffusers 的默认存储布局。每个组件(文本编码器、UNet、VAE)的权重都存储在单独的子文件夹中。权重可以存储为 safetensors 或 ckpt 文件。

要从 Diffusers-multifolder 布局加载,请使用 from_pretrained() 方法。

from diffusers import DiffusionPipelinepipeline = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0",torch_dtype=torch.float16,variant="fp16",use_safetensors=True,
).to("cuda")

使用 Diffusers-multifolder 布局的好处包括:

  1. 单独或并行加载每个组件文件的速度更快。

  2. 减少了内存使用量,因为您只加载了所需的组件。例如,SDXL Turbo、SDXL Lightning 和 Hyper-SD 等型号除 UNet 外具有相同的组件。您可以使用 from_pipe() 方法重用它们的共享组件,而无需消耗任何额外的内存(请查看 重用管道指南),并且只加载 UNet。这样,您就不需要下载冗余组件,也无需不必要地使用更多内存。

import torch
from diffusers import StableDiffusionXLPipeline, UNet2DConditionModel, EulerDiscreteScheduler# download one model
sdxl_pipeline = StableDiffusionXLPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0",torch_dtype=torch.float16,variant="fp16",use_safetensors=True,
).to("cuda")# switch UNet for another model
unet = UNet2DConditionModel.from_pretrained("stabilityai/sdxl-turbo",subfolder="unet",torch_dtype=torch.float16,variant="fp16",use_safetensors=True
)
# reuse all the same components in new model except for the UNet
turbo_pipeline = StableDiffusionXLPipeline.from_pipe(sdxl_pipeline, unet=unet,
).to("cuda")
turbo_pipeline.scheduler = EulerDiscreteScheduler.from_config(turbo_pipeline.scheduler.config,timestep+spacing="trailing"
)
image = turbo_pipeline("an astronaut riding a unicorn on mars",num_inference_steps=1,guidance_scale=0.0,
).images[0]
image

三、 理解Diffusers核心概念

Pipeline, Model, Scheduler

 核心功能全景

功能实例代码示例
文生图输入“星空下的城堡” → 生成高清图像pipe("星空下的城堡").images[0]
图生图将照片转为梵高风格pipe(image=输入图, prompt="梵高风格")
图像修复智能补全破损老照片inpaint_pipeline(mask=蒙版, image=原图)
视频生成生成 3 秒动画片段video_pipe("跳舞的机器人", num_frames=24)
音频合成文本转自然语音audio_pipe("你好,世界", output_type="mp3")

  核心概念速查表

概念说明代码示例
Pipeline端到端生成流程StableDiffusionPipeline
Scheduler控制扩散过程EulerDiscreteScheduler
Model核心神经网络UNet2DConditionModel
VAE图像编码/解码AutoencoderKL
Tokenizer文本处理CLIPTokenizer

3. 使用预训练模型进行推理(文生图、图生图等)

4. 自定义模型和调度器

5. 训练自己的扩散模型(可选,需要大量资源)

6. 高级应用:ControlNet、LoRA等