# UNet

某些训练方法（例如 LoRA 和 Custom Diffusion）通常针对 UNet 的注意力层，但这些方法也可以针对其他非注意力层。与训练模型的所有参数不同，这里只训练参数的一部分，因此速度更快、效率更高。如果您*仅*向 UNet 加载权重，则此类非常有用。如果需要向文本编码器或文本编码器与 UNet 加载权重，请改用 [load_lora_weights()](/docs/diffusers/v0.43.0/zh/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.load_lora_weights) 函数。

`UNet2DConditionLoadersMixin` 类提供了用于加载和保存权重、融合和取消融合 LoRA、禁用和启用 LoRA，以及设置和删除适配器的函数。

> [!TIP]
> 要了解如何加载 LoRA 权重，请参阅 [LoRA](../../tutorials/using_peft_for_inference) 指南。

## UNet2DConditionLoadersMixin[[diffusers.loaders.UNet2DConditionLoadersMixin]]

#### diffusers.loaders.UNet2DConditionLoadersMixin[[diffusers.loaders.UNet2DConditionLoadersMixin]]

```python
diffusers.loaders.UNet2DConditionLoadersMixin()
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/unet.py#L53)

将 LoRA 层加载到 `UNet2DCondtionModel` 中。

#### load_attn_procs[[diffusers.loaders.UNet2DConditionLoadersMixin.load_attn_procs]]

```python
load_attn_procs(pretrained_model_name_or_path_or_dict: str | dict[str, torch.Tensor], **kwargs)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/unet.py#L61)

**参数：**

pretrained_model_name_or_path_or_dict (`str` 或 `os.PathLike` 或 `dict`)：可以是以下之一： - 一个字符串，即托管在 Hub 上的预训练模型的模型 ID（例如 `google/ddpm-celebahq-256`）。 - 一个目录的路径（例如 `./my_model_directory`），其中包含使用 [ModelMixin.save_pretrained()](/docs/diffusers/v0.43.0/zh/api/models/overview#diffusers.ModelMixin.save_pretrained) 保存的模型权重。 - 一个 [torch state dict](https://pytorch.org/tutorials/beginner/saving_loading_models.html#what-is-a-state-dict)。

cache_dir (`str | os.PathLike`，*可选*)：如果未使用标准缓存，则已下载的预训练模型配置将缓存到的目录路径。

force_download (`bool`，*可选*，默认为 `False`)：是否强制（重新）下载模型权重和配置文件，如果存在缓存版本则覆盖它们。

proxies (`dict[str, str]`，*可选*)：一个字典，用于按协议或端点指定要使用的代理服务器，例如 `{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`。每次请求都会使用这些代理。

local_files_only (`bool`，*可选*，默认为 `False`)：是否仅加载本地模型权重和配置文件。如果设置为 `True`，则不会从 Hub 下载模型。

token (`str` 或 *bool*，*可选*) : 用于远程文件的 HTTP 承载者授权令牌。如果为 `True`，则使用由 `diffusers-cli login` 生成的令牌（存储在 `~/.huggingface` 中）。

revision (`str`，*可选*，默认为 `"main"`)：要使用的特定模型版本。它可以是分支名称、标签名称、提交 ID，或 Git 允许的任何标识符。

subfolder (`str`，*可选*，默认为 `""`)：模型文件在 Hub 或本地的大型模型仓库中的子文件夹位置。

weight_name (`str`，*可选*，默认为 None)：序列化状态字典文件的名称。

将预训练的 Custom Diffusion 注意力处理器层加载到 [UNet2DConditionModel](/docs/diffusers/v0.43.0/zh/api/models/unet2d-cond#diffusers.UNet2DConditionModel) 中。注意力处理器层必须在 [`attention_processor.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py) 中定义，并且是一个 `torch.nn.Module` 类。若要加载 LoRA 层，请改用 [load_lora_adapter()](/docs/diffusers/v0.43.0/zh/api/loaders/peft#diffusers.loaders.PeftAdapterMixin.load_lora_adapter)。

示例：

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    torch_dtype=torch.float16,
).to("cuda")
pipeline.unet.load_attn_procs("path-to-save-model", weight_name="pytorch_custom_diffusion_weights.bin")
```

#### save_attn_procs[[diffusers.loaders.UNet2DConditionLoadersMixin.save_attn_procs]]

```python
save_attn_procs(save_directory: str | os.PathLike, is_main_process: bool = True, weight_name: str = None, save_function: typing.Callable = None, safe_serialization: bool = True, **kwargs)
```

[源代码](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/unet.py#L252)

**参数：**

save_directory (`str` 或 `os.PathLike`)：用于保存注意力处理器的目录（如果该目录不存在，则会自动创建）。

is_main_process (`bool`，*可选*，默认为 `True`)：调用此函数的进程是否为主进程。在分布式训练期间，如果需要在所有进程上调用此函数，此参数非常有用。在这种情况下，仅在将 `is_main_process=True` 设置为主进程时，以避免竞态条件。

save_function (`Callable`) : 用于保存状态字典的函数。在分布式训练期间，当您需要用其他方法替换 `torch.save` 时非常有用。可通过环境变量 `DIFFUSERS_SAVE_MODE` 进行配置。

safe_serialization (`bool`，*可选*，默认为 `True`)：是否使用 `safetensors` 而非 `pickle` 来保存模型。

将自定义 Diffusion 注意力处理器层保存到目录中，以便使用 [load_attn_procs()](/docs/diffusers/v0.43.0/zh/api/loaders/unet#diffusers.loaders.UNet2DConditionLoadersMixin.load_attn_procs) 方法重新加载。若要保存 LoRA 层，请改用 [save_lora_adapter()](/docs/diffusers/v0.43.0/zh/api/loaders/peft#diffusers.loaders.PeftAdapterMixin.save_lora_adapter)。

示例：

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    torch_dtype=torch.float16,
).to("cuda")
pipeline.unet.load_attn_procs("path-to-save-model", weight_name="pytorch_custom_diffusion_weights.bin")
pipeline.unet.save_attn_procs("path-to-save-model", weight_name="pytorch_custom_diffusion_weights.bin")
```

