Buckets:

mishig's picture
|
download
raw
13.3 kB
# 模型格式
扩散模型通常以 Diffusers 格式或单文件格式存储。模型文件可以保存为多种文件类型,例如 safetensors 或 ckpt。
> [!TIP]
> Format 指的是权重是否以目录结构存储。File type 指的是这些权重的序列化方式,例如 safetensors 或 ckpt。
```text
Diffusers format Single-file format
model/ model.safetensors (or .ckpt)
├─ model_index.json └─ all components in one file
├─ unet/ (or transformer/)
├─ text_encoder/
├─ vae/
└─ scheduler/
```
本指南将向您展示如何从这些格式和文件中加载管道和模型。
## Diffusers 格式
Diffusers 格式将每个模型(UNet、transformer、text encoder)分别存储在独立的子文件夹中。这种分离存储方式具有多项优势。
- 整体流水线初始化速度更快,因为您可以加载所需的单个模型,或者并行加载所有模型。
- 由于您只需加载一个模型,因此无需加载所有流水线组件,从而降低了内存使用量。[复用](./loading#reusing-models-in-multiple-pipelines)在多个流水线之间共享的模型。
- 由于多个流水线共享的通用模型只需下载一次,因此存储需求更低。
- 在流水线中使用新模型或改进模型的灵活性。
## 单文件格式
单文件格式将*所有*模型权重(UNet、transformer、text encoder)存储在单个文件中。单文件格式的优点包括:
- 与 [ComfyUI](https://github.com/comfyanonymous/ComfyUI) 或 [Automatic1111](https://github.com/AUTOMATIC1111/stable-diffusion-webui) 具有更高的兼容性。
- 下载和共享单个文件更加便捷。
使用 [from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) 加载单个文件。
```py
import torch
from diffusers import StableDiffusionXLPipeline
pipeline = StableDiffusionXLPipeline.from_single_file(
"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/blob/main/sd_xl_base_1.0.safetensors",
dtype=torch.float16,
device_map="cuda" # or "mps", "xpu", "cpu"
)
```
[from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) 方法还支持传入新的模型或调度器。
```py
import torch
from diffusers import FluxPipeline, FluxTransformer2DModel
transformer = FluxTransformer2DModel.from_single_file(
"https://huggingface.co/Kijai/flux-fp8/blob/main/flux1-dev-fp8.safetensors", dtype=torch.bfloat16
)
pipeline = FluxPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev",
transformer=transformer,
dtype=torch.bfloat16,
device_map="cuda" # or "mps", "xpu", "cpu"
)
```
### 配置选项
Diffusers 格式的模型在其仓库中包含一个 `config.json` 文件,其中包含层数和注意力头数量等重要属性。[from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) 方法会自动从 `config.json` 中确定要使用的合适配置。不过,在少数罕见情况下这可能会失败,此时应使用 `config` 参数。
如果流水线中的模型与原始实现不同,或者缺少确定正确配置所需的元数据,您也应该使用 `config` 参数。
```py
from diffusers import StableDiffusionXLPipeline
ckpt_path = "https://huggingface.co/segmind/SSD-1B/blob/main/SSD-1B.safetensors"
pipeline = StableDiffusionXLPipeline.from_single_file(ckpt_path, config="segmind/SSD-1B")
```
当传入 `original_config` 并设置 `local_files_only=True` 时,Diffusers 会根据 pipeline 类的签名推断 pipeline 组件。它不会从 Hub 下载配置文件,从而避免在离线时出现破坏性变更。与为 `config` 提供本地模型路径相比,这种方式可靠性较低,且可能会报错。如果之后需要离线使用,请运行一次 `local_files_only=False`,以便将配置文件保存到本地缓存中。
通过直接将参数传递给 [from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) 来覆盖默认配置。以下示例展示了如何在流水线或模型中覆盖配置。
```py
from diffusers import StableDiffusionXLInstructPix2PixPipeline
ckpt_path = "https://huggingface.co/stabilityai/cosxl/blob/main/cosxl_edit.safetensors"
pipeline = StableDiffusionXLInstructPix2PixPipeline.from_single_file(
ckpt_path, config="diffusers/sdxl-instructpix2pix-768", is_cosxl_edit=True
)
```
```py
from diffusers import UNet2DConditionModel
ckpt_path = "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/blob/main/sd_xl_base_1.0_0.9vae.safetensors"
model = UNet2DConditionModel.from_single_file(ckpt_path, upcast_attention=True)
```
### 本地文件
[from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) 方法会尝试通过推断检查点文件中的键来配置流水线或模型。例如,任何基于 Stable Diffusion XL 基础模型的单文件检查点都会从 [stabilityai/stable-diffusion-xl-base-1.0](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0) 进行配置。
如果你正在处理本地文件,请使用 [snapshot_download](https://huggingface.co/docs/huggingface_hub/v2.4.0/en/package_reference/file_download#huggingface_hub.snapshot_download) 方法下载配置文件,并使用 [hf_hub_download](https://huggingface.co/docs/huggingface_hub/v2.4.0/en/package_reference/file_download#huggingface_hub.hf_hub_download) 下载模型检查点。这些文件会下载到你的 [缓存目录](https://huggingface.co/docs/huggingface_hub/en/guides/manage-cache) 中,但你可以通过 `local_dir` 参数将它们下载到指定目录。
```py
from huggingface_hub import hf_hub_download, snapshot_download
from diffusers import StableDiffusionXLPipeline
my_local_checkpoint_path = hf_hub_download(
repo_id="segmind/SSD-1B",
filename="SSD-1B.safetensors"
)
my_local_config_path = snapshot_download(
repo_id="segmind/SSD-1B",
allow_patterns=["*.json", "**/*.json", "*.txt", "**/*.txt"]
)
pipeline = StableDiffusionXLPipeline.from_single_file(
my_local_checkpoint_path, config=my_local_config_path, local_files_only=True
)
```
### 符号链接
如果您使用的文件系统不支持符号链接,请先使用 `local_dir` 参数将检查点文件下载到本地目录。使用 `local_dir` 参数会自动禁用符号链接。
```py
from huggingface_hub import hf_hub_download, snapshot_download
from diffusers import StableDiffusionXLPipeline
my_local_checkpoint_path = hf_hub_download(
repo_id="segmind/SSD-1B",
filename="SSD-1B.safetensors",
local_dir="my_local_checkpoints",
)
print("My local checkpoint: ", my_local_checkpoint_path)
my_local_config_path = snapshot_download(
repo_id="segmind/SSD-1B",
allow_patterns=["*.json", "**/*.json", "*.txt", "**/*.txt"]
)
print("My local config: ", my_local_config_path)
```
将这些路径传递给 [from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file)。
```py
pipeline = StableDiffusionXLPipeline.from_single_file(
my_local_checkpoint_path, config=my_local_config_path, local_files_only=True
)
```
## 文件类型
模型可以存储为多种文件类型。Safetensors 是最常见的文件类型,但您可能会在 Hub 或扩散模型社区中遇到其他文件类型。
### safetensors
[Safetensors](https://hf.co/docs/safetensors) 是一种安全且快速的文件类型,用于安全地存储和加载张量。它通过限制头部大小来防范某些类型的攻击,支持延迟加载(在分布式环境中非常有用),并且通常加载速度更快。
如果存在 safetensors 文件且已安装 Safetensors 库,Diffusers 默认会加载 safetensors 文件(这是一个必需的依赖项)。
Use [from_pretrained()](/docs/diffusers/v0.43.0/zh/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) or [from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) to load safetensor files.
```py
import torch
from diffusers import DiffusionPipeline, StableDiffusionXLPipeline
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.float16,
device_map="cuda", # or "mps", "xpu", "cpu"
)
pipeline = StableDiffusionXLPipeline.from_single_file(
"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/blob/main/sd_xl_base_1.0.safetensors",
dtype=torch.float16,
)
```
如果您使用的是通过 Diffusers 训练脚本训练的 checkpoint,诸如 LoRA 配置之类的元数据会自动保存。加载该文件时,系统会解析这些元数据,从而正确配置 LoRA。您可以点击 Hub 上文件旁边的 图标来查看 safetensors 文件的元数据。
对于未使用 Diffusers 训练的 checkpoint,可通过将其传递给 [save_lora_weights()](/docs/diffusers/v0.43.0/zh/api/loaders/lora#diffusers.loaders.FluxLoraLoaderMixin.save_lora_weights) 来保存 LoRA 适配器元数据。transformer 使用 `transformer_lora_adapter_metadata`,文本编码器使用 `text_encoder_lora_adapter_metadata`。您还必须传递 `save_directory` 以及 `transformer_lora_layers` 或 `text_encoder_lora_layers` 中的至少一个。此路径仅支持 safetensors 文件。
```py
import torch
from peft.utils import get_peft_model_state_dict
from diffusers import FluxPipeline
pipeline = FluxPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)
pipeline.load_lora_weights("linoyts/yarn_art_Flux_LoRA")
transformer_lora_layers = get_peft_model_state_dict(pipeline.transformer)
pipeline.save_lora_weights(
save_directory="path/to/lora",
transformer_lora_layers=transformer_lora_layers,
transformer_lora_adapter_metadata={"r": 8, "lora_alpha": 8},
)
```
### ckpt
旧版模型权重通常使用 Python 的 [pickle](https://docs.python.org/3/library/pickle.html) 工具保存在 ckpt 文件中。
Pickled 文件可能不安全,因为它们可能被利用来执行恶意代码。建议使用 safetensors 文件,或将权重转换为 safetensors 文件。
使用 [from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) 加载 ckpt 文件。
```py
from diffusers import StableDiffusionPipeline
pipeline = StableDiffusionPipeline.from_single_file(
"https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/blob/main/v1-5-pruned.ckpt"
)
```
### GGUF
GGUF 将预量化权重存储在单个文件中。Diffusers 通过模型的 [from_single_file()](/docs/diffusers/v0.43.0/zh/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) 方法并结合 [GGUFQuantizationConfig](/docs/diffusers/v0.43.0/zh/api/quantization#diffusers.GGUFQuantizationConfig) 来加载 GGUF。不支持在 Pipeline 层面加载 GGUF。
有关安装步骤和完整示例,请参阅 [GGUF](../quantization/gguf)。
```py
import torch
from diffusers import FluxTransformer2DModel, GGUFQuantizationConfig
transformer = FluxTransformer2DModel.from_single_file(
"https://huggingface.co/city96/FLUX.1-dev-gguf/blob/main/flux1-dev-Q2_K.gguf",
quantization_config=GGUFQuantizationConfig(compute_dtype=torch.bfloat16),
)
```
## 转换格式和文件
Diffusers 提供了脚本和方法,用于转换格式和文件,以便扩散生态系统中的更多工具能够使用它们。
请查看 [diffusers/scripts](https://github.com/huggingface/diffusers/tree/main/scripts) 文件夹以查找转换脚本。文件名末尾带有 `"to_diffusers"` 的脚本用于将模型转换为 Diffusers 格式。每个脚本都有一套特定的参数用于配置转换过程。请务必检查可用的参数。
下面的示例将存储在 Diffusers 格式中的模型转换为单文件格式。请提供要转换的模型的路径以及保存转换后模型的位置。您可以选择性地指定保存模型的文件类型和数据类型。
```bash
python convert_diffusers_to_original_sdxl.py --model_path path/to/model/to/convert --checkpoint_path path/to/save/model/to --use_safetensors
```
[save_pretrained()](/docs/diffusers/v0.43.0/zh/api/pipelines/overview#diffusers.DiffusionPipeline.save_pretrained) 方法同样会以 Diffusers 格式保存模型,并负责为每个模型创建子文件夹。默认情况下,它会将文件保存为 safetensor 文件。
```py
from diffusers import StableDiffusionXLPipeline
pipeline = StableDiffusionXLPipeline.from_single_file(
"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/blob/main/sd_xl_base_1.0.safetensors",
)
pipeline.save_pretrained("path/to/save/model")
```
## 后续步骤
- 有关设计决策以及为何在保存和加载模型权重时优先使用 safetensor 文件的更多信息,请参阅博客文章 [经过审计,Safetensors 确实安全,并成为默认选项](https://blog.eleuther.ai/safetensors-security-audit/)。

Xet Storage Details

Size:
13.3 kB
·
Xet hash:
21c9327f50793f5bfd7dca13893cb3e21f8b00949bc505df99b6849f7d088a01

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.