From 5bfe4728ecdc2653fec8d17a055c1f9bb7f15a66 Mon Sep 17 00:00:00 2001 From: SamYuan1990 Date: Thu, 31 Jul 2025 21:08:02 +0800 Subject: [PATCH 1/7] try to use deepseek with an agent to auto i18n to zh Signed-off-by: SamYuan1990 --- .../zh/conceptual/ethical_guidelines.md | 56 +++ docs/source/zh/conceptual/philosophy.md | 104 +++++ docs/source/zh/optimization/fp16.md | 307 +++++++++++++++ docs/source/zh/optimization/onnx.md | 82 ++++ docs/source/zh/optimization/xformers.md | 32 ++ docs/source/zh/training/controlnet.md | 366 ++++++++++++++++++ docs/source/zh/training/dreambooth.md | 329 ++++++++++++++++ docs/source/zh/training/lora.md | 231 +++++++++++ docs/source/zh/training/overview.md | 60 +++ docs/source/zh/training/text2image.md | 275 +++++++++++++ docs/source/zh/training/text_inversion.md | 296 ++++++++++++++ docs/source/zh/using-diffusers/schedulers.md | 256 ++++++++++++ 12 files changed, 2394 insertions(+) create mode 100644 docs/source/zh/conceptual/ethical_guidelines.md create mode 100644 docs/source/zh/conceptual/philosophy.md create mode 100644 docs/source/zh/optimization/fp16.md create mode 100644 docs/source/zh/optimization/onnx.md create mode 100644 docs/source/zh/optimization/xformers.md create mode 100644 docs/source/zh/training/controlnet.md create mode 100644 docs/source/zh/training/dreambooth.md create mode 100644 docs/source/zh/training/lora.md create mode 100644 docs/source/zh/training/overview.md create mode 100644 docs/source/zh/training/text2image.md create mode 100644 docs/source/zh/training/text_inversion.md create mode 100644 docs/source/zh/using-diffusers/schedulers.md diff --git a/docs/source/zh/conceptual/ethical_guidelines.md b/docs/source/zh/conceptual/ethical_guidelines.md new file mode 100644 index 000000000000..1fbd956e30be --- /dev/null +++ b/docs/source/zh/conceptual/ethical_guidelines.md @@ -0,0 +1,56 @@ + + +# 🧨 Diffusers伦理准则 + +## 前言 + +[Diffusers](https://huggingface.co/docs/diffusers/index)不仅提供预训练的扩散模型,还是一个模块化工具箱,支持推理和训练功能。 + +鉴于该技术在实际场景中的应用及其可能对社会产生的负面影响,我们认为有必要制定项目伦理准则,以指导Diffusers库的开发、用户贡献和使用规范。 + +该技术涉及的风险仍在持续评估中,主要包括但不限于:艺术家版权问题、深度伪造滥用、不当情境下的色情内容生成、非自愿的人物模仿、以及加剧边缘群体压迫的有害社会偏见。我们将持续追踪风险,并根据社区反馈动态调整本准则。 + +## 适用范围 + +Diffusers社区将在项目开发中贯彻以下伦理准则,并协调社区贡献的整合方式,特别是在涉及伦理敏感议题的技术决策时。 + +## 伦理准则 + +以下准则具有普遍适用性,但我们主要在处理涉及伦理敏感问题的技术决策时实施。同时,我们承诺将根据技术发展带来的新兴风险持续调整这些原则: + +- **透明度**:我们承诺以透明方式管理PR(拉取请求),向用户解释决策依据,并公开技术选择过程。 + +- **一致性**:我们承诺为用户提供统一标准的项目管理,保持技术稳定性和连贯性。 + +- **简洁性**:为了让Diffusers库更易使用和开发,我们承诺保持项目目标精简且逻辑自洽。 + +- **可及性**:本项目致力于降低贡献门槛,即使非技术人员也能参与运营,从而使研究资源更广泛地服务于社区。 + +- **可复现性**:对于通过Diffusers库发布的上游代码、模型和数据集,我们将明确说明其可复现性。 + +- **责任性**:作为社区和团队,我们共同承担用户责任,通过风险预判和缓解措施来应对技术潜在危害。 + +## 实施案例:安全功能与机制 + +团队持续开发技术和非技术工具,以应对扩散技术相关的伦理与社会风险。社区反馈对于功能实施和风险意识提升具有不可替代的价值: + +- [**社区讨论区**](https://huggingface.co/docs/hub/repositories-pull-requests-discussions):促进社区成员就项目开展协作讨论。 + +- **偏见探索与评估**:Hugging Face团队提供[交互空间](https://huggingface.co/spaces/society-ethics/DiffusionBiasExplorer)展示Stable Diffusion中的偏见。我们支持并鼓励此类偏见探索与评估工作。 + +- **部署安全强化**: + + - [**Safe Stable Diffusion**](https://huggingface.co/docs/diffusers/main/en/api/pipelines/stable_diffusion/stable_diffusion_safe):解决Stable Diffusion等基于未过滤网络爬取数据训练的模型容易产生不当内容的问题。相关论文:[安全潜在扩散:缓解扩散模型中的不当退化](https://huggingface.co/papers/2211.05105)。 + + - [**安全检测器**](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/safety_checker.py):通过比对图像生成后嵌入空间中硬编码有害概念集的类别概率进行检测。有害概念列表经特殊处理以防逆向工程。 + +- **分阶段模型发布**:对于高度敏感的仓库,采用分级访问控制。这种阶段性发布机制让作者能更好地管控使用场景。 + +- **许可证制度**:采用新型[OpenRAILs](https://huggingface.co/blog/open_rail)许可协议,在保障开放访问的同时设置使用限制以确保更负责任的应用。 diff --git a/docs/source/zh/conceptual/philosophy.md b/docs/source/zh/conceptual/philosophy.md new file mode 100644 index 000000000000..4d7baa34d17b --- /dev/null +++ b/docs/source/zh/conceptual/philosophy.md @@ -0,0 +1,104 @@ + + +# 设计哲学 + +🧨 Diffusers 提供**最先进**的预训练扩散模型支持多模态任务。 +其目标是成为推理和训练通用的**模块化工具箱**。 + +我们致力于构建一个经得起时间考验的库,因此对API设计极为重视。 + +简而言之,Diffusers 被设计为 PyTorch 的自然延伸。因此,我们的多数设计决策都基于 [PyTorch 设计原则](https://pytorch.org/docs/stable/community/design.html#pytorch-design-philosophy)。以下是核心原则: + +## 可用性优先于性能 + +- 尽管 Diffusers 包含众多性能优化特性(参见[内存与速度优化](https://huggingface.co/docs/diffusers/optimization/fp16)),模型默认总是以最高精度和最低优化级别加载。因此除非用户指定,扩散流程(pipeline)默认在CPU上以float32精度初始化。这确保了跨平台和加速器的可用性,意味着运行本库无需复杂安装。 +- Diffusers 追求**轻量化**,仅有少量必需依赖,但提供诸多可选依赖以提升性能(如`accelerate`、`safetensors`、`onnx`等)。我们竭力保持库的轻量级特性,使其能轻松作为其他包的依赖项。 +- Diffusers 偏好简单、自解释的代码而非浓缩的"魔法"代码。这意味着lambda函数等简写语法和高级PyTorch操作符通常不被采用。 + +## 简洁优于简易 + +正如PyTorch所言:**显式优于隐式**,**简洁优于复杂**。这一哲学体现在库的多个方面: +- 我们遵循PyTorch的API设计,例如使用[`DiffusionPipeline.to`](https://huggingface.co/docs/diffusers/main/en/api/diffusion_pipeline#diffusers.DiffusionPipeline.to)让用户自主管理设备。 +- 明确的错误提示优于静默纠正错误输入。Diffusers 旨在教育用户,而非单纯降低使用难度。 +- 暴露复杂的模型与调度器(scheduler)交互逻辑而非内部魔法处理。调度器/采样器与扩散模型分离且相互依赖最小化,迫使用户编写展开的去噪循环。但这种分离便于调试,并赋予用户更多控制权来调整去噪过程或切换模型/调度器。 +- 扩散流程中独立训练的组件(如文本编码器、UNet、变分自编码器)各有专属模型类。这要求用户处理组件间交互,且序列化格式将组件分存不同文件。但此举便于调试和定制,得益于组件分离,DreamBooth或Textual Inversion训练变得极为简单。 + +## 可定制与贡献友好优于抽象 + +库的大部分沿用了[Transformers库](https://github.com/huggingface/transformers)的重要设计原则:宁要重复代码,勿要仓促抽象。这一原则与[DRY原则](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)形成鲜明对比。 + +简言之,正如Transformers对建模文件的做法,Diffusers对流程(pipeline)和调度器(scheduler)保持极低抽象度与高度自包含代码。函数、长代码块甚至类可能在多文件中重复,初看像是糟糕的松散设计。但该设计已被Transformers证明极其成功,对社区驱动的开源机器学习库意义重大: +- 机器学习领域发展迅猛,范式、模型架构和算法快速迭代,难以定义长效代码抽象。 +- ML从业者常需快速修改现有代码进行研究,因此偏好自包含代码而非多重抽象。 +- 开源库依赖社区贡献,必须构建易于参与的代码库。抽象度越高、依赖越复杂、可读性越差,贡献难度越大。过度抽象的库会吓退贡献者。若贡献不会破坏核心功能,不仅吸引新贡献者,也更便于并行审查和修改。 + +Hugging Face称此设计为**单文件政策**——即某个类的几乎所有代码都应写在单一自包含文件中。更多哲学探讨可参阅[此博文](https://huggingface.co/blog/transformers-design-philosophy)。 + +Diffusers对流程和调度器完全遵循该哲学,但对扩散模型仅部分适用。原因在于多数扩散流程(如[DDPM](https://huggingface.co/docs/diffusers/api/pipelines/ddpm)、[Stable Diffusion](https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/overview#stable-diffusion-pipelines)、[unCLIP (DALL·E 2)](https://huggingface.co/docs/diffusers/api/pipelines/unclip)和[Imagen](https://imagen.research.google/))都基于相同扩散模型——[UNet](https://huggingface.co/docs/diffusers/api/models/unet2d-cond)。 + +现在您应已理解🧨 Diffusers的设计理念🤗。我们力求在全库贯彻这些原则,但仍存在少数例外或欠佳设计。如有反馈,我们❤️欢迎在[GitHub提交](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=&template=feedback.md&title=)。 + +## 设计哲学细节 + +现在深入探讨设计细节。Diffusers主要包含三类:[流程(pipeline)](https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines)、[模型](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models)和[调度器(scheduler)](https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers)。以下是各类的具体设计决策。 + +### 流程(Pipelines) + +流程设计追求易用性(因此不完全遵循[*简洁优于简易*](#简洁优于简易)),不要求功能完备,应视为使用[模型](#模型)和[调度器](#调度器schedulers)进行推理的示例。 + +遵循原则: +- 采用单文件政策。所有流程位于src/diffusers/pipelines下的独立目录。一个流程文件夹对应一篇扩散论文/项目/发布。如[`src/diffusers/pipelines/stable-diffusion`](https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines/stable_diffusion)可包含多个流程文件。若流程功能相似,可使用[# Copied from机制](https://github.com/huggingface/diffusers/blob/125d783076e5bd9785beb05367a2d2566843a271/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py#L251)。 +- 所有流程继承[`DiffusionPipeline`]。 +- 每个流程由不同模型和调度器组件构成,这些组件记录于[`model_index.json`文件](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/blob/main/model_index.json),可通过同名属性访问,并可用[`DiffusionPipeline.components`](https://huggingface.co/docs/diffusers/main/en/api/diffusion_pipeline#diffusers.DiffusionPipeline.components)在流程间共享。 +- 所有流程应能通过[`DiffusionPipeline.from_pretrained`](https://huggingface.co/docs/diffusers/main/en/api/diffusion_pipeline#diffusers.DiffusionPipeline.from_pretrained)加载。 +- 流程**仅**用于推理。 +- 流程代码应具备高可读性、自解释性和易修改性。 +- 流程应设计为可相互构建,便于集成到高层API。 +- 流程**非**功能完备的用户界面。完整UI推荐[InvokeAI](https://github.com/invoke-ai/InvokeAI)、[Diffuzers](https://github.com/abhishekkrthakur/diffuzers)或[lama-cleaner](https://github.com/Sanster/lama-cleaner)。 +- 每个流程应通过唯一的`__call__`方法运行,且参数命名应跨流程统一。 +- 流程应以其解决的任务命名。 +- 几乎所有新扩散流程都应在新文件夹/文件中实现。 + +### 模型 + +模型设计为可配置的工具箱,是[PyTorch Module类](https://pytorch.org/docs/stable/generated/torch.nn.Module.html)的自然延伸,仅部分遵循**单文件政策**。 + +遵循原则: +- 模型对应**特定架构类型**。如[`UNet2DConditionModel`]类适用于所有需要2D图像输入且受上下文调节的UNet变体。 +- 所有模型位于[`src/diffusers/models`](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models),每种架构应有独立文件,如[`unets/unet_2d_condition.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/unets/unet_2d_condition.py)、[`transformers/transformer_2d.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformers/transformer_2d.py)等。 +- 模型**不**采用单文件政策,应使用小型建模模块如[`attention.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention.py)、[`resnet.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/resnet.py)、[`embeddings.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/embeddings.py)等。**注意**:这与Transformers的建模文件截然不同,表明模型未完全遵循单文件政策。 +- 模型意图暴露复杂度(类似PyTorch的`Module`类),并提供明确错误提示。 +- 所有模型继承`ModelMixin`和`ConfigMixin`。 +- 当不涉及重大代码变更、保持向后兼容性且显著提升内存/计算效率时,可对模型进行性能优化。 +- 模型默认应具备最高精度和最低性能设置。 +- 若新模型检查点可归类为现有架构,应适配现有架构而非新建文件。仅当架构根本性不同时才创建新文件。 +- 模型设计应便于未来扩展。可通过限制公开函数参数、配置参数和"预见"变更实现。例如:优先采用可扩展的`string`类型参数而非布尔型`is_..._type`参数。对现有架构的修改应保持最小化。 +- 模型设计需在代码可读性与多检查点支持间权衡。多数情况下应适配现有类,但某些例外(如[UNet块](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/unets/unet_2d_blocks.py)和[注意力处理器](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py))需新建类以保证长期可读性。 + +### 调度器(Schedulers) + +调度器负责引导推理去噪过程及定义训练噪声计划。它们设计为独立的可加载配置类,严格遵循**单文件政策**。 + +遵循原则: +- 所有调度器位于[`src/diffusers/schedulers`](https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers)。 +- 调度器**禁止**从大型工具文件导入,必须保持高度自包含。 +- 一个调度器Python文件对应一种算法(如论文定义的算法)。 +- 若调度器功能相似,可使用`# Copied from`机制。 +- 所有调度器继承`SchedulerMixin`和`ConfigMixin`。 +- 调度器可通过[`ConfigMixin.from_config`](https://huggingface.co/docs/diffusers/main/en/api/configuration#diffusers.ConfigMixin.from_config)轻松切换(详见[此处](../using-diffusers/schedulers))。 +- 每个调度器必须包含`set_num_inference_steps`和`step`函数。在每次去噪过程前(即调用`step(...)`前)必须调用`set_num_inference_steps(...)`。 +- 每个调度器通过`timesteps`属性暴露需要"循环"的时间步,这是模型将被调用的时间步数组。 +- `step(...)`函数接收模型预测输出和"当前"样本(x_t),返回"前一个"略去噪的样本(x_t-1)。 +- 鉴于扩散调度器的复杂性,`step`函数不暴露全部细节,可视为"黑盒"。 +- 几乎所有新调度器都应在新文件中实现。 \ No newline at end of file diff --git a/docs/source/zh/optimization/fp16.md b/docs/source/zh/optimization/fp16.md new file mode 100644 index 000000000000..408316229855 --- /dev/null +++ b/docs/source/zh/optimization/fp16.md @@ -0,0 +1,307 @@ + + +# 加速推理 + +扩散模型在推理时速度较慢,因为生成是一个迭代过程,需要经过一定数量的"步数"逐步将噪声细化为图像或视频。要加速这一过程,您可以尝试使用不同的[调度器](../api/schedulers/overview)、降低模型权重的精度以加快计算、使用更高效的内存注意力机制等方法。 + +将这些技术组合使用,可以比单独使用任何一种技术获得更快的推理速度。 + +本指南将介绍如何加速推理。 + +## 模型数据类型 + +模型权重的精度和数据类型会影响推理速度,因为更高的精度需要更多内存来加载,也需要更多时间进行计算。PyTorch默认以float32或全精度加载模型权重,因此更改数据类型是快速获得更快推理速度的简单方法。 + + + + +bfloat16与float16类似,但对数值误差更稳健。硬件对bfloat16的支持各不相同,但大多数现代GPU都能支持bfloat16。 + +```py +import torch +from diffusers import StableDiffusionXLPipeline + +pipeline = StableDiffusionXLPipeline.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.bfloat16 +).to("cuda") + +prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" +pipeline(prompt, num_inference_steps=30).images[0] +``` + + + + +float16与bfloat16类似,但可能更容易出现数值误差。 + +```py +import torch +from diffusers import StableDiffusionXLPipeline + +pipeline = StableDiffusionXLPipeline.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16 +).to("cuda") + +prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" +pipeline(prompt, num_inference_steps=30).images[0] +``` + + + + +[TensorFloat-32 (tf32)](https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/)模式在NVIDIA Ampere GPU上受支持,它以tf32计算卷积和矩阵乘法运算。存储和其他操作保持在float32。与bfloat16或float16结合使用时,可以显著加快计算速度。 + +PyTorch默认仅对卷积启用tf32模式,您需要显式启用矩阵乘法的tf32模式。 + +```py +import torch +from diffusers import StableDiffusionXLPipeline + +torch.backends.cuda.matmul.allow_tf32 = True + +pipeline = StableDiffusionXLPipeline.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.bfloat16 +).to("cuda") + +prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" +pipeline(prompt, num_inference_steps=30).images[0] +``` + +更多详情请参阅[混合精度训练](https://huggingface.co/docs/transformers/en/perf_train_gpu_one#mixed-precision)文档。 + + + + +## 缩放点积注意力 + +> [!TIP] +> 内存高效注意力优化了推理速度*和*[内存使用](./memory#memory-efficient-attention)! + +[缩放点积注意力(SDPA)](https://pytorch.org/docs/stable/generated/torch.nn.functional.scaled_dot_product_attention.html)实现了多种注意力后端,包括[FlashAttention](https://github.com/Dao-AILab/flash-attention)、[xFormers](https://github.com/facebookresearch/xformers)和原生C++实现。它会根据您的硬件自动选择最优的后端。 + +如果您使用的是PyTorch >= 2.0,SDPA默认启用,无需对代码进行任何额外更改。不过,您也可以尝试使用其他注意力后端来自行选择。下面的示例使用[torch.nn.attention.sdpa_kernel](https://pytorch.org/docs/stable/generated/torch.nn.attention.sdpa_kernel.html)上下文管理器来启用高效注意力。 + +```py +from torch.nn.attention import SDPBackend, sdpa_kernel +import torch +from diffusers import StableDiffusionXLPipeline + +pipeline = StableDiffusionXLPipeline.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.bfloat16 +).to("cuda") + +prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" + +with sdpa_kernel(SDPBackend.EFFICIENT_ATTENTION): + image = pipeline(prompt, num_inference_steps=30).images[0] +``` + +## torch.compile + +[torch.compile](https://pytorch.org/tutorials/intermediate/torch_compile_tutorial.html)通过将PyTorch代码和操作编译为优化的内核来加速推理。Diffusers通常会编译计算密集型的模型,如UNet、transformer或VAE。 + +启用以下编译器设置以获得最大速度(更多选项请参阅[完整列表](https://github.com/pytorch/pytorch/blob/main/torch/_inductor/config.py))。 + +```py +import torch +from diffusers import StableDiffusionXLPipeline + +torch._inductor.config.conv_1x1_as_mm = True +torch._inductor.config.coordinate_descent_tuning = True +torch._inductor.config.epilogue_fusion = False +torch._inductor.config.coordinate_descent_check_all_directions = True +``` + +加载并编译UNet和VAE。有几种不同的模式可供选择,但`"max-autotune"`通过编译为CUDA图来优化速度。CUDA图通过单个CPU操作启动多个GPU操作,有效减少了开销。 + +> [!TIP] +> 在PyTorch 2.3.1中,您可以控制torch.compile的缓存行为。这对于像`"max-autotune"`这样的编译模式特别有用,它会通过网格搜索多个编译标志来找到最优配置。更多详情请参阅[torch.compile中的编译时间缓存](https://pytorch.org/tutorials/recipes/torch_compile_caching_tutorial.html)教程。 + +将内存布局更改为[channels_last](./memory#torchchannels_last)也可以优化内存和推理速度。 + +```py +pipeline = StableDiffusionXLPipeline.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16 +).to("cuda") +pipeline.unet.to(memory_format=torch.channels_last) +pipeline.vae.to(memory_format=torch.channels_last) +pipeline.unet = torch.compile( + pipeline.unet, mode="max-autotune", fullgraph=True +) +pipeline.vae.decode = torch.compile( + pipeline.vae.decode, + mode="max-autotune", + fullgraph=True +) + +prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" +pipeline(prompt, num_inference_steps=30).images[0] +``` + +第一次编译时速度较慢,但一旦编译完成,速度会显著提升。尽量只在相同类型的推理操作上使用编译后的管道。在不同尺寸的图像上调用编译后的管道会重新触发编译,这会很慢且效率低下。 + +### 动态形状编译 + +> [!TIP] +> 确保始终使用PyTorch的nightly版本以获得更好的支持。 + +`torch.compile`会跟踪输入形状和条件,如果这些不同,它会重新编译模型。例如,如果模型是在1024x1024分辨率的图像上编译的,而在不同分辨率的图像上使用,就会触发重新编译。 + +为避免重新编译,添加`dynamic=True`以尝试生成更动态的内核,避免条件变化时重新编译。 + +```diff ++ torch.fx.experimental._config.use_duck_shape = False ++ pipeline.unet = torch.compile( + pipeline.unet, fullgraph=True, dynamic=True +) +``` + +指定`use_duck_shape=False`会指示编译器是否应使用相同的符号变量来表示相同大小的输入。更多详情请参阅此[评论](https://github.com/huggingface/diffusers/pull/11327#discussion_r2047659790)。 + +并非所有模型都能开箱即用地从动态编译中受益,可能需要更改。参考此[PR](https://github.com/huggingface/diffusers/pull/11297/),它改进了[`AuraFlowPipeline`]的实现以受益于动态编译。 + +如果动态编译对Diffusers模型的效果不如预期,请随时提出问题。 + +### 区域编译 + +[区域编译](https://docs.pytorch.org/tutorials/recipes/regional_compilation.html)通过仅编译模型中*小而频繁重复的块*(通常是transformer层)来减少冷启动延迟,并为每个后续出现的块重用编译后的工件。对于许多扩散架构,这提供了与全图编译相同的运行时加速,并将编译时间减少了8-10倍。 + +使用[`~ModelMixin.compile_repeated_blocks`]方法(一个包装`torch.compile`的辅助函数)在任何组件(如transformer模型)上,如下所示。 + +```py +# pip install -U diffusers +import torch +from diffusers import StableDiffusionXLPipeline + +pipeline = StableDiffusionXLPipeline.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", + torch_dtype=torch.float16, +).to("cuda") + +# 仅编译UNet中重复的transformer层 +pipeline.unet.compile_repeated_blocks(fullgraph=True) +``` + +要为新模型启用区域编译,请在模型类中添加一个`_repeated_blocks`属性,包含您想要编译的块的类名(作为字符串)。 + +```py +class MyUNet(ModelMixin): + _repeated_blocks = ("Transformer2DModel",) # ← 默认编译 +``` + +> [!TIP] +> 更多区域编译示例,请参阅参考[PR](https://github.com/huggingface/diffusers/pull/11705)。 + +[Accelerate](https://huggingface.co/docs/accelerate/index)中还有一个[compile_regions](https://github.com/huggingface/accelerate/blob/273799c85d849a1954a4f2e65767216eb37fa089/src/accelerate/utils/other.py#L78)方法,可以自动选择模型中的候选块进行编译。其余图会单独编译。这对于快速实验很有用,因为您不需要设置哪些块要编译或调整编译标志。 + +```py +# pip install -U accelerate +import torch +from diffusers import StableDiffusionXLPipeline +from accelerate.utils import compile regions + +pipeline = StableDiffusionXLPipeline.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16 +).to("cuda") +pipeline.unet = compile_regions(pipeline.unet, mode="reduce-overhead", fullgraph=True) +``` + +[`~ModelMixin.compile_repeated_blocks`]是故意显式的。在`_repeated_blocks`中列出要重复的块,辅助函数仅编译这些块。它提供了可预测的行为,并且只需一行代码即可轻松推理缓存重用。 + +### 图中断 + +在torch.compile中指定`fullgraph=True`非常重要,以确保底层模型中没有图中断。这使您可以充分利用torch.compile而不会降低性能。对于UNet和VAE,这会改变您访问返回变量的方式。 + +```diff +- latents = unet( +- latents, timestep=timestep, encoder_hidden_states=prompt_embeds +-).sample + ++ latents = unet( ++ latents, timestep=timestep, encoder_hidden_states=prompt_embeds, return_dict=False ++)[0] +``` + +### GPU同步 + +每次去噪器做出预测后,调度器的`step()`函数会被[调用](https://github.com/huggingface/diffusers/blob/1d686bac8146037e97f3fd8c56e4063230f71751/src/diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py#L1228),并且`sigmas`变量会被[索引](https://github.com/huggingface/diffusers/blob/1d686bac8146037e97f3fd8c56e4063230f71751/src/diffusers/schedulers/scheduling_euler_discrete.py#L476)。当放在GPU上时,这会引入延迟,因为CPU和GPU之间需要进行通信同步。当去噪器已经编译时,这一点会更加明显。 + +一般来说,`sigmas`应该[保持在CPU上](https://github.com/huggingface/diffusers/blob/35a969d297cba69110d175ee79c59312b9f49e1e/src/diffusers/schedulers/scheduling_euler_discrete.py#L240),以避免通信同步和延迟。 + + + +参阅[torch.compile和Diffusers:峰值性能实践指南](https://pytorch.org/blog/torch-compile-and-diffusers-a-hands-on-guide-to-peak-performance/)博客文章,了解如何为扩散模型最大化`torch.compile`的性能。 + + + +### 基准测试 + +参阅[diffusers/benchmarks](https://huggingface.co/datasets/diffusers/benchmarks)数据集,查看编译管道的推理延迟和内存使用数据。 + +[diffusers-torchao](https://github.com/sayakpaul/diffusers-torchao#benchmarking-results)仓库还包含Flux和CogVideoX编译版本的基准测试结果。 + +## 动态量化 + +[动态量化](https://pytorch.org/tutorials/recipes/recipes/dynamic_quantization.html)通过降低精度以加快数学运算来提高推理速度。这种特定类型的量化在运行时根据数据确定如何缩放激活,而不是使用固定的缩放因子。因此,缩放因子与数据更准确地匹配。 + +以下示例使用[torchao](../quantization/torchao)库对UNet和VAE应用[动态int8量化](https://pytorch.org/tutorials/recipes/recipes/dynamic_quantization.html)。 + +> [!TIP] +> 参阅我们的[torchao](../quantization/torchao)文档,了解更多关于如何使用Diffusers torchao集成的信息。 + +配置编译器标志以获得最大速度。 + +```py +import torch +from torchao import apply_dynamic_quant +from diffusers import StableDiffusionXLPipeline + +torch._inductor.config.conv_1x1_as_mm = True +torch._inductor.config.coordinate_descent_tuning = True +torch._inductor.config.epilogue_fusion = False +torch._inductor.config.coordinate_descent_check_all_directions = True +torch._inductor.config.force_fuse_int_mm_with_mul = True +torch._inductor.config.use_mixed_mm = True +``` + +使用[dynamic_quant_filter_fn](https://github.com/huggingface/diffusion-fast/blob/0f169640b1db106fe6a479f78c1ed3bfaeba3386/utils/pipeline_utils.py#L16)过滤掉UNet和VAE中一些不会从动态量化中受益的线性层。 + +```py +pipeline = StableDiffusionXLPipeline.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.bfloat16 +).to("cuda") + +apply_dynamic_quant(pipeline.unet, dynamic_quant_filter_fn) +apply_dynamic_quant(pipeline.vae, dynamic_quant_filter_fn) + +prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" +pipeline(prompt, num_inference_steps=30).images[0] +``` + +## 融合投影矩阵 + +> [!WARNING] +> [fuse_qkv_projections](https://github.com/huggingface/diffusers/blob/58431f102cf39c3c8a569f32d71b2ea8caa461e1/src/diffusers/pipelines/pipeline_utils.py#L2034)方法是实验性的,目前主要支持Stable Diffusion管道。参阅此[PR](https://github.com/huggingface/diffusers/pull/6179)了解如何为其他管道启用它。 + +在注意力块中,输入被投影到三个子空间,分别由投影矩阵Q、K和V表示。这些投影通常单独计算,但您可以水平组合这些矩阵为一个矩阵,并在单步中执行投影。这会增加输入投影的矩阵乘法大小,并提高量化的效果。 + +```py +pipeline.fuse_qkv_projections() +``` + +## 资源 + +- 阅读[Presenting Flux Fast: Making Flux go brrr on H100s](https://pytorch.org/blog/presenting-flux-fast-making-flux-go-brrr-on-h100s/)博客文章,了解如何结合所有这些优化与[TorchInductor](https://docs.pytorch.org/docs/stable/torch.compiler.html)和[AOTInductor](https://docs.pytorch.org/docs/stable/torch.compiler_aot_inductor.html),使用[flux-fast](https://github.com/huggingface/flux-fast)的配方获得约2.5倍的加速。 + + 这些配方支持AMD硬件和[Flux.1 Kontext Dev](https://huggingface.co/black-forest-labs/FLUX.1-Kontext-dev)。 +- 阅读[torch.compile和Diffusers:峰值性能实践指南](https://pytorch.org/blog/torch-compile-and-diffusers-a-hands-on-guide-to-peak-performance/)博客文章,了解如何在使用`torch.compile`时最大化性能。 diff --git a/docs/source/zh/optimization/onnx.md b/docs/source/zh/optimization/onnx.md new file mode 100644 index 000000000000..4b3804d01500 --- /dev/null +++ b/docs/source/zh/optimization/onnx.md @@ -0,0 +1,82 @@ + + +# ONNX Runtime + +🤗 [Optimum](https://github.com/huggingface/optimum) 提供了兼容 ONNX Runtime 的 Stable Diffusion 流水线。您需要运行以下命令安装支持 ONNX Runtime 的 🤗 Optimum: + +```bash +pip install -q optimum["onnxruntime"] +``` + +本指南将展示如何使用 ONNX Runtime 运行 Stable Diffusion 和 Stable Diffusion XL (SDXL) 流水线。 + +## Stable Diffusion + +要加载并运行推理,请使用 [`~optimum.onnxruntime.ORTStableDiffusionPipeline`]。若需加载 PyTorch 模型并实时转换为 ONNX 格式,请设置 `export=True`: + +```python +from optimum.onnxruntime import ORTStableDiffusionPipeline + +model_id = "stable-diffusion-v1-5/stable-diffusion-v1-5" +pipeline = ORTStableDiffusionPipeline.from_pretrained(model_id, export=True) +prompt = "sailing ship in storm by Leonardo da Vinci" +image = pipeline(prompt).images[0] +pipeline.save_pretrained("./onnx-stable-diffusion-v1-5") +``` + + + +当前批量生成多个提示可能会占用过高内存。在问题修复前,建议采用迭代方式而非批量处理。 + + + +如需离线导出 ONNX 格式流水线供后续推理使用,请使用 [`optimum-cli export`](https://huggingface.co/docs/optimum/main/en/exporters/onnx/usage_guides/export_a_model#exporting-a-model-to-onnx-using-the-cli) 命令: + +```bash +optimum-cli export onnx --model stable-diffusion-v1-5/stable-diffusion-v1-5 sd_v15_onnx/ +``` + +随后进行推理时(无需再次指定 `export=True`): + +```python +from optimum.onnxruntime import ORTStableDiffusionPipeline + +model_id = "sd_v15_onnx" +pipeline = ORTStableDiffusionPipeline.from_pretrained(model_id) +prompt = "sailing ship in storm by Leonardo da Vinci" +image = pipeline(prompt).images[0] +``` + +
+ +
+ +您可以在 🤗 Optimum [文档](https://huggingface.co/docs/optimum/) 中找到更多示例,Stable Diffusion 支持文生图、图生图和图像修复任务。 + +## Stable Diffusion XL + +要加载并运行 SDXL 推理,请使用 [`~optimum.onnxruntime.ORTStableDiffusionXLPipeline`]: + +```python +from optimum.onnxruntime import ORTStableDiffusionXLPipeline + +model_id = "stabilityai/stable-diffusion-xl-base-1.0" +pipeline = ORTStableDiffusionXLPipeline.from_pretrained(model_id) +prompt = "sailing ship in storm by Leonardo da Vinci" +image = pipeline(prompt).images[0] +``` + +如需导出 ONNX 格式流水线供后续推理使用,请运行: + +```bash +optimum-cli export onnx --model stabilityai/stable-diffusion-xl-base-1.0 --task stable-diffusion-xl sd_xl_onnx/ +``` + +SDXL 的 ONNX 格式目前支持文生图和图生图任务。 diff --git a/docs/source/zh/optimization/xformers.md b/docs/source/zh/optimization/xformers.md new file mode 100644 index 000000000000..9902feeee662 --- /dev/null +++ b/docs/source/zh/optimization/xformers.md @@ -0,0 +1,32 @@ + + +# xFormers + +我们推荐在推理和训练过程中使用[xFormers](https://github.com/facebookresearch/xformers)。在我们的测试中,其对注意力模块的优化能同时提升运行速度并降低内存消耗。 + +通过`pip`安装xFormers: + +```bash +pip install xformers +``` + + + +xFormers的`pip`安装包需要最新版本的PyTorch。如需使用旧版PyTorch,建议[从源码安装xFormers](https://github.com/facebookresearch/xformers#installing-xformers)。 + + + +安装完成后,您可调用`enable_xformers_memory_efficient_attention()`来实现更快的推理速度和更低的内存占用,具体用法参见[此章节](memory#memory-efficient-attention)。 + + + +根据[此问题](https://github.com/huggingface/diffusers/issues/2234#issuecomment-1416931212)反馈,xFormers `v0.0.16`版本在某些GPU上无法用于训练(微调或DreamBooth)。如遇此问题,请按照该issue评论区指引安装开发版本。 + + \ No newline at end of file diff --git a/docs/source/zh/training/controlnet.md b/docs/source/zh/training/controlnet.md new file mode 100644 index 000000000000..11eaf3501076 --- /dev/null +++ b/docs/source/zh/training/controlnet.md @@ -0,0 +1,366 @@ + + +# ControlNet + +[ControlNet](https://hf.co/papers/2302.05543) 是一种基于预训练模型的适配器架构。它通过额外输入的条件图像(如边缘检测图、深度图、人体姿态图等),实现对生成图像的精细化控制。 + +在显存有限的GPU上训练时,建议启用训练命令中的 `gradient_checkpointing`(梯度检查点)、`gradient_accumulation_steps`(梯度累积步数)和 `mixed_precision`(混合精度)参数。还可使用 [xFormers](../optimization/xformers) 的内存高效注意力机制进一步降低显存占用。虽然JAX/Flax训练支持在TPU和GPU上高效运行,但不支持梯度检查点和xFormers。若需通过Flax加速训练,建议使用显存大于30GB的GPU。 + +本指南将解析 [train_controlnet.py](https://github.com/huggingface/diffusers/blob/main/examples/controlnet/train_controlnet.py) 训练脚本,帮助您理解其逻辑并适配自定义需求。 + +运行脚本前,请确保从源码安装库: + +```bash +git clone https://github.com/huggingface/diffusers +cd diffusers +pip install . +``` + +然后进入包含训练脚本的示例目录,安装所需依赖: + + + +```bash +cd examples/controlnet +pip install -r requirements.txt +``` + + + +若可访问TPU设备,Flax训练脚本将运行得更快!以下是在 [Google Cloud TPU VM](https://cloud.google.com/tpu/docs/run-calculation-jax) 上的配置流程。创建单个TPU v4-8虚拟机并连接: + +```bash +ZONE=us-central2-b +TPU_TYPE=v4-8 +VM_NAME=hg_flax + +gcloud alpha compute tpus tpu-vm create $VM_NAME \ + --zone $ZONE \ + --accelerator-type $TPU_TYPE \ + --version tpu-vm-v4-base + +gcloud alpha compute tpus tpu-vm ssh $VM_NAME --zone $ZONE -- \ +``` + +安装JAX 0.4.5: + +```bash +pip install "jax[tpu]==0.4.5" -f https://storage.googleapis.com/jax-releases/libtpu_releases.html +``` + +然后安装Flax脚本的依赖: + +```bash +cd examples/controlnet +pip install -r requirements_flax.txt +``` + + + + + + +🤗 Accelerate 是一个支持多GPU/TPU训练和混合精度的库,它能根据硬件环境自动配置训练方案。参阅 🤗 Accelerate [快速入门](https://huggingface.co/docs/accelerate/quicktour) 了解更多。 + + + +初始化🤗 Accelerate环境: + +```bash +accelerate config +``` + +若要创建默认配置(不进行交互式选择): + +```bash +accelerate config default +``` + +若环境不支持交互式shell(如notebook),可使用: + +```py +from accelerate.utils import write_basic_config + +write_basic_config() +``` + +最后,如需训练自定义数据集,请参阅 [创建训练数据集](create_dataset) 指南了解数据准备方法。 + + + +下文重点解析脚本中的关键模块,但不会覆盖所有实现细节。如需深入了解,建议直接阅读 [脚本源码](https://github.com/huggingface/diffusers/blob/main/examples/controlnet/train_controlnet.py),如有疑问欢迎反馈。 + + + +## 脚本参数 + +训练脚本提供了丰富的可配置参数,所有参数及其说明详见 [`parse_args()`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L231) 函数。虽然该函数已为每个参数提供默认值(如训练批大小、学习率等),但您可以通过命令行参数覆盖这些默认值。 + +例如,使用fp16混合精度加速训练: + +```bash +accelerate launch train_controlnet.py \ + --mixed_precision="fp16" +``` + +基础参数说明可参考 [文生图](text2image#script-parameters) 训练指南,此处重点介绍ControlNet相关参数: + +- `--max_train_samples`: 训练样本数量,减少该值可加快训练,但对超大数据集需配合 `--streaming` 参数使用 +- `--gradient_accumulation_steps`: 梯度累积步数,通过分步计算实现显存受限情况下的更大批次训练 + +### Min-SNR加权策略 + +[Min-SNR](https://huggingface.co/papers/2303.09556) 加权策略通过重新平衡损失函数加速模型收敛。虽然训练脚本支持预测 `epsilon`(噪声)或 `v_prediction`,但Min-SNR对两种预测类型均兼容。该策略仅适用于PyTorch版本,Flax训练脚本暂不支持。 + +推荐值设为5.0: + +```bash +accelerate launch train_controlnet.py \ + --snr_gamma=5.0 +``` + +## 训练脚本 + +与参数说明类似,训练流程的通用解析可参考 [文生图](text2image#training-script) 指南。此处重点分析ControlNet特有的实现。 + +脚本中的 [`make_train_dataset`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L582) 函数负责数据预处理,除常规的文本标注分词和图像变换外,还包含条件图像的特效处理: + + + +在TPU上流式加载数据集时,🤗 Datasets库可能成为性能瓶颈(因其未针对图像数据优化)。建议考虑 [WebDataset](https://webdataset.github.io/webdataset/)、[TorchData](https://github.com/pytorch/data) 或 [TensorFlow Datasets](https://www.tensorflow.org/datasets/tfless_tfds) 等高效数据格式。 + + + +```py +conditioning_image_transforms = transforms.Compose( + [ + transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR), + transforms.CenterCrop(args.resolution), + transforms.ToTensor(), + ] +) +``` + +在 [`main()`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L713) 函数中,代码会加载分词器、文本编码器、调度器和模型。此处也是ControlNet模型的加载点(支持从现有权重加载或从UNet随机初始化): + +```py +if args.controlnet_model_name_or_path: + logger.info("Loading existing controlnet weights") + controlnet = ControlNetModel.from_pretrained(args.controlnet_model_name_or_path) +else: + logger.info("Initializing controlnet weights from unet") + controlnet = ControlNetModel.from_unet(unet) +``` + +[优化器](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L871) 专门针对ControlNet参数进行更新: + +```py +params_to_optimize = controlnet.parameters() +optimizer = optimizer_class( + params_to_optimize, + lr=args.learning_rate, + betas=(args.adam_beta1, args.adam_beta2), + weight_decay=args.adam_weight_decay, + eps=args.adam_epsilon, +) +``` + +在 [训练循环](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L943) 中,条件文本嵌入和图像被输入到ControlNet的下采样和中层模块: + +```py +encoder_hidden_states = text_encoder(batch["input_ids"])[0] +controlnet_image = batch["conditioning_pixel_values"].to(dtype=weight_dtype) + +down_block_res_samples, mid_block_res_sample = controlnet( + noisy_latents, + timesteps, + encoder_hidden_states=encoder_hidden_states, + controlnet_cond=controlnet_image, + return_dict=False, +) +``` + +若想深入理解训练循环机制,可参阅 [理解管道、模型与调度器](../using-diffusers/write_own_pipeline) 教程,该教程详细解析了去噪过程的基本原理。 + +## 启动训练 + +现在可以启动训练脚本了!🚀 + +本指南使用 [fusing/fill50k](https://huggingface.co/datasets/fusing/fill50k) 数据集,当然您也可以按照 [创建训练数据集](create_dataset) 指南准备自定义数据。 + +设置环境变量 `MODEL_NAME` 为Hub模型ID或本地路径,`OUTPUT_DIR` 为模型保存路径。 + +下载训练用的条件图像: + +```bash +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 +``` + +根据GPU型号,可能需要启用特定优化。默认配置需要约38GB显存。若使用多GPU训练,请在 `accelerate launch` 命令中添加 `--multi_gpu` 参数。 + + + + +16GB显卡可使用bitsandbytes 8-bit优化器和梯度检查点: + +```py +pip install bitsandbytes +``` + +训练命令添加以下参数: + +```bash +accelerate launch train_controlnet.py \ + --gradient_checkpointing \ + --use_8bit_adam \ +``` + + + + +12GB显卡需组合使用bitsandbytes 8-bit优化器、梯度检查点、xFormers,并将梯度置为None而非0: + +```bash +accelerate launch train_controlnet.py \ + --use_8bit_adam \ + --gradient_checkpointing \ + --enable_xformers_memory_efficient_attention \ + --set_grads_to_none \ +``` + + + + +8GB显卡需使用 [DeepSpeed](https://www.deepspeed.ai/) 将张量卸载到CPU或NVME: + +运行以下命令配置环境: + +```bash +accelerate config +``` + +选择DeepSpeed stage 2,结合fp16混合精度和参数卸载到CPU的方案。注意这会增加约25GB内存占用。配置示例如下: + +```bash +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特化版 [`deepspeed.ops.adam.DeepSpeedCPUAdam`](https://deepspeed.readthedocs.io/en/latest/optimizers.html#adam-cpu),注意CUDA工具链版本需与PyTorch匹配。 + +当前bitsandbytes与DeepSpeed存在兼容性问题。 + +无需额外添加训练参数。 + + + + + + + +```bash +export MODEL_DIR="stable-diffusion-v1-5/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 +``` + + + + +Flax版本支持通过 `--profile_steps==5` 参数进行性能分析: + +```bash +pip install tensorflow tensorboard-plugin-profile +tensorboard --logdir runs/fill-circle-100steps-20230411_165612/ +``` + +在 [http://localhost:6006/#profile](http://localhost:6006/#profile) 查看分析结果。 + + + +若遇到插件版本冲突,建议重新安装TensorFlow和Tensorboard。注意性能分析插件仍处实验阶段,部分视图可能不完整。`trace_viewer` 会截断超过1M的事件记录,在编译步骤分析时可能导致设备轨迹丢失。 + + + +```bash +python3 train_controlnet_flax.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" \ + --validation_steps=1000 \ + --train_batch_size=2 \ + --revision="non-ema" \ + --from_pt \ + --report_to="wandb" \ + --tracker_project_name=$HUB_MODEL_ID \ + --num_train_epochs=11 \ + --push_to_hub \ + --hub_model_id=$HUB_MODEL_ID +``` + + + + +训练完成后即可进行推理: + +```py +from diffusers import StableDiffusionControlNetPipeline, ControlNetModel +from diffusers.utils import load_image +import torch + +controlnet = ControlNetModel.from_pretrained("path/to/controlnet", torch_dtype=torch.float16) +pipeline = StableDiffusionControlNetPipeline.from_pretrained( + "path/to/base/model", controlnet=controlnet, torch_dtype=torch.float16 +).to("cuda") + +control_image = load_image("./conditioning_image_1.png") +prompt = "pale golden rod circle with old lace background" + +generator = torch.manual_seed(0) +image = pipeline(prompt, num_inference_steps=20, generator=generator, image=control_image).images[0] +image.save("./output.png") +``` + +## Stable Diffusion XL + +Stable Diffusion XL (SDXL) 是新一代文生图模型,通过添加第二文本编码器支持生成更高分辨率图像。使用 [`train_controlnet_sdxl.py`](https://github.com/huggingface/diffusers/blob/main/examples/controlnet/train_controlnet_sdxl.py) 脚本可为SDXL训练ControlNet适配器。 + +SDXL训练脚本的详细解析请参阅 [SDXL训练](sdxl) 指南。 + +## 后续步骤 + +恭喜完成ControlNet训练!如需进一步了解模型应用,以下指南可能有所帮助: + +- 学习如何 [使用ControlNet](../using-diffusers/controlnet) 进行多样化任务的推理 diff --git a/docs/source/zh/training/dreambooth.md b/docs/source/zh/training/dreambooth.md new file mode 100644 index 000000000000..5f4e4c803431 --- /dev/null +++ b/docs/source/zh/training/dreambooth.md @@ -0,0 +1,329 @@ + +# DreamBooth 训练指南 + +[DreamBooth](https://huggingface.co/papers/2208.12242) 是一种通过少量主题或风格样本图像即可更新整个扩散模型的训练技术。其核心原理是将提示词中的特殊标记与示例图像关联起来。 + +## 硬件要求与优化 + +若使用显存有限的GPU进行训练,建议在训练命令中启用 `gradient_checkpointing`(梯度检查点)和 `mixed_precision`(混合精度)参数。还可通过 [xFormers](../optimization/xformers) 启用内存高效注意力机制来降低显存占用。虽然JAX/Flax训练支持TPU和GPU高效训练,但不支持梯度检查点和xFormers。若需使用Flax加速训练,建议配备显存>30GB的GPU。 + +## 环境配置 + +本指南基于 [train_dreambooth.py](https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py) 脚本解析。运行前请先安装库: + +```bash +git clone https://github.com/huggingface/diffusers +cd diffusers +pip install . +``` + +进入示例目录并安装依赖: + + + + +```bash +cd examples/dreambooth +pip install -r requirements.txt +``` + + + + +```bash +cd examples/dreambooth +pip install -r requirements_flax.txt +``` + + + + + + +🤗 Accelerate 是支持多GPU/TPU和混合精度训练的库,能根据硬件自动配置训练环境。参阅 [快速入门](https://huggingface.co/docs/accelerate/quicktour) 了解更多。 + + + +初始化加速环境: + +```bash +accelerate config +``` + +或创建默认配置: + +```bash +accelerate config default +``` + +非交互式环境(如notebook)可使用: + +```py +from accelerate.utils import write_basic_config +write_basic_config() +``` + +自定义数据集训练请参阅 [创建训练数据集](create_dataset) 指南。 + +## 核心参数解析 + + + +DreamBooth对超参数极其敏感,容易过拟合。建议阅读 [训练博客](https://huggingface.co/blog/dreambooth) 获取不同主题的推荐参数。 + + + +主要参数说明(完整参数见 [`parse_args()`](https://github.com/huggingface/diffusers/blob/072e00897a7cf4302c347a63ec917b4b8add16d4/examples/dreambooth/train_dreambooth.py#L228)): + +- `--pretrained_model_name_or_path`:Hub模型ID或本地路径 +- `--instance_data_dir`:训练图像目录 +- `--instance_prompt`:包含特殊标记的提示词 +- `--train_text_encoder`:是否同时训练文本编码器 +- `--output_dir`:模型保存路径 +- `--push_to_hub`:是否推送至Hub +- `--checkpointing_steps`:检查点保存频率,配合`--resume_from_checkpoint`可恢复训练 + +### Min-SNR加权策略 + +[Min-SNR](https://huggingface.co/papers/2303.09556) 策略通过损失重平衡加速收敛,支持`epsilon`和`v_prediction`预测类型(仅PyTorch可用): + +```bash +accelerate launch train_dreambooth.py --snr_gamma=5.0 +``` + +### 先验保留损失 + +通过模型自生成样本增强多样性: + +```bash +accelerate launch train_dreambooth.py \ + --with_prior_preservation \ + --prior_loss_weight=1.0 \ + --class_data_dir="path/to/class/images" \ + --class_prompt="类别描述文本" +``` + +### 文本编码器训练 + +需24GB+显存,可显著提升生成质量(特别面部生成): + +```bash +accelerate launch train_dreambooth.py --train_text_encoder +``` + +## 训练流程解析 + +核心组件: +- [`DreamBoothDataset`](https://github.com/huggingface/diffusers/blob/072e00897a7cf4302c347a63ec917b4b8add16d4/examples/dreambooth/train_dreambooth.py#L604):预处理图像与提示词 +- [`PromptDataset`](https://github.com/huggingface/diffusers/blob/072e00897a7cf4302c347a63ec917b4b8add16d4/examples/dreambooth/train_dreambooth.py#L738):生成类别图像提示词 + +先验保留损失的类别图像生成逻辑: + +```py +# 生成示例代码片段 +``` + +模型加载流程: + +```py +# 加载tokenizer、调度器和模型的代码示例 +``` + +训练数据集构建: + +```py +# 数据集创建代码示例 +``` + +去噪训练循环详见 [理解pipeline](../using-diffusers/write_own_pipeline) 教程。 + +## 启动训练 + +示例使用 [狗狗数据集](https://huggingface.co/datasets/diffusers/dog-example): + +```py +from huggingface_hub import snapshot_download +local_dir = "./dog" +snapshot_download("diffusers/dog-example", local_dir=local_dir, repo_type="dataset", ignore_patterns=".gitattributes") +``` + +训练过程可视化参数: + +```bash +--validation_prompt="a photo of a sks dog" --num_validation_images=4 --validation_steps=100 +``` + + + + +16GB显卡优化方案: + +```bash +pip install bitsandbytes +accelerate launch train_dreambooth.py --gradient_checkpointing --use_8bit_adam +``` + + + + +12GB显卡优化方案: + +```bash +accelerate launch train_dreambooth.py \ + --use_8bit_adam \ + --gradient_checkpointing \ + --enable_xformers_memory_efficient_attention \ + --set_grads_to_none +``` + + + + +8GB显卡需使用DeepSpeed: + +```bash +accelerate config # 配置阶段选择DeepSpeed +``` + +需配合`deepspeed.ops.adam.DeepSpeedCPUAdam`优化器。 + + + + + + + +```bash +export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5" +export INSTANCE_DIR="./dog" +export OUTPUT_DIR="path_to_saved_model" + +accelerate launch train_dreambooth.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --instance_data_dir=$INSTANCE_DIR \ + --output_dir=$OUTPUT_DIR \ + --instance_prompt="a photo of sks dog" \ + --resolution=512 \ + --train_batch_size=1 \ + --gradient_accumulation_steps=1 \ + --learning_rate=5e-6 \ + --lr_scheduler="constant" \ + --lr_warmup_steps=0 \ + --max_train_steps=400 \ + --push_to_hub +``` + + + + +```bash +export MODEL_NAME="duongna/stable-diffusion-v1-4-flax" +export INSTANCE_DIR="./dog" +export OUTPUT_DIR="path-to-save-model" + +python train_dreambooth_flax.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --instance_data_dir=$INSTANCE_DIR \ + --output_dir=$OUTPUT_DIR \ + --instance_prompt="a photo of sks dog" \ + --resolution=512 \ + --train_batch_size=1 \ + --learning_rate=5e-6 \ + --max_train_steps=400 \ + --push_to_hub +``` + + + + +## 推理应用 + + + + +```py +from diffusers import DiffusionPipeline +import torch + +pipeline = DiffusionPipeline.from_pretrained("path_to_saved_model", torch_dtype=torch.float16, use_safetensors=True).to("cuda") +image = pipeline("A photo of sks dog in a bucket", num_inference_steps=50, guidance_scale=7.5).images[0] +image.save("dog-bucket.png") +``` + + + + +```py +# Flax推理代码示例 +``` + + + + +## 进阶训练方案 + +### LoRA训练 + +参数高效训练技术,详见 [LoRA指南](lora)。 + +### SDXL训练 + +支持高分辨率生成的增强模型,详见 [SDXL指南](sdxl)。 + +### DeepFloyd IF训练 + +三阶段级联模型,关键参数: +- `--resolution=64`(基础模型) +- `--pre_compute_text_embeddings`(预计算文本嵌入) +- `--tokenizer_max_length=77`(T5编码器设置) + + + + +```bash +# 第一阶段LoRA训练命令 +``` + + + + +```bash +# 第二阶段LoRA训练命令 +``` + + + + +```bash +# 第一阶段全模型训练命令 +``` + + + + +```bash +# 第二阶段全模型训练命令 +``` + + + + +### 训练建议 +1. 常见物体可不微调上采样器 +2. 面部等细节建议全参数训练 +3. 使用较低学习率 +4. 推荐`DDPMScheduler` + +## 后续步骤 + +- 学习如何加载 [DreamBooth模型](../using-diffusers/loading_adapters) 进行推理 \ No newline at end of file diff --git a/docs/source/zh/training/lora.md b/docs/source/zh/training/lora.md new file mode 100644 index 000000000000..d1a4f658afc7 --- /dev/null +++ b/docs/source/zh/training/lora.md @@ -0,0 +1,231 @@ + + +# LoRA 低秩适配 + + + +当前功能处于实验阶段,API可能在未来版本中变更。 + + + +[LoRA(大语言模型的低秩适配)](https://hf.co/papers/2106.09685) 是一种轻量级训练技术,能显著减少可训练参数量。其原理是通过向模型注入少量新权重参数,仅训练这些新增参数。这使得LoRA训练速度更快、内存效率更高,并生成更小的模型权重文件(通常仅数百MB),便于存储和分享。LoRA还可与DreamBooth等其他训练技术结合以加速训练过程。 + + + +LoRA具有高度通用性,目前已支持以下应用场景:[DreamBooth](https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth_lora.py)、[Kandinsky 2.2](https://github.com/huggingface/diffusers/blob/main/examples/kandinsky2_2/text_to_image/train_text_to_image_lora_decoder.py)、[Stable Diffusion XL](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora_sdxl.py)、[文生图](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora.py)以及[Wuerstchen](https://github.com/huggingface/diffusers/blob/main/examples/wuerstchen/text_to_image/train_text_to_image_lora_prior.py)。 + + + +本指南将通过解析[train_text_to_image_lora.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora.py)脚本,帮助您深入理解其工作原理,并掌握如何针对具体需求进行定制化修改。 + +运行脚本前,请确保从源码安装库: + +```bash +git clone https://github.com/huggingface/diffusers +cd diffusers +pip install . +``` + +进入包含训练脚本的示例目录,并安装所需依赖: + + + + +```bash +cd examples/text_to_image +pip install -r requirements.txt +``` + + + + +```bash +cd examples/text_to_image +pip install -r requirements_flax.txt +``` + + + + + + +🤗 Accelerate是一个支持多GPU/TPU训练和混合精度计算的库,它能根据硬件环境自动配置训练方案。参阅🤗 Accelerate[快速入门](https://huggingface.co/docs/accelerate/quicktour)了解更多。 + + + +初始化🤗 Accelerate环境: + +```bash +accelerate config +``` + +若要创建默认配置环境(不进行交互式设置): + +```bash +accelerate config default +``` + +若在非交互环境(如Jupyter notebook)中使用: + +```py +from accelerate.utils import write_basic_config + +write_basic_config() +``` + +如需训练自定义数据集,请参考[创建训练数据集指南](create_dataset)了解数据准备流程。 + + + +以下章节重点解析训练脚本中与LoRA相关的核心部分,但不会涵盖所有实现细节。如需完整理解,建议直接阅读[脚本源码](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image_lora.py),如有疑问欢迎反馈。 + + + +## 脚本参数 + +训练脚本提供众多参数用于定制训练过程。所有参数及其说明均定义在[`parse_args()`](https://github.com/huggingface/diffusers/blob/dd9a5caf61f04d11c0fa9f3947b69ab0010c9a0f/examples/text_to_image/train_text_to_image_lora.py#L85)函数中。多数参数设有默认值,您也可以通过命令行参数覆盖: + +例如增加训练轮次: + +```bash +accelerate launch train_text_to_image_lora.py \ + --num_train_epochs=150 \ +``` + +基础参数说明可参考[文生图训练指南](text2image#script-parameters),此处重点介绍LoRA相关参数: + +- `--rank`:低秩矩阵的内部维度,数值越高可训练参数越多 +- `--learning_rate`:默认学习率为1e-4,但使用LoRA时可适当提高 + +## 训练脚本实现 + +数据集预处理和训练循环逻辑位于[`main()`](https://github.com/huggingface/diffusers/blob/dd9a5caf61f04d11c0fa9f3947b69ab0010c9a0f/examples/text_to_image/train_text_to_image_lora.py#L371)函数,如需定制训练流程,可在此处进行修改。 + +与参数说明类似,训练流程的完整解析请参考[文生图指南](text2image#training-script),下文重点介绍LoRA相关实现。 + + + + +Diffusers使用[PEFT](https://hf.co/docs/peft)库的[`~peft.LoraConfig`]配置LoRA适配器参数,包括秩(rank)、alpha值以及目标模块。适配器被注入UNet后,通过`lora_layers`筛选出需要优化的LoRA层。 + +```py +unet_lora_config = LoraConfig( + r=args.rank, + lora_alpha=args.rank, + init_lora_weights="gaussian", + target_modules=["to_k", "to_q", "to_v", "to_out.0"], +) + +unet.add_adapter(unet_lora_config) +lora_layers = filter(lambda p: p.requires_grad, unet.parameters()) +``` + + + + +当需要微调文本编码器时(如SDXL模型),Diffusers同样支持通过PEFT库实现。[`~peft.LoraConfig`]配置适配器参数后注入文本编码器,并筛选LoRA层进行训练。 + +```py +text_lora_config = LoraConfig( + r=args.rank, + lora_alpha=args.rank, + init_lora_weights="gaussian", + target_modules=["q_proj", "k_proj", "v_proj", "out_proj"], +) + +text_encoder_one.add_adapter(text_lora_config) +text_encoder_two.add_adapter(text_lora_config) +text_lora_parameters_one = list(filter(lambda p: p.requires_grad, text_encoder_one.parameters())) +text_lora_parameters_two = list(filter(lambda p: p.requires_grad, text_encoder_two.parameters())) +``` + + + + +[优化器](https://github.com/huggingface/diffusers/blob/e4b8f173b97731686e290b2eb98e7f5df2b1b322/examples/text_to_image/train_text_to_image_lora.py#L529)仅对`lora_layers`参数进行优化: + +```py +optimizer = optimizer_cls( + lora_layers, + lr=args.learning_rate, + betas=(args.adam_beta1, args.adam_beta2), + weight_decay=args.adam_weight_decay, + eps=args.adam_epsilon, +) +``` + +除LoRA层设置外,该训练脚本与标准train_text_to_image.py基本相同! + +## 启动训练 + +完成所有配置后,即可启动训练脚本!🚀 + +以下示例使用[火影忍者BLIP标注数据集](https://huggingface.co/datasets/lambdalabs/naruto-blip-captions)训练生成火影角色。请设置环境变量`MODEL_NAME`和`DATASET_NAME`指定基础模型和数据集,`OUTPUT_DIR`设置输出目录,`HUB_MODEL_ID`指定Hub存储库名称。脚本运行后将生成以下文件: + +- 模型检查点 +- `pytorch_lora_weights.safetensors`(训练好的LoRA权重) + +多GPU训练请添加`--multi_gpu`参数。 + + + +在11GB显存的2080 Ti显卡上完整训练约需5小时。 + + + +```bash +export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5" +export OUTPUT_DIR="/sddata/finetune/lora/naruto" +export HUB_MODEL_ID="naruto-lora" +export DATASET_NAME="lambdalabs/naruto-blip-captions" + +accelerate launch --mixed_precision="fp16" train_text_to_image_lora.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --dataset_name=$DATASET_NAME \ + --dataloader_num_workers=8 \ + --resolution=512 \ + --center_crop \ + --random_flip \ + --train_batch_size=1 \ + --gradient_accumulation_steps=4 \ + --max_train_steps=15000 \ + --learning_rate=1e-04 \ + --max_grad_norm=1 \ + --lr_scheduler="cosine" \ + --lr_warmup_steps=0 \ + --output_dir=${OUTPUT_DIR} \ + --push_to_hub \ + --hub_model_id=${HUB_MODEL_ID} \ + --report_to=wandb \ + --checkpointing_steps=500 \ + --validation_prompt="蓝色眼睛的火影忍者角色" \ + --seed=1337 +``` + +训练完成后,您可以通过以下方式进行推理: + +```py +from diffusers import AutoPipelineForText2Image +import torch + +pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", torch_dtype=torch.float16).to("cuda") +pipeline.load_lora_weights("path/to/lora/model", weight_name="pytorch_lora_weights.safetensors") +image = pipeline("蓝色眼睛的火影忍者角色").images[0] +``` + +## 后续步骤 + +恭喜完成LoRA模型训练!如需进一步了解模型使用方法,可参考以下指南: + +- 学习如何加载[不同格式的LoRA权重](../using-diffusers/loading_adapters#LoRA)(如Kohya或TheLastBen训练的模型) +- 掌握使用PEFT进行[多LoRA组合推理](../tutorials/using_peft_for_inference)的技巧 \ No newline at end of file diff --git a/docs/source/zh/training/overview.md b/docs/source/zh/training/overview.md new file mode 100644 index 000000000000..0133c318fb36 --- /dev/null +++ b/docs/source/zh/training/overview.md @@ -0,0 +1,60 @@ + + +# 概述 + +🤗 Diffusers 提供了一系列训练脚本供您训练自己的扩散模型。您可以在 [diffusers/examples](https://github.com/huggingface/diffusers/tree/main/examples) 找到所有训练脚本。 + +每个训练脚本具有以下特点: + +- **独立完整**:训练脚本不依赖任何本地文件,所有运行所需的包都通过 `requirements.txt` 文件安装 +- **易于调整**:这些脚本是针对特定任务的训练示例,并不能开箱即用地适用于所有训练场景。您可能需要根据具体用例调整脚本。为此,我们完全公开了数据预处理代码和训练循环,方便您进行修改 +- **新手友好**:脚本设计注重易懂性和入门友好性,而非包含最新最优方法以获得最具竞争力的结果。我们有意省略了过于复杂的训练方法 +- **单一用途**:每个脚本仅针对一个任务设计,确保代码可读性和可理解性 + +当前提供的训练脚本包括: + +| 训练类型 | 支持SDXL | 支持LoRA | 支持Flax | +|---|---|---|---| +| [无条件图像生成](https://github.com/huggingface/diffusers/tree/main/examples/unconditional_image_generation) [![在Colab打开](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/training_example.ipynb) | | | | +| [文生图](https://github.com/huggingface/diffusers/tree/main/examples/text_to_image) | 👍 | 👍 | 👍 | +| [文本反转](https://github.com/huggingface/diffusers/tree/main/examples/textual_inversion) [![在Colab打开](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/sd_textual_inversion_training.ipynb) | | | 👍 | +| [DreamBooth](https://github.com/huggingface/diffusers/tree/main/examples/dreambooth) [![在Colab打开](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/sd_dreambooth_training.ipynb) | 👍 | 👍 | 👍 | +| [ControlNet](https://github.com/huggingface/diffusers/tree/main/examples/controlnet) | 👍 | | 👍 | +| [InstructPix2Pix](https://github.com/huggingface/diffusers/tree/main/examples/instruct_pix2pix) | 👍 | | | +| [Custom Diffusion](https://github.com/huggingface/diffusers/tree/main/examples/custom_diffusion) | | | | +| [T2I-Adapters](https://github.com/huggingface/diffusers/tree/main/examples/t2i_adapter) | 👍 | | | +| [Kandinsky 2.2](https://github.com/huggingface/diffusers/tree/main/examples/kandinsky2_2/text_to_image) | | 👍 | | +| [Wuerstchen](https://github.com/huggingface/diffusers/tree/main/examples/wuerstchen/text_to_image) | | 👍 | | + +这些示例处于**积极维护**状态,如果遇到问题请随时提交issue。如果您认为应该添加其他训练示例,欢迎创建[功能请求](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=&template=feature_request.md&title=)与我们讨论,我们将评估其是否符合独立完整、易于调整、新手友好和单一用途的标准。 + +## 安装 + +请按照以下步骤在新虚拟环境中从源码安装库,确保能成功运行最新版本的示例脚本: + +```bash +git clone https://github.com/huggingface/diffusers +cd diffusers +pip install . +``` + +然后进入具体训练脚本目录(例如[DreamBooth](https://github.com/huggingface/diffusers/tree/main/examples/dreambooth)),安装对应的`requirements.txt`文件。部分脚本针对SDXL、LoRA或Flax有特定要求文件,使用时请确保安装对应文件。 + +```bash +cd examples/dreambooth +pip install -r requirements.txt +# 如需用DreamBooth训练SDXL +pip install -r requirements_sdxl.txt +``` + +为加速训练并降低内存消耗,我们建议: + +- 使用PyTorch 2.0或更高版本,自动启用[缩放点积注意力](../optimization/fp16#scaled-dot-product-attention)(无需修改训练代码) +- 安装[xFormers](../optimization/xformers)以启用内存高效注意力机制 \ No newline at end of file diff --git a/docs/source/zh/training/text2image.md b/docs/source/zh/training/text2image.md new file mode 100644 index 000000000000..193b839e9b93 --- /dev/null +++ b/docs/source/zh/training/text2image.md @@ -0,0 +1,275 @@ + + +# 文生图 + + + +文生图训练脚本目前处于实验阶段,容易出现过拟合和灾难性遗忘等问题。建议尝试不同超参数以获得最佳数据集适配效果。 + + + +Stable Diffusion 等文生图模型能够根据文本提示生成对应图像。 + +模型训练对硬件要求较高,但启用 `gradient_checkpointing` 和 `mixed_precision` 后,可在单块24GB显存GPU上完成训练。如需更大批次或更快训练速度,建议使用30GB以上显存的GPU设备。通过启用 [xFormers](../optimization/xformers) 内存高效注意力机制可降低显存占用。JAX/Flax 训练方案也支持TPU/GPU高效训练,但不支持梯度检查点、梯度累积和xFormers。使用Flax训练时建议配备30GB以上显存GPU或TPU v3。 + +本指南将详解 [train_text_to_image.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image.py) 训练脚本,助您掌握其原理并适配自定义需求。 + +运行脚本前请确保已从源码安装库: + +```bash +git clone https://github.com/huggingface/diffusers +cd diffusers +pip install . +``` + +然后进入包含训练脚本的示例目录,安装对应依赖: + + + +```bash +cd examples/text_to_image +pip install -r requirements.txt +``` + + +```bash +cd examples/text_to_image +pip install -r requirements_flax.txt +``` + + + + + +🤗 Accelerate 是支持多GPU/TPU训练和混合精度的工具库,能根据硬件环境自动配置训练参数。参阅 🤗 Accelerate [快速入门](https://huggingface.co/docs/accelerate/quicktour) 了解更多。 + + + +初始化 🤗 Accelerate 环境: + +```bash +accelerate config +``` + +要创建默认配置环境(不进行交互式选择): + +```bash +accelerate config default +``` + +若环境不支持交互式shell(如notebook),可使用: + +```py +from accelerate.utils import write_basic_config + +write_basic_config() +``` + +最后,如需在自定义数据集上训练,请参阅 [创建训练数据集](create_dataset) 指南了解如何准备适配脚本的数据集。 + +## 脚本参数 + + + +以下重点介绍脚本中影响训练效果的关键参数,如需完整参数说明可查阅 [脚本源码](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image.py)。如有疑问欢迎反馈。 + + + +训练脚本提供丰富参数供自定义训练流程,所有参数及说明详见 [`parse_args()`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L193) 函数。该函数为每个参数提供默认值(如批次大小、学习率等),也可通过命令行参数覆盖。 + +例如使用fp16混合精度加速训练: + +```bash +accelerate launch train_text_to_image.py \ + --mixed_precision="fp16" +``` + +基础重要参数包括: + +- `--pretrained_model_name_or_path`: Hub模型名称或本地预训练模型路径 +- `--dataset_name`: Hub数据集名称或本地训练数据集路径 +- `--image_column`: 数据集中图像列名 +- `--caption_column`: 数据集中文本列名 +- `--output_dir`: 模型保存路径 +- `--push_to_hub`: 是否将训练模型推送至Hub +- `--checkpointing_steps`: 模型检查点保存步数;训练中断时可添加 `--resume_from_checkpoint` 从该检查点恢复训练 + +### Min-SNR加权策略 + +[Min-SNR](https://huggingface.co/papers/2303.09556) 加权策略通过重新平衡损失函数加速模型收敛。训练脚本支持预测 `epsilon`(噪声)或 `v_prediction`,而Min-SNR兼容两种预测类型。该策略仅限PyTorch版本,Flax训练脚本不支持。 + +添加 `--snr_gamma` 参数并设为推荐值5.0: + +```bash +accelerate launch train_text_to_image.py \ + --snr_gamma=5.0 +``` + +可通过此 [Weights and Biases](https://wandb.ai/sayakpaul/text2image-finetune-minsnr) 报告比较不同 `snr_gamma` 值的损失曲面。小数据集上Min-SNR效果可能不如大数据集显著。 + +## 训练脚本解析 + +数据集预处理代码和训练循环位于 [`main()`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L490) 函数,自定义修改需在此处进行。 + +`train_text_to_image` 脚本首先 [加载调度器](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L543) 和分词器,此处可替换其他调度器: + +```py +noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler") +tokenizer = CLIPTokenizer.from_pretrained( + args.pretrained_model_name_or_path, subfolder="tokenizer", revision=args.revision +) +``` + +接着 [加载UNet模型](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L619): + +```py +load_model = UNet2DConditionModel.from_pretrained(input_dir, subfolder="unet") +model.register_to_config(**load_model.config) + +model.load_state_dict(load_model.state_dict()) +``` + +随后对数据集的文本和图像列进行预处理。[`tokenize_captions`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L724) 函数处理文本分词,[`train_transforms`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L742) 定义图像增强策略,二者集成于 `preprocess_train`: + +```py +def preprocess_train(examples): + images = [image.convert("RGB") for image in examples[image_column]] + examples["pixel_values"] = [train_transforms(image) for image in images] + examples["input_ids"] = tokenize_captions(examples) + return examples +``` + +最后,[训练循环](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L878) 处理剩余流程:图像编码为潜空间、添加噪声、计算文本嵌入条件、更新模型参数、保存并推送模型至Hub。想深入了解训练循环原理,可参阅 [理解管道、模型与调度器](../using-diffusers/write_own_pipeline) 教程,该教程解析了去噪过程的核心逻辑。 + +## 启动脚本 + +完成所有配置后,即可启动训练脚本!🚀 + + + + +以 [火影忍者BLIP标注数据集](https://huggingface.co/datasets/lambdalabs/naruto-blip-captions) 为例训练生成火影角色。设置环境变量 `MODEL_NAME` 和 `dataset_name` 指定模型和数据集(Hub或本地路径)。多GPU训练需在 `accelerate launch` 命令中添加 `--multi_gpu` 参数。 + + + +使用本地数据集时,设置 `TRAIN_DIR` 和 `OUTPUT_DIR` 环境变量为数据集路径和模型保存路径。 + + + +```bash +export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5" +export dataset_name="lambdalabs/naruto-blip-captions" + +accelerate launch --mixed_precision="fp16" train_text_to_image.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --dataset_name=$dataset_name \ + --use_ema \ + --resolution=512 --center_crop --random_flip \ + --train_batch_size=1 \ + --gradient_accumulation_steps=4 \ + --gradient_checkpointing \ + --max_train_steps=15000 \ + --learning_rate=1e-05 \ + --max_grad_norm=1 \ + --enable_xformers_memory_efficient_attention \ + --lr_scheduler="constant" --lr_warmup_steps=0 \ + --output_dir="sd-naruto-model" \ + --push_to_hub +``` + + + + +Flax训练方案在TPU/GPU上效率更高(由 [@duongna211](https://github.com/duongna21) 实现),TPU性能更优但GPU表现同样出色。 + +设置环境变量 `MODEL_NAME` 和 `dataset_name` 指定模型和数据集(Hub或本地路径)。 + + + +使用本地数据集时,设置 `TRAIN_DIR` 和 `OUTPUT_DIR` 环境变量为数据集路径和模型保存路径。 + + + +```bash +export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5" +export dataset_name="lambdalabs/naruto-blip-captions" + +python train_text_to_image_flax.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --dataset_name=$dataset_name \ + --resolution=512 --center_crop --random_flip \ + --train_batch_size=1 \ + --max_train_steps=15000 \ + --learning_rate=1e-05 \ + --max_grad_norm=1 \ + --output_dir="sd-naruto-model" \ + --push_to_hub +``` + + + + +训练完成后,即可使用新模型进行推理: + + + + +```py +from diffusers import StableDiffusionPipeline +import torch + +pipeline = StableDiffusionPipeline.from_pretrained("path/to/saved_model", torch_dtype=torch.float16, use_safetensors=True).to("cuda") + +image = pipeline(prompt="yoda").images[0] +image.save("yoda-naruto.png") +``` + + + + +```py +import jax +import numpy as np +from flax.jax_utils import replicate +from flax.training.common_utils import shard +from diffusers import FlaxStableDiffusionPipeline + +pipeline, params = FlaxStableDiffusionPipeline.from_pretrained("path/to/saved_model", dtype=jax.numpy.bfloat16) + +prompt = "yoda naruto" +prng_seed = jax.random.PRNGKey(0) +num_inference_steps = 50 + +num_samples = jax.device_count() +prompt = num_samples * [prompt] +prompt_ids = pipeline.prepare_inputs(prompt) + +# 分片输入和随机数 +params = replicate(params) +prng_seed = jax.random.split(prng_seed, jax.device_count()) +prompt_ids = shard(prompt_ids) + +images = pipeline(prompt_ids, params, prng_seed, num_inference_steps, jit=True).images +images = pipeline.numpy_to_pil(np.asarray(images.reshape((num_samples,) + images.shape[-3:]))) +image.save("yoda-naruto.png") +``` + + + + +## 后续步骤 + +恭喜完成文生图模型训练!如需进一步使用模型,以下指南可能有所帮助: + +- 了解如何加载 [LoRA权重](../using-diffusers/loading_adapters#LoRA) 进行推理(如果训练时使用了LoRA) +- 在 [文生图](../using-diffusers/conditional_image_generation) 任务指南中,了解引导尺度等参数或提示词加权等技术如何控制生成效果 \ No newline at end of file diff --git a/docs/source/zh/training/text_inversion.md b/docs/source/zh/training/text_inversion.md new file mode 100644 index 000000000000..2945699c6141 --- /dev/null +++ b/docs/source/zh/training/text_inversion.md @@ -0,0 +1,296 @@ + + +# 文本反转(Textual Inversion) + +[文本反转](https://hf.co/papers/2208.01618)是一种训练技术,仅需少量示例图像即可个性化图像生成模型。该技术通过学习和更新文本嵌入(新嵌入会绑定到提示中必须使用的特殊词汇)来匹配您提供的示例图像。 + +如果在显存有限的GPU上训练,建议在训练命令中启用`gradient_checkpointing`和`mixed_precision`参数。您还可以通过[xFormers](../optimization/xformers)使用内存高效注意力机制来减少内存占用。JAX/Flax训练也支持在TPU和GPU上进行高效训练,但不支持梯度检查点或xFormers。在配置与PyTorch相同的情况下,Flax训练脚本的速度至少应快70%! + +本指南将探索[textual_inversion.py](https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion.py)脚本,帮助您更熟悉其工作原理,并了解如何根据自身需求进行调整。 + +运行脚本前,请确保从源码安装库: + +```bash +git clone https://github.com/huggingface/diffusers +cd diffusers +pip install . +``` + +进入包含训练脚本的示例目录,并安装所需依赖: + + + + +```bash +cd examples/textual_inversion +pip install -r requirements.txt +``` + + + + +```bash +cd examples/textual_inversion +pip install -r requirements_flax.txt +``` + + + + + + +🤗 Accelerate 是一个帮助您在多GPU/TPU或混合精度环境下训练的工具库。它会根据硬件和环境自动配置训练设置。查看🤗 Accelerate [快速入门](https://huggingface.co/docs/accelerate/quicktour)了解更多。 + + + +初始化🤗 Accelerate环境: + +```bash +accelerate config +``` + +要设置默认的🤗 Accelerate环境(不选择任何配置): + +```bash +accelerate config default +``` + +如果您的环境不支持交互式shell(如notebook),可以使用: + +```py +from accelerate.utils import write_basic_config + +write_basic_config() +``` + +最后,如果想在自定义数据集上训练模型,请参阅[创建训练数据集](create_dataset)指南,了解如何创建适用于训练脚本的数据集。 + + + +以下部分重点介绍训练脚本中需要理解的关键修改点,但未涵盖脚本所有细节。如需深入了解,可随时查阅[脚本源码](https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion.py),如有疑问欢迎反馈。 + + + +## 脚本参数 + +训练脚本包含众多参数,便于您定制训练过程。所有参数及其说明都列在[`parse_args()`](https://github.com/huggingface/diffusers/blob/839c2a5ece0af4e75530cb520d77bc7ed8acf474/examples/textual_inversion/textual_inversion.py#L176)函数中。Diffusers为每个参数提供了默认值(如训练批次大小和学习率),但您可以通过训练命令自由调整这些值。 + +例如,将梯度累积步数增加到默认值1以上: + +```bash +accelerate launch textual_inversion.py \ + --gradient_accumulation_steps=4 +``` + +其他需要指定的基础重要参数包括: + +- `--pretrained_model_name_or_path`:Hub上的模型名称或本地预训练模型路径 +- `--train_data_dir`:包含训练数据集(示例图像)的文件夹路径 +- `--output_dir`:训练模型保存位置 +- `--push_to_hub`:是否将训练好的模型推送至Hub +- `--checkpointing_steps`:训练过程中保存检查点的频率;若训练意外中断,可通过在命令中添加`--resume_from_checkpoint`从该检查点恢复训练 +- `--num_vectors`:学习嵌入的向量数量;增加此参数可提升模型效果,但会提高训练成本 +- `--placeholder_token`:绑定学习嵌入的特殊词汇(推理时需在提示中使用该词) +- `--initializer_token`:大致描述训练目标的单字词汇(如物体或风格) +- `--learnable_property`:训练目标是学习新"风格"(如梵高画风)还是"物体"(如您的宠物狗) + +## 训练脚本 + +与其他训练脚本不同,textual_inversion.py包含自定义数据集类[`TextualInversionDataset`](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L487),用于创建数据集。您可以自定义图像尺寸、占位符词汇、插值方法、是否裁剪图像等。如需修改数据集创建方式,可调整`TextualInversionDataset`类。 + +接下来,在[`main()`](https://github.com/huggingface/diffusers/blob/839c2a5ece0af4e75530cb520d77bc7ed8acf474/examples/textual_inversion/textual_inversion.py#L573)函数中可找到数据集预处理代码和训练循环。 + +脚本首先加载[tokenizer](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L616)、[scheduler和模型](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L622): + +```py +# 加载tokenizer +if args.tokenizer_name: + tokenizer = CLIPTokenizer.from_pretrained(args.tokenizer_name) +elif args.pretrained_model_name_or_path: + tokenizer = CLIPTokenizer.from_pretrained(args.pretrained_model_name_or_path, subfolder="tokenizer") + +# 加载scheduler和模型 +noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler") +text_encoder = CLIPTextModel.from_pretrained( + args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision +) +vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision) +unet = UNet2DConditionModel.from_pretrained( + args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision +) +``` + +随后将特殊[占位符词汇](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L632)加入tokenizer,并调整嵌入层以适配新词汇。 + +接着,脚本通过`TextualInversionDataset`[创建数据集](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L716): + +```py +train_dataset = TextualInversionDataset( + data_root=args.train_data_dir, + tokenizer=tokenizer, + size=args.resolution, + placeholder_token=(" ".join(tokenizer.convert_ids_to_tokens(placeholder_token_ids))), + repeats=args.repeats, + learnable_property=args.learnable_property, + center_crop=args.center_crop, + set="train", +) +train_dataloader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.train_batch_size, shuffle=True, num_workers=args.dataloader_num_workers +) +``` + +最后,[训练循环](https://github.com/huggingface/diffusers/blob/b81c69e489aad3a0ba73798c459a33990dc4379c/examples/textual_inversion/textual_inversion.py#L784)处理从预测噪声残差到更新特殊占位符词汇嵌入权重的所有流程。 + +如需深入了解训练循环工作原理,请参阅[理解管道、模型与调度器](../using-diffusers/write_own_pipeline)教程,该教程解析了去噪过程的基本模式。 + +## 启动脚本 + +完成所有修改或确认默认配置后,即可启动训练脚本!🚀 + +本指南将下载[猫玩具](https://huggingface.co/datasets/diffusers/cat_toy_example)的示例图像并存储在目录中。当然,您也可以创建和使用自己的数据集(参见[创建训练数据集](create_dataset)指南)。 + +```py +from huggingface_hub import snapshot_download + +local_dir = "./cat" +snapshot_download( + "diffusers/cat_toy_example", local_dir=local_dir, repo_type="dataset", ignore_patterns=".gitattributes" +) +``` + +设置环境变量`MODEL_NAME`为Hub上的模型ID或本地模型路径,`DATA_DIR`为刚下载的猫图像路径。脚本会将以下文件保存至您的仓库: + +- `learned_embeds.bin`:与示例图像对应的学习嵌入向量 +- `token_identifier.txt`:特殊占位符词汇 +- `type_of_concept.txt`:训练概念类型("object"或"style") + + + +在单块V100 GPU上完整训练约需1小时。 + + + +启动脚本前还有最后一步。如果想实时观察训练过程,可以定期保存生成图像。在训练命令中添加以下参数: + +```bash +--validation_prompt="A train" +--num_validation_images=4 +--validation_steps=100 +``` + + + + +```bash +export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5" +export DATA_DIR="./cat" + +accelerate launch textual_inversion.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --train_data_dir=$DATA_DIR \ + --learnable_property="object" \ + --placeholder_token="" \ + --initializer_token="toy" \ + --resolution=512 \ + --train_batch_size=1 \ + --gradient_accumulation_steps=4 \ + --max_train_steps=3000 \ + --learning_rate=5.0e-04 \ + --scale_lr \ + --lr_scheduler="constant" \ + --lr_warmup_steps=0 \ + --output_dir="textual_inversion_cat" \ + --push_to_hub +``` + + + + +```bash +export MODEL_NAME="duongna/stable-diffusion-v1-4-flax" +export DATA_DIR="./cat" + +python textual_inversion_flax.py \ + --pretrained_model_name_or_path=$MODEL_NAME \ + --train_data_dir=$DATA_DIR \ + --learnable_property="object" \ + --placeholder_token="" \ + --initializer_token="toy" \ + --resolution=512 \ + --train_batch_size=1 \ + --max_train_steps=3000 \ + --learning_rate=5.0e-04 \ + --scale_lr \ + --output_dir="textual_inversion_cat" \ + --push_to_hub +``` + + + + +训练完成后,可以像这样使用新模型进行推理: + + + + +```py +from diffusers import StableDiffusionPipeline +import torch + +pipeline = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", torch_dtype=torch.float16).to("cuda") +pipeline.load_textual_inversion("sd-concepts-library/cat-toy") +image = pipeline("A train", num_inference_steps=50).images[0] +image.save("cat-train.png") +``` + + + + +Flax不支持[`~loaders.TextualInversionLoaderMixin.load_textual_inversion`]方法,但textual_inversion_flax.py脚本会在训练后[保存](https://github.com/huggingface/diffusers/blob/c0f058265161178f2a88849e92b37ffdc81f1dcc/examples/textual_inversion/textual_inversion_flax.py#L636C2-L636C2)学习到的嵌入作为模型的一部分。这意味着您可以像使用其他Flax模型一样进行推理: + +```py +import jax +import numpy as np +from flax.jax_utils import replicate +from flax.training.common_utils import shard +from diffusers import FlaxStableDiffusionPipeline + +model_path = "path-to-your-trained-model" +pipeline, params = FlaxStableDiffusionPipeline.from_pretrained(model_path, dtype=jax.numpy.bfloat16) + +prompt = "A train" +prng_seed = jax.random.PRNGKey(0) +num_inference_steps = 50 + +num_samples = jax.device_count() +prompt = num_samples * [prompt] +prompt_ids = pipeline.prepare_inputs(prompt) + +# 分片输入和随机数生成器 +params = replicate(params) +prng_seed = jax.random.split(prng_seed, jax.device_count()) +prompt_ids = shard(prompt_ids) + +images = pipeline(prompt_ids, params, prng_seed, num_inference_steps, jit=True).images +images = pipeline.numpy_to_pil(np.asarray(images.reshape((num_samples,) + images.shape[-3:]))) +image.save("cat-train.png") +``` + + + + +## 后续步骤 + +恭喜您成功训练了自己的文本反转模型!🎉 如需了解更多使用技巧,以下指南可能会有所帮助: + +- 学习如何[加载文本反转嵌入](../using-diffusers/loading_adapters),并将其用作负面嵌入 +- 学习如何将[文本反转](textual_inversion_inference)应用于Stable Diffusion 1/2和Stable Diffusion XL的推理 diff --git a/docs/source/zh/using-diffusers/schedulers.md b/docs/source/zh/using-diffusers/schedulers.md new file mode 100644 index 000000000000..8764276d8310 --- /dev/null +++ b/docs/source/zh/using-diffusers/schedulers.md @@ -0,0 +1,256 @@ + + +# 加载调度器与模型 + +[[在Colab中打开]] + +Diffusion管道是由可互换的调度器(schedulers)和模型(models)组成的集合,可通过混合搭配来定制特定用例的流程。调度器封装了整个去噪过程(如去噪步数和寻找去噪样本的算法),其本身不包含可训练参数,因此内存占用极低。模型则主要负责从含噪输入到较纯净样本的前向传播过程。 + +本指南将展示如何加载调度器和模型来自定义流程。我们将全程使用[stable-diffusion-v1-5/stable-diffusion-v1-5](https://hf.co/stable-diffusion-v1-5/stable-diffusion-v1-5)检查点,首先加载基础管道: + +```python +import torch +from diffusers import DiffusionPipeline + +pipeline = DiffusionPipeline.from_pretrained( + "stable-diffusion-v1-5/stable-diffusion-v1-5", torch_dtype=torch.float16, use_safetensors=True +).to("cuda") +``` + +通过`pipeline.scheduler`属性可查看当前管道使用的调度器: + +```python +pipeline.scheduler +PNDMScheduler { + "_class_name": "PNDMScheduler", + "_diffusers_version": "0.21.4", + "beta_end": 0.012, + "beta_schedule": "scaled_linear", + "beta_start": 0.00085, + "clip_sample": false, + "num_train_timesteps": 1000, + "set_alpha_to_one": false, + "skip_prk_steps": true, + "steps_offset": 1, + "timestep_spacing": "leading", + "trained_betas": null +} +``` + +## 加载调度器 + +调度器通过配置文件定义,同一配置文件可被多种调度器共享。使用[`SchedulerMixin.from_pretrained`]方法加载时,需指定`subfolder`参数以定位配置文件在仓库中的正确子目录。 + +例如加载[`DDIMScheduler`]: + +```python +from diffusers import DDIMScheduler, DiffusionPipeline + +ddim = DDIMScheduler.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", subfolder="scheduler") +``` + +然后将新调度器传入管道: + +```python +pipeline = DiffusionPipeline.from_pretrained( + "stable-diffusion-v1-5/stable-diffusion-v1-5", scheduler=ddim, torch_dtype=torch.float16, use_safetensors=True +).to("cuda") +``` + +## 调度器对比 + +不同调度器各有优劣,难以定量评估哪个最适合您的流程。通常需要在去噪速度与质量之间权衡。我们建议尝试多种调度器以找到最佳方案。通过`pipeline.scheduler.compatibles`属性可查看兼容当前管道的所有调度器。 + +下面我们使用相同提示词和随机种子,对比[`LMSDiscreteScheduler`]、[`EulerDiscreteScheduler`]、[`EulerAncestralDiscreteScheduler`]和[`DPMSolverMultistepScheduler`]的表现: + +```python +import torch +from diffusers import DiffusionPipeline + +pipeline = DiffusionPipeline.from_pretrained( + "stable-diffusion-v1-5/stable-diffusion-v1-5", torch_dtype=torch.float16, use_safetensors=True +).to("cuda") + +prompt = "一张宇航员在火星上骑马的高清照片,高分辨率,高画质。" +generator = torch.Generator(device="cuda").manual_seed(8) +``` + +使用[`~ConfigMixin.from_config`]方法加载不同调度器的配置来切换管道调度器: + + + + +[`LMSDiscreteScheduler`]通常能生成比默认调度器更高质量的图像。 + +```python +from diffusers import LMSDiscreteScheduler + +pipeline.scheduler = LMSDiscreteScheduler.from_config(pipeline.scheduler.config) +image = pipeline(prompt, generator=generator).images[0] +image +``` + + + + +[`EulerDiscreteScheduler`]仅需30步即可生成高质量图像。 + +```python +from diffusers import EulerDiscreteScheduler + +pipeline.scheduler = EulerDiscreteScheduler.from_config(pipeline.scheduler.config) +image = pipeline(prompt, generator=generator).images[0] +image +``` + + + + +[`EulerAncestralDiscreteScheduler`]同样可在30步内生成高质量图像。 + +```python +from diffusers import EulerAncestralDiscreteScheduler + +pipeline.scheduler = EulerAncestralDiscreteScheduler.from_config(pipeline.scheduler.config) +image = pipeline(prompt, generator=generator).images[0] +image +``` + + + + +[`DPMSolverMultistepScheduler`]在速度与质量间取得平衡,仅需20步即可生成优质图像。 + +```python +from diffusers import DPMSolverMultistepScheduler + +pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config) +image = pipeline(prompt, generator=generator).images[0] +image +``` + + + + +
+
+ +
LMSDiscreteScheduler
+
+
+ +
EulerDiscreteScheduler
+
+
+
+
+ +
EulerAncestralDiscreteScheduler
+
+
+ +
DPMSolverMultistepScheduler
+
+
+ +多数生成图像质量相近,实际选择需根据具体场景测试多种调度器进行比较。 + +### Flax调度器 + +对比Flax调度器时,需额外将调度器状态加载到模型参数中。例如将[`FlaxStableDiffusionPipeline`]的默认调度器切换为超高效的[`FlaxDPMSolverMultistepScheduler`]: + +> [!警告] +> [`FlaxLMSDiscreteScheduler`]和[`FlaxDDPMScheduler`]目前暂不兼容[`FlaxStableDiffusionPipeline`]。 + +```python +import jax +import numpy as np +from flax.jax_utils import replicate +from flax.training.common_utils import shard +from diffusers import FlaxStableDiffusionPipeline, FlaxDPMSolverMultistepScheduler + +scheduler, scheduler_state = FlaxDPMSolverMultistepScheduler.from_pretrained( + "stable-diffusion-v1-5/stable-diffusion-v1-5", + subfolder="scheduler" +) +pipeline, params = FlaxStableDiffusionPipeline.from_pretrained( + "stable-diffusion-v1-5/stable-diffusion-v1-5", + scheduler=scheduler, + variant="bf16", + dtype=jax.numpy.bfloat16, +) +params["scheduler"] = scheduler_state +``` + +利用Flax对TPU的兼容性实现并行图像生成。需为每个设备复制模型参数,并分配输入数据: + +```python +# 每个并行设备生成1张图像(TPUv2-8/TPUv3-8支持8设备并行) +prompt = "一张宇航员在火星上骑马的高清照片,高分辨率,高画质。" +num_samples = jax.device_count() +prompt_ids = pipeline.prepare_inputs([prompt] * num_samples) + +prng_seed = jax.random.PRNGKey(0) +num_inference_steps = 25 + +# 分配输入和随机种子 +params = replicate(params) +prng_seed = jax.random.split(prng_seed, jax.device_count()) +prompt_ids = shard(prompt_ids) + +images = pipeline(prompt_ids, params, prng_seed, num_inference_steps, jit=True).images +images = pipeline.numpy_to_pil(np.asarray(images.reshape((num_samples,) + images.shape[-3:]))) +``` + +## 模型加载 + +通过[`ModelMixin.from_pretrained`]方法加载模型,该方法会下载并缓存模型权重和配置的最新版本。若本地缓存已存在最新文件,则直接复用缓存而非重复下载。 + +通过`subfolder`参数可从子目录加载模型。例如[stable-diffusion-v1-5/stable-diffusion-v1-5](https://hf.co/stable-diffusion-v1-5/stable-diffusion-v1-5)的模型权重存储在[unet](https://hf.co/stable-diffusion-v1-5/stable-diffusion-v1-5/tree/main/unet)子目录中: + +```python +from diffusers import UNet2DConditionModel + +unet = UNet2DConditionModel.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", subfolder="unet", use_safetensors=True) +``` + +也可直接从[仓库](https://huggingface.co/google/ddpm-cifar10-32/tree/main)加载: + +```python +from diffusers import UNet2DModel + +unet = UNet2DModel.from_pretrained("google/ddpm-cifar10-32", use_safetensors=True) +``` + +加载和保存模型变体时,需在[`ModelMixin.from_pretrained`]和[`ModelMixin.save_pretrained`]中指定`variant`参数: + +```python +from diffusers import UNet2DConditionModel + +unet = UNet2DConditionModel.from_pretrained( + "stable-diffusion-v1-5/stable-diffusion-v1-5", subfolder="unet", variant="non_ema", use_safetensors=True +) +unet.save_pretrained("./local-unet", variant="non_ema") +``` + +使用[`~ModelMixin.from_pretrained`]的`torch_dtype`参数指定模型加载精度: + +```python +from diffusers import AutoModel + +unet = AutoModel.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", subfolder="unet", torch_dtype=torch.float16 +) +``` + +也可使用[torch.Tensor.to](https://docs.pytorch.org/docs/stable/generated/torch.Tensor.to.html)方法即时转换精度,但会转换所有权重(不同于`torch_dtype`参数会保留`_keep_in_fp32_modules`中的层)。这对某些必须保持fp32精度的层尤为重要(参见[示例](https://github.com/huggingface/diffusers/blob/f864a9a352fa4a220d860bfdd1782e3e5af96382/src/diffusers/models/transformers/transformer_wan.py#L374))。 From f166e7e12c8e65a7e9544929af1086802652af54 Mon Sep 17 00:00:00 2001 From: SamYuan1990 Date: Fri, 1 Aug 2025 00:00:38 +0800 Subject: [PATCH 2/7] add two more docs Signed-off-by: SamYuan1990 --- docs/source/zh/training/adapt_a_model.md | 48 ++ docs/source/zh/using-diffusers/loading.md | 613 ++++++++++++++++++++++ 2 files changed, 661 insertions(+) create mode 100644 docs/source/zh/training/adapt_a_model.md create mode 100644 docs/source/zh/using-diffusers/loading.md diff --git a/docs/source/zh/training/adapt_a_model.md b/docs/source/zh/training/adapt_a_model.md new file mode 100644 index 000000000000..89dfc3799829 --- /dev/null +++ b/docs/source/zh/training/adapt_a_model.md @@ -0,0 +1,48 @@ +# 将模型适配至新任务 + +许多扩散系统共享相同的组件架构,这使得您能够将针对某一任务预训练的模型调整适配至完全不同的新任务。 + +本指南将展示如何通过初始化并修改预训练 [`UNet2DConditionModel`] 的架构,将文生图预训练模型改造为图像修复(inpainting)模型。 + +## 配置 UNet2DConditionModel 参数 + +默认情况下,[`UNet2DConditionModel`] 的[输入样本](https://huggingface.co/docs/diffusers/v0.16.0/en/api/models#diffusers.UNet2DConditionModel.in_channels)接受4个通道。例如加载 [`stable-diffusion-v1-5/stable-diffusion-v1-5`](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5) 这样的文生图预训练模型,查看其 `in_channels` 参数值: + +```python +from diffusers import StableDiffusionPipeline + +pipeline = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True) +pipeline.unet.config["in_channels"] +4 +``` + +而图像修复任务需要输入样本具有9个通道。您可以在 [`runwayml/stable-diffusion-inpainting`](https://huggingface.co/runwayml/stable-diffusion-inpainting) 这样的预训练修复模型中验证此参数: + +```python +from diffusers import StableDiffusionPipeline + +pipeline = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-inpainting", use_safetensors=True) +pipeline.unet.config["in_channels"] +9 +``` + +要将文生图模型改造为修复模型,您需要将 `in_channels` 参数从4调整为9。 + +初始化一个加载了文生图预训练权重的 [`UNet2DConditionModel`],并将 `in_channels` 设为9。由于输入通道数变化导致张量形状改变,需要设置 `ignore_mismatched_sizes=True` 和 `low_cpu_mem_usage=False` 来避免尺寸不匹配错误。 + +```python +from diffusers import AutoModel + +model_id = "stable-diffusion-v1-5/stable-diffusion-v1-5" +unet = AutoModel.from_pretrained( + model_id, + subfolder="unet", + in_channels=9, + low_cpu_mem_usage=False, + ignore_mismatched_sizes=True, + use_safetensors=True, +) +``` + +此时文生图模型的其他组件权重仍保持预训练状态,但UNet的输入卷积层权重(`conv_in.weight`)会随机初始化。由于这一关键变化,必须对模型进行修复任务的微调,否则模型将仅会输出噪声。 + Disclaimers: This content is powered by i18n-agent-action with LLM service https://api.deepseek.com with model deepseek-chat, for some reason, (for example, we are not native speaker) we use LLM to provide this translate for you. If you find any corrections, please file an issue or raise a PR back to github, and switch back to default language. \ No newline at end of file diff --git a/docs/source/zh/using-diffusers/loading.md b/docs/source/zh/using-diffusers/loading.md new file mode 100644 index 000000000000..5974a10e4364 --- /dev/null +++ b/docs/source/zh/using-diffusers/loading.md @@ -0,0 +1,613 @@ +# 加载流程管道 + +[[在Colab中打开]] + +扩散系统由参数化模型和调度器等多个组件组成,这些组件以复杂的方式交互。为此我们设计了[`DiffusionPipeline`],将整个扩散系统的复杂性封装成简单易用的API。同时[`DiffusionPipeline`]完全可定制,您可以修改每个组件来构建适合自己需求的扩散系统。 + +本指南将展示如何加载: +- 从Hub和本地加载流程管道 +- 将不同组件加载到流程管道中 +- 在不增加内存使用的情况下加载多个流程管道 +- 检查点变体,如不同的浮点类型或非指数移动平均(EMA)权重 + +## 加载流程管道 + +> [!TIP] +> 如果您对[`DiffusionPipeline`]类的工作原理感兴趣,可直接跳转到[DiffusionPipeline详解](#diffusionpipeline-explained)部分。 + +加载任务流程管道有两种方式: +1. 加载通用的[`DiffusionPipeline`]类,让它自动从检查点检测正确的流程管道类 +2. 为特定任务加载特定的流程管道类 + + + + +[`DiffusionPipeline`]类是从[Hub](https://huggingface.co/models?library=diffusers&sort=trending)加载最新热门扩散模型的简单通用方法。它使用[`~DiffusionPipeline.from_pretrained`]方法自动从检查点检测任务的正确流程管道类,下载并缓存所有需要的配置和权重文件,返回一个可用于推理的流程管道。 + +```python +from diffusers import DiffusionPipeline + +pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True) +``` + +同样的检查点也可以用于图像到图像任务。[`DiffusionPipeline`]类可以处理任何任务,只要您提供适当的输入。例如,对于图像到图像任务,您需要向流程管道传递初始图像。 + +```py +from diffusers import DiffusionPipeline + +pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True) + +init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png") +prompt = "丛林中的宇航员,彩色" +``` +以下是您提供的英文内容的中文翻译,保持Diffusers、stable_diffusion、consisid等专有名词不译,并保留Markdown格式: + +--- + +### 特定任务管道 + +若已知模型对应的具体管道类,可直接通过该类加载检查点。例如加载Stable Diffusion模型时,使用[`StableDiffusionPipeline`]类: + +```python +from diffusers import StableDiffusionPipeline + +pipeline = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True) +``` + +同一检查点也可用于其他任务(如图像到图像生成)。此时需改用对应任务的管道类,例如使用[`StableDiffusionImg2ImgPipeline`]加载相同检查点: + +```python +from diffusers import StableDiffusionImg2ImgPipeline + +pipeline = StableDiffusionImg2ImgPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True) +``` + +--- + +### 组件级数据类型指定 + +通过向`torch_dtype`参数传递字典,可为不同子模型定制数据类型。例如以`torch.bfloat16`精度加载transformer组件,其他组件默认使用`torch.float16`: + +```python +from diffusers import HunyuanVideoPipeline +import torch + +pipe = HunyuanVideoPipeline.from_pretrained( + "hunyuanvideo-community/HunyuanVideo", + torch_dtype={"transformer": torch.bfloat16, "default": torch.float16}, +) +print(pipe.transformer.dtype, pipe.vae.dtype) # 输出: (torch.bfloat16, torch.float16) +``` + +若组件未在字典中显式指定且未设置`default`,将默认加载为`torch.float32`。 + +--- + +### 本地管道加载 + +使用[git-lfs](https://git-lfs.github.com/)手动下载检查点到本地后加载: + +```bash +git-lfs install +git clone https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5 +``` + +下载完成后,将本地路径(如`./stable-diffusion-v1-5`)传递给[`~DiffusionPipeline.from_pretrained`]: + +```python +from diffusers import DiffusionPipeline + +stable_diffusion = DiffusionPipeline.from_pretrained("./stable-diffusion-v1-5", use_safetensors=True) +``` + +--- + +### 内存需求评估工具 + +在下载前,可通过下方空间评估管道内存需求以确认硬件兼容性: + +
+ +
+ +### 自定义管道 + +您可以通过向管道中加载不同的组件来实现定制化。这一点非常重要,因为您可以: + +- 根据需求切换为生成速度更快或生成质量更高的调度器(通过调用管道上的`scheduler.compatibles`方法查看兼容的调度器) +- 将默认管道组件替换为更新且性能更优的版本 + +例如,让我们用以下组件定制默认的[stabilityai/stable-diffusion-xl-base-1.0](https://hf.co/stabilityai/stable-diffusion-xl-base-1.0)模型: + +- 使用[`HeunDiscreteScheduler`]以牺牲生成速度为代价来生成更高质量的图像。必须传入`subfolder="scheduler"`参数到[`~HeunDiscreteScheduler.from_pretrained`],以便从管道仓库的正确[子文件夹](https://hf.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main/scheduler)加载调度器配置。 +- 使用在fp16模式下运行更稳定的VAE。 + +```python +from diffusers import StableDiffusionXLPipeline, HeunDiscreteScheduler, AutoencoderKL +import torch + +scheduler = HeunDiscreteScheduler.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", subfolder="scheduler") +vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16, use_safetensors=True) +``` + +现在将新的调度器和VAE传入[`StableDiffusionXLPipeline`]: + +```python +pipeline = StableDiffusionXLPipeline.from_pretrained( + "stabilityai/stable-diffusion-xl-base-1.0", + scheduler=scheduler, + vae=vae, + torch_dtype=torch.float16, + variant="fp16", + use_safetensors=True +).to("cuda") +``` + +### 复用管道 + +当您加载多个共享相同模型组件的管道时,复用这些共享组件比重新将所有内容加载到内存中更有意义,尤其是在硬件内存受限的情况下。例如: + +1. 您使用[`StableDiffusionPipeline`]生成了一张图像,但想通过[`StableDiffusionSAGPipeline`]提升其质量。这两个管道共享相同的预训练模型,因此加载两次会浪费内存。 +2. 您想向从现有[`StableDiffusionPipeline`]实例化的[`AnimateDiffPipeline`]中添加一个模型组件(如[`MotionAdapter`](../api/pipelines/animatediff#animatediffpipeline))。同样,这两个管道共享相同的预训练模型,加载全新管道会浪费内存。 + +通过[`DiffusionPipeline.from_pipe`] API,您可以在多个管道之间切换,利用它们的不同特性而不会增加内存使用。这类似于在管道中开启或关闭某个功能。 + +> [!提示] +> 若要在不同任务(而非功能)之间切换,请使用[`~DiffusionPipeline`]方法。 +以下是您提供的英文内容的中文翻译,保持Diffusers、stable_diffusion、consisid等专有名词不变,并保留Markdown格式: + +(此为文档10部分中的第4部分) + +使用[`AutoPipeline`](../api/pipelines/auto_pipeline)类的[`~DiffusionPipeline.from_pipe`]方法可以自动根据任务识别管道类别(更多细节请参阅[AutoPipeline教程](../tutorials/autopipeline))。 + +让我们从[`StableDiffusionPipeline`]开始,然后复用已加载的模型组件创建[`StableDiffusionSAGPipeline`]来提升生成质量。您将使用搭载[IP-Adapter](./ip_adapter)的[`StableDiffusionPipeline`]生成一张熊吃披萨的图片。 + +```python +from diffusers import DiffusionPipeline, StableDiffusionSAGPipeline +import torch +import gc +from diffusers.utils import load_image +from accelerate.utils import compute_module_sizes + +image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/load_neg_embed.png") + +pipe_sd = DiffusionPipeline.from_pretrained("SG161222/Realistic_Vision_V6.0_B1_noVAE", torch_dtype=torch.float16) +pipe_sd.load_ip_adapter("h94/IP-Adapter", subfolder="models", weight_name="ip-adapter_sd15.bin") +pipe_sd.set_ip_adapter_scale(0.6) +pipe_sd.to("cuda") + +generator = torch.Generator(device="cpu").manual_seed(33) +out_sd = pipe_sd( + prompt="熊吃披萨", + negative_prompt="白平衡错误, 昏暗, 草图, 最差质量, 低质量", + ip_adapter_image=image, + num_inference_steps=50, + generator=generator, +).images[0] +out_sd +``` + +
+ +
+ +作为参考,您可以查看此过程消耗的内存情况。 + +```python +def bytes_to_giga_bytes(bytes): + return bytes / 1024 / 1024 / 1024 +print(f"最大内存占用: {bytes_to_giga_bytes(torch.cuda.max_memory_allocated())} GB") +"最大内存占用: 4.406213283538818 GB" +``` + +现在通过[`~DiffusionPipeline.from_pipe`]方法,将[`StableDiffusionPipeline`]中的管道组件复用到[`StableDiffusionSAGPipeline`]中。 + +> [!警告] +> 某些管道方法在通过[`~DiffusionPipeline.from_pipe`]创建的新管道上可能无法正常工作。例如[`~DiffusionPipeline.enable_model_cpu_offload`]方法会根据每个管道独特的卸载序列在模型组件上安装钩子。如果新管道中模型执行顺序不同,CPU卸载可能无法正确工作。 +> +> 为确保功能正常,我们建议对通过[`~DiffusionPipeline.from_pipe`]创建的新管道重新应用管道方法。 + +```python +pipe_sag = StableDiffusionSAGPipeline.from_pipe( + pipe_sd +) + +generator = torch.Generator(device="cpu").manual_seed(33) +out_sag = pipe_sag( + prompt="熊吃披萨", + negative_prompt="白平衡错误, 昏暗, 草图, 最差质量, 低质量", + ip_adapter_image=image, + num_inference_steps=50, + generator=generator, + guidance_scale=1.0, + sag_scale=0.75 +).images[0] +out_sag +``` + +
+ +
+
+ +
+ +如果检查内存使用情况,会发现与之前保持一致,因为 [`StableDiffusionPipeline`] 和 [`StableDiffusionSAGPipeline`] 共享相同的管道组件。这使得您可以互换使用它们,而无需额外的内存开销。 + +```py +print(f"最大内存分配量: {bytes_to_giga_bytes(torch.cuda.max_memory_allocated())} GB") +"最大内存分配量: 4.406213283538818 GB" +``` + +接下来,我们使用 [`AnimateDiffPipeline`] 为图像添加动画效果,同时向管道中添加 [`MotionAdapter`] 模块。对于 [`AnimateDiffPipeline`],需要先卸载 IP-Adapter,并在创建新管道后重新加载(这一步骤仅适用于 [`AnimateDiffPipeline`])。 + +```py +from diffusers import AnimateDiffPipeline, MotionAdapter, DDIMScheduler +from diffusers.utils import export_to_gif + +pipe_sag.unload_ip_adapter() +adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2", torch_dtype=torch.float16) + +pipe_animate = AnimateDiffPipeline.from_pipe(pipe_sd, motion_adapter=adapter) +pipe_animate.scheduler = DDIMScheduler.from_config(pipe_animate.scheduler.config, beta_schedule="linear") +# 重新加载 IP-Adapter 和 LoRA 权重 +pipe_animate.load_ip_adapter("h94/IP-Adapter", subfolder="models", weight_name="ip-adapter_sd15.bin") +pipe_animate.load_lora_weights("guoyww/animatediff-motion-lora-zoom-out", adapter_name="zoom-out") +pipe_animate.to("cuda") + +generator = torch.Generator(device="cpu").manual_seed(33) +pipe_animate.set_adapters("zoom-out", adapter_weights=0.75) +out = pipe_animate( + prompt="熊吃披萨", + num_frames=16, + num_inference_steps=50, + ip_adapter_image=image, + generator=generator, +).frames[0] +export_to_gif(out, "out_animate.gif") +``` + +
+ +
+ +[`AnimateDiffPipeline`] 对内存的需求更高,会消耗 15GB 内存(关于这对内存使用的影响,请参阅 [from_pipe 的内存使用情况](#memory-usage-of-from_pipe) 部分)。 + +```py +print(f"最大内存分配量: {bytes_to_giga_bytes(torch.cuda.max_memory_allocated())} GB") +"最大内存分配量: 15.178664207458496 GB" +``` + +### 修改 from_pipe 组件 + +通过 [`~DiffusionPipeline.from_pipe`] 加载的管道可以使用不同的模型组件或方法进行自定义。但是,每当修改模型组件的状态时,会影响共享相同组件的所有其他管道。例如,如果在 [`StableDiffusionSAGPipeline`] 上调用 [`~diffusers.loaders.IPAdapterMixin.unload_ip_adapter`],那么将无法在 [`StableDiffusionPipeline`] 中使用 IP-Adapter,因为它已从共享组件中移除。 + +```py +pipe.sag_unload_ip_adapter() + +generator = to +```markdown +rch.Generator(device="cpu").manual_seed(33) +out_sd = pipe_sd( + prompt="熊吃披萨", + negative_prompt="白平衡错误, 黑暗, 草图, 最差质量, 低质量", + ip_adapter_image=image, + num_inference_steps=50, + generator=generator, +).images[0] +"AttributeError: 'NoneType' object has no attribute 'image_projection_layers'" +``` + +### from_pipe的内存占用 + +使用[`~DiffusionPipeline.from_pipe`]加载多个流程时,内存需求取决于内存占用最高的流程,与创建的流程数量无关。 + +| 流程类型 | 内存占用 (GB) | +|---|---| +| StableDiffusionPipeline | 4.400 | +| StableDiffusionSAGPipeline | 4.400 | +| AnimateDiffPipeline | 15.178 | + +由于[`AnimateDiffPipeline`]内存需求最高,因此*总内存占用*仅基于该流程。只要后续创建的流程内存需求不超过[`AnimateDiffPipeline`],内存占用就不会增加。各流程可交替使用,不会产生额外内存开销。 + +## 安全检测器 + +Diffusers为Stable Diffusion模型实现了[安全检测器](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/safety_checker.py),用于筛查可能生成的有害内容。该检测器会将生成输出与已知的NSFW内容硬编码库进行比对。如需禁用安全检测器,可向[`~DiffusionPipeline.from_pretrained`]方法传递`safety_checker=None`参数。 + +```python +from diffusers import DiffusionPipeline + +pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", safety_checker=None, use_safetensors=True) +""" +您已通过传递`safety_checker=None`禁用了的安全检测器。请确保遵守Stable Diffusion许可条款,避免在公开服务或应用中展示未过滤结果。Diffusers团队和Hugging Face强烈建议在所有面向公众的场景中保持安全过滤器启用,仅在进行网络行为分析或结果审计时禁用。更多信息请参阅https://github.com/huggingface/diffusers/pull/254。 +""" +``` + +## 检查点变体 + +检查点变体通常指以下两种权重类型: + +- 存储为不同浮点类型(如[torch.float16](https://pytorch.org/docs/stable/tensors.html#data-types))的检查点,下载仅需一半带宽和存储空间。但继续训练或使用CPU时不可用此变体。 +- 非指数移动平均(Non-EMA)权重,此类变体不应用于推理,仅适用于继续微调模型。 + +> [!提示] +> 当检查点包含...(后续内容待补充) +### 模型变体 + +即使模型结构完全相同,但如果它们在不同的数据集上训练或采用了不同的训练配置,就应当存放在独立的代码库中。例如,[stabilityai/stable-diffusion-2](https://hf.co/stabilityai/stable-diffusion-2) 和 [stabilityai/stable-diffusion-2-1](https://hf.co/stabilityai/stable-diffusion-2-1) 就分别存储在不同的代码库中。 + +反之,若某个变体与原检查点**完全一致**,则意味着它们具有相同的序列化格式(如 [safetensors](./using_safetensors))、完全一致的模型结构,且所有张量权重形状均相同。 + +| **检查点类型** | **权重文件名** | **加载参数** | +|----------------------|-------------------------------------------|---------------------------| +| 原始版本 | diffusion_pytorch_model.safetensors | - | +| 浮点精度变体 | diffusion_pytorch_model.fp16.safetensors | `variant`, `torch_dtype` | +| 非EMA变体 | diffusion_pytorch_model.non_ema.safetensors| `variant` | + +加载变体时有两个关键参数: + +- `torch_dtype` 指定加载权重的浮点精度。例如,若想通过加载 fp16 变体节省带宽,需同时设置 `variant="fp16"` 和 `torch_dtype=torch.float16` 以*将权重转换为 fp16*。若仅设置 `torch_dtype=torch.float16`,系统会先下载默认的 fp32 权重再执行转换。 + +- `variant` 指定从代码库加载哪个文件。例如,要从 [stable-diffusion-v1-5](https://hf.co/stable-diffusion-v1-5/stable-diffusion-v1-5/tree/main/unet) 加载 UNet 的非EMA变体,需设置 `variant="non_ema"` 来下载对应的 `non_ema` 文件。 + + + + +```python +from diffusers import DiffusionPipeline +import torch + +pipeline = DiffusionPipeline.from_pretrained( + "stable-diffusion-v1-5/stable-diffusion-v1-5", + variant="fp16", + torch_dtype=torch.float16, + use_safetensors=True +) +``` + + + + +```python +pipeline = DiffusionPipeline.from_pretrained( + "stable-diffusion-v1-5/stable-diffusion-v1-5", + variant="non_ema", + use_safetensors=True +) +``` + + + + +通过 [`DiffusionPipeline.save_pretrained`] 方法的 `variant` 参数,可将检查点保存为不同浮点精度或非EMA变体。建议将变体保存在原始检查点同一目录下,以便从同一位置加载不同版本。 + + + + +```python +from diffusers import DiffusionPipeline + +pipeline.save_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", variant="fp16") +``` + + + + +```python +pipeline.save_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", variant="non_ema") +``` + + + +以下是您提供的英文内容的中文翻译,保留了Diffusers、stable_diffusion、consisid等专有名词的英文形式,并维持了Markdown格式: + +```markdown +on-v1-5/stable-diffusion-v1-5", variant="non_ema") +``` + +
+
+ +如果不将变体保存到现有文件夹中,则必须指定 `variant` 参数,否则会抛出 `Exception` 异常,因为它无法找到原始检查点。 + +```python +# 👎 这种方式不可行 +pipeline = DiffusionPipeline.from_pretrained( + "./stable-diffusion-v1-5", torch_dtype=torch.float16, use_safetensors=True +) +# 👍 这种方式可行 +pipeline = DiffusionPipeline.from_pretrained( + "./stable-diffusion-v1-5", variant="fp16", torch_dtype=torch.float16, use_safetensors=True +) +``` + +## DiffusionPipeline 原理解析 + +作为类方法,[`DiffusionPipeline.from_pretrained`] 主要承担两项职责: + +- 下载推理所需的最新版文件夹结构并缓存。若本地缓存中已存在最新文件夹结构,[`DiffusionPipeline.from_pretrained`] 会直接复用缓存而不会重复下载文件。 +- 将缓存的权重加载至正确的流水线[类](../api/pipelines/overview#diffusers-summary)(该信息从 `model_index.json` 文件中获取),并返回其实例。 + +流水线的底层文件夹结构与其类实例直接对应。例如,[`StableDiffusionPipeline`] 对应 [`stable-diffusion-v1-5/stable-diffusion-v1-5`](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5) 中的文件夹结构。 + +```python +from diffusers import DiffusionPipeline + +repo_id = "stable-diffusion-v1-5/stable-diffusion-v1-5" +pipeline = DiffusionPipeline.from_pretrained(repo_id, use_safetensors=True) +print(pipeline) +``` + +您会看到 pipeline 是 [`StableDiffusionPipeline`] 的实例,由七个组件构成: + +- `"feature_extractor"`:来自 🤗 Transformers 的 [`~transformers.CLIPImageProcessor`]。 +- `"safety_checker"`:用于屏蔽有害内容的[组件](https://github.com/huggingface/diffusers/blob/e55687e1e15407f60f32242027b7bb8170e58266/src/diffusers/pipelines/stable_diffusion/safety_checker.py#L32)。 +- `"scheduler"`:[`PNDMScheduler`] 的实例。 +- `"text_encoder"`:来自 🤗 Transformers 的 [`~transformers.CLIPTextModel`]。 +- `"tokenizer"`:来自 🤗 Transformers 的 [`~transformers.CLIPTokenizer`]。 +- `"unet"`:[`UNet2DConditionModel`] 的实例。 +- `"vae"`:[`AutoencoderKL`] 的实例。 + +```json +StableDiffusionPipeline { + "feature_extractor": [ + "transformers", + "CLIPImageProcessor" + ], + "safety_checker": [ + "stable_diffusion", + "StableDiffusionSafetyChecker" + ], + "scheduler": [ + "diffusers", + "PNDMScheduler" + ], + "text_encoder": [ + "transformers", + "CLIPTextModel" + ], + "tokenizer": [ + "transformers", + "CLIPTokenizer" + ], + "unet": [ + "diffusers", + "UNet2DConditionModel" + ], + "vae": [ + "diffusers", + "AutoencoderKL" + ] +} +``` + +将流水线实例的组件与 [`stable-diffusion-v1-5/stable-diffusion-v1-5`](https://huggingface.co/stable-diffusion-v1-5/stable-diffusio +``` + +(注:由于您提供的英文内容在结尾处被截断,中文翻译也保持相同截断位置。若需完整翻译最后部分,请提供剩余内容。) +以下是您提供的英文内容的中文翻译,已按要求保留Diffusers、stable_diffusion等专有名词不翻译,并保持Markdown格式: + +(这是文档10部分中的第9部分) + +观察[stable_diffusion-v1-5](https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main)的文件夹结构,您会发现仓库中每个组件都有独立的文件夹: + +``` +. +├── feature_extractor +│   └── preprocessor_config.json +├── model_index.json +├── safety_checker +│   ├── config.json +| ├── model.fp16.safetensors +│ ├── model.safetensors +│ ├── pytorch_model.bin +| └── pytorch_model.fp16.bin +├── scheduler +│   └── scheduler_config.json +├── text_encoder +│   ├── config.json +| ├── model.fp16.safetensors +│ ├── model.safetensors +│ |── pytorch_model.bin +| └── pytorch_model.fp16.bin +├── tokenizer +│   ├── merges.txt +│   ├── special_tokens_map.json +│   ├── tokenizer_config.json +│   └── vocab.json +├── unet +│   ├── config.json +│   ├── diffusion_pytorch_model.bin +| |── diffusion_pytorch_model.fp16.bin +│ |── diffusion_pytorch_model.f16.safetensors +│ |── diffusion_pytorch_model.non_ema.bin +│ |── diffusion_pytorch_model.non_ema.safetensors +│ └── diffusion_pytorch_model.safetensors +|── vae +. ├── config.json +. ├── diffusion_pytorch_model.bin + ├── diffusion_pytorch_model.fp16.bin + ├── diffusion_pytorch_model.fp16.safetensors + └── diffusion_pytorch_model.safetensors +``` + +您可以通过属性访问管道的每个组件来查看其配置: + +```py +pipeline.tokenizer +CLIPTokenizer( + name_or_path="/root/.cache/huggingface/hub/models--runwayml--stable-diffusion-v1-5/snapshots/39593d5650112b4cc580433f6b0435385882d819/tokenizer", + vocab_size=49408, + model_max_length=77, + is_fast=False, + padding_side="right", + truncation_side="right", + special_tokens={ + "bos_token": AddedToken("<|startoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=True), + "eos_token": AddedToken("<|endoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=True), + "unk_token": AddedToken("<|endoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=True), + "pad_token": "<|endoftext|>", + }, + clean_up_tokenization_spaces=True +) +``` + +每个管道都需要一个[`model_index.json`](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/blob/main/model_index.json)文件,该文件会告诉[`DiffusionPipeline`]: + +- 从`_class_name`加载哪个管道类 +- 创建模型时使用的🧨 Diffusers版本`_diffusers_version` +- 子文件夹中存储了哪些库的哪些组件(`name`对应组件和子文件夹名称,`library`对应要加载类的库名,`class`对应类名) + +```json +{ + "_class_name": "StableDiffusionPipeline", + "_diffusers_version": "0.6.0", + "feature_extractor": [ + "transformers", + "CLIPImageProcessor" + ], + "safety_checker": [ + "stable_diffusion", + "StableDiffusionSafetyChecker" + ], + "scheduler": [ + "diffusers", + "PNDMScheduler" + ], + "text_encoder": [ + "transformers", + "CLIPTextModel" + ], + "tokenizer": [ + "transformers", +``` +```json +{ + "text_encoder": [ + "transformers", + "CLIPTextModel" + ], + "tokenizer": [ + "transformers", + "CLIPTokenizer" + ], + "unet": [ + "diffusers", + "UNet2DConditionModel" + ], + "vae": [ + "diffusers", + "AutoencoderKL" + ] +} +``` From 0d4a51c83e9210984ab5dbddac704f3320fa0be4 Mon Sep 17 00:00:00 2001 From: SamYuan1990 Date: Fri, 1 Aug 2025 10:31:56 +0800 Subject: [PATCH 3/7] fix, updated some prompt for better translation Signed-off-by: SamYuan1990 --- docs/source/zh/conceptual/contribution.md | 492 +++++++++++++++++ docs/source/zh/conceptual/evaluation.md | 557 ++++++++++++++++++++ docs/source/zh/using-diffusers/loading.md | 613 ---------------------- 3 files changed, 1049 insertions(+), 613 deletions(-) create mode 100644 docs/source/zh/conceptual/contribution.md create mode 100644 docs/source/zh/conceptual/evaluation.md delete mode 100644 docs/source/zh/using-diffusers/loading.md diff --git a/docs/source/zh/conceptual/contribution.md b/docs/source/zh/conceptual/contribution.md new file mode 100644 index 000000000000..4656c18e48ee --- /dev/null +++ b/docs/source/zh/conceptual/contribution.md @@ -0,0 +1,492 @@ + + +# 如何为Diffusers 🧨做贡献 + +我们❤️来自开源社区的贡献!欢迎所有人参与,所有类型的贡献——不仅仅是代码——都受到重视和赞赏。回答问题、帮助他人、主动交流以及改进文档对社区都极具价值,所以如果您愿意参与,请不要犹豫! + +我们鼓励每个人先在公开Discord频道里打招呼👋。在那里我们讨论扩散模型的最新趋势、提出问题、展示个人项目、互相协助贡献,或者只是闲聊☕。加入Discord社区 + +无论您选择以何种方式贡献,我们都致力于成为一个开放、友好、善良的社区。请阅读我们的[行为准则](https://github.com/huggingface/diffusers/blob/main/CODE_OF_CONDUCT.md),并在互动时注意遵守。我们也建议您了解指导本项目的[伦理准则](https://huggingface.co/docs/diffusers/conceptual/ethical_guidelines),并请您遵循同样的透明度和责任原则。 + +我们高度重视社区的反馈,所以如果您认为自己有能帮助改进库的有价值反馈,请不要犹豫说出来——每条消息、评论、issue和拉取请求(PR)都会被阅读和考虑。 + +## 概述 + +您可以通过多种方式做出贡献,从在issue和讨论区回答问题,到向核心库添加新的扩散模型。 + +下面我们按难度升序列出不同的贡献方式,所有方式对社区都很有价值: + +* 1. 在[Diffusers讨论论坛](https://discuss.huggingface.co/c/discussion-related-to-httpsgithubcomhuggingfacediffusers)或[Discord](https://discord.gg/G7tWnz98XR)上提问和回答问题 +* 2. 在[GitHub Issues标签页](https://github.com/huggingface/diffusers/issues/new/choose)提交新issue,或在[GitHub Discussions标签页](https://github.com/huggingface/diffusers/discussions/new/choose)发起新讨论 +* 3. 在[GitHub Issues标签页](https://github.com/huggingface/diffusers/issues)解答issue,或在[GitHub Discussions标签页](https://github.com/huggingface/diffusers/discussions)参与讨论 +* 4. 解决标记为"Good first issue"的简单问题,详见[此处](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) +* 5. 参与[文档](https://github.com/huggingface/diffusers/tree/main/docs/source)建设 +* 6. 贡献[社区Pipeline](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3Acommunity-examples) +* 7. 完善[示例代码](https://github.com/huggingface/diffusers/tree/main/examples) +* 8. 解决标记为"Good second issue"的中等难度问题,详见[此处](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+second+issue%22) +* 9. 添加新pipeline/模型/调度器,参见["New Pipeline/Model"](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22New+pipeline%2Fmodel%22)和["New scheduler"](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22New+scheduler%22)类issue。此类贡献请先阅读[设计哲学](https://github.com/huggingface/diffusers/blob/main/PHILOSOPHY.md) + +重申:所有贡献对社区都具有重要价值。下文将详细说明各类贡献方式。 + +对于4-9类贡献,您需要提交PR(拉取请求),具体操作详见[如何提交PR](#how-to-open-a-pr)章节。 + +### 1. 在Diffusers讨论区或Discord提问与解答 + +任何与Diffusers库相关的问题或讨论都可以发布在[官方论坛](https://discuss.huggingface.co/c/discussion-related-to-httpsgithubcomhuggingfacediffusers/)或[Discord频道](https://discord.gg/G7tWnz98XR),包括但不限于: +- 分享训练/推理实验报告 +- 展示个人项目 +- 咨询非官方训练示例 +- 项目提案 +- 通用反馈 +- 论文解读 +- 基于Diffusers库的个人项目求助 +- 一般性问题 +- 关于扩散模型的伦理讨论 +- ... + +论坛/Discord上的每个问题都能促使社区公开分享知识,很可能帮助未来遇到相同问题的初学者。请务必提出您的疑问。 +同样地,通过回答问题您也在为社区创造公共知识文档,这种贡献极具价值。 + +请注意:提问/回答时投入的精力越多,产生的公共知识质量就越高。精心构建的问题与专业解答能形成高质量知识库,而表述不清的问题则可能降低讨论价值。 + +低质量的问题或回答会降低公共知识库的整体质量。 +简而言之,高质量的问题或回答应具备*精确性*、*简洁性*、*相关性*、*易于理解*、*可访问性*和*格式规范/表述清晰*等特质。更多详情请参阅[如何提交优质议题](#how-to-write-a-good-issue)章节。 + +**关于渠道的说明**: +[*论坛*](https://discuss.huggingface.co/c/discussion-related-to-httpsgithubcomhuggingfacediffusers/63)的内容能被谷歌等搜索引擎更好地收录,且帖子按热度而非时间排序,便于查找历史问答。此外,论坛内容更容易被直接链接引用。 +而*Discord*采用即时聊天模式,适合快速交流。虽然在Discord上可能更快获得解答,但信息会随时间淹没,且难以回溯历史讨论。因此我们强烈建议在论坛发布优质问答,以构建可持续的社区知识库。若Discord讨论产生有价值结论,建议将成果整理发布至论坛以惠及更多读者。 + +### 2. 在GitHub议题页提交新议题 + +🧨 Diffusers库的稳健性离不开用户的问题反馈,感谢您的报错。 + +请注意:GitHub议题仅限处理与Diffusers库代码直接相关的技术问题、错误报告、功能请求或库设计反馈。 +简言之,**与Diffusers库代码(含文档)无关**的内容应发布至[论坛](https://discuss.huggingface.co/c/discussion-related-to-httpsgithubcomhuggingfacediffusers/63)或[Discord](https://discord.gg/G7tWnz98XR)。 + +**提交新议题时请遵循以下准则**: +- 确认是否已有类似议题(使用GitHub议题页的搜索栏) +- 请勿在现有议题下追加新问题。若存在高度关联议题,应新建议题并添加相关链接 +- 确保使用英文提交。非英语用户可通过[DeepL](https://www.deepl.com/translator)等免费工具翻译 +- 检查升级至最新Diffusers版本是否能解决问题。提交前请确认`python -c "import diffusers; print(diffusers.__version__)"`显示的版本号不低于最新版本 +- 记请记住,你在提交新issue时投入的精力越多,得到的回答质量就越高,Diffusers项目的整体issue质量也会越好。 + +新issue通常包含以下内容: + +#### 2.1 可复现的最小化错误报告 + +错误报告应始终包含可复现的代码片段,并尽可能简洁明了。具体而言: +- 尽量缩小问题范围,**不要直接粘贴整个代码文件** +- 规范代码格式 +- 除Diffusers依赖库外,不要包含其他外部库 +- **务必**提供环境信息:可在终端运行`diffusers-cli env`命令,然后将显示的信息复制到issue中 +- 详细说明问题。如果读者不清楚问题所在及其影响,就无法解决问题 +- **确保**读者能以最小成本复现问题。如果代码片段因缺少库或未定义变量而无法运行,读者将无法提供帮助。请确保提供的可复现代码尽可能精简,可直接复制到Python shell运行 +- 如需特定模型/数据集复现问题,请确保读者能获取这些资源。可将模型/数据集上传至[Hub](https://huggingface.co)便于下载。尽量保持模型和数据集体积最小化,降低复现难度 + +更多信息请参阅[如何撰写优质issue](#how-to-write-a-good-issue)章节。 + +提交错误报告请点击[此处](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=bug&projects=&template=bug-report.yml)。 + +#### 2.2 功能请求 + +优质的功能请求应包含以下要素: + +1. 首先说明动机: +* 是否与库的使用痛点相关?若是,请解释原因,最好提供演示问题的代码片段 +* 是否因项目需求产生?我们很乐意了解详情! +* 是否是你已实现且认为对社区有价值的功能?请说明它为你解决了什么问题 +2. 用**完整段落**描述功能特性 +3. 提供**代码片段**演示预期用法 +4. 如涉及论文,请附上链接 +5. 可补充任何有助于理解的辅助材料(示意图、截图等) + +提交功能请求请点击[此处](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=&template=feature_request.md&title=)。 + +#### 2.3 设计反馈 + +关于库设计的反馈(无论正面还是负面)能极大帮助核心维护者打造更友好的库。要了解当前设计理念,请参阅[此文档](https://huggingface.co/docs/diffusers/conceptu + +### 2.3 设计理念反馈 + +Diffusers库遵循特定的[设计理念](https://github.com/huggingface/diffusers/blob/main/PHILOSOPHY.md)。如果您认为某个设计选择与当前理念不符,请说明原因及改进建议。如果某个设计选择因过度遵循理念而限制了使用场景,也请解释原因并提出调整方案。 +若某个设计对您特别实用,请同样留下备注——这对未来的设计决策极具参考价值。 + +您可通过[此链接](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=&template=feedback.md&title=)提交设计反馈。 + +#### 2.4 技术问题 + +技术问题主要涉及库代码的实现逻辑或特定功能模块的作用。提问时请务必: +- 附上相关代码链接 +- 详细说明难以理解的具体原因 + +技术问题提交入口:[点击此处](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=bug&template=bug-report.yml) + +#### 2.5 新模型/调度器/pipeline提案 + +若扩散模型社区发布了您希望集成到Diffusers库的新模型、pipeline或调度器,请提供以下信息: +* 简要说明并附论文或发布链接 +* 开源实现链接(如有) +* 模型权重下载链接(如已公开) + +若您愿意参与开发,请告知我们以便指导。另请尝试通过GitHub账号标记原始组件作者。 + +提案提交地址:[新建请求](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=New+model%2Fpipeline%2Fscheduler&template=new-model-addition.yml) + +### 3. 解答GitHub问题 + +回答GitHub问题可能需要Diffusers的技术知识,但我们鼓励所有人尝试参与——即使您对答案不完全确定。高质量回答的建议: +- 保持简洁精炼 +- 严格聚焦问题本身 +- 提供代码/论文等佐证材料 +- 优先用代码说话:若代码片段能解决问题,请提供完整可复现代码 + +许多问题可能存在离题、重复或无关情况。您可以通过以下方式协助维护者: +- 引导提问者精确描述问题 +- 标记重复issue并附原链接 +- 推荐用户至[论坛](https://discuss.huggingface.co/c/discussion-related-to-httpsgithubcomhuggingfacediffusers/63)或[Discord](https://discord.gg/G7tWnz98XR) + +(注:保留技术专有名词Diffusers/stable_diffusion/consisid原文) +在确认提交的Bug报告正确且需要修改源代码后,请继续阅读以下章节内容。 + +以下所有贡献都需要提交PR(拉取请求)。具体操作步骤详见[如何提交PR](#how-to-open-a-pr)章节。 + +### 4. 修复"Good first issue"类问题 + +标有[Good first issue](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)标签的问题通常已说明解决方案建议,便于修复。若该问题尚未关闭且您想尝试解决,只需留言"我想尝试解决这个问题"。通常有三种情况: +- a.) 问题描述已提出解决方案。若您认可该方案,可直接提交PR或草稿PR进行修复 +- b.) 问题描述未提出解决方案。您可询问修复建议,Diffusers团队会尽快回复。若有成熟解决方案,也可直接提交PR +- c.) 已有PR但问题未关闭。若原PR停滞,可新开PR并关联原PR(开源社区常见现象)。若PR仍活跃,您可通过建议、审查或协作等方式帮助原作者 + +### 5. 文档贡献 + +优秀库必然拥有优秀文档!官方文档是新用户的首要接触点,因此文档贡献具有极高价值。贡献形式包括: +- 修正拼写/语法错误 +- 修复文档字符串格式错误(如显示异常或链接失效) +- 修正文档字符串中张量的形状/维度描述 +- 优化晦涩或错误的说明 +- 更新过时代码示例 +- 文档翻译 + +[官方文档页面](https://huggingface.co/docs/diffusers/index)所有内容均属可修改范围,对应[文档源文件](https://github.com/huggingface/diffusers/tree/main/docs/source)可进行编辑。修改前请查阅[验证说明](https://github.com/huggingface/diffusers/tree/main/docs)。 +以下是翻译成中文的内容(保留Diffusers、stable_diffusion、consisid等术语不翻译): + +### 6. 贡献社区流程 + +> [!TIP] +> 阅读[社区流程](../using-diffusers/custom_pipeline_overview#community-pipelines)指南了解GitHub与Hugging Face Hub社区流程的区别。若想了解我们设立社区流程的原因,请查看GitHub Issue [#841](https://github.com/huggingface/diffusers/issues/841)(简而言之,我们无法维护扩散模型所有可能的推理使用方式,但也不希望限制社区构建这些流程)。 + +贡献社区流程是向社区分享创意与成果的绝佳方式。您可以在[`DiffusionPipeline`]基础上构建流程,任何人都能通过设置`custom_pipeline`参数加载使用。本节将指导您创建一个简单的"单步"流程——UNet仅执行单次前向传播并调用调度器一次。 + +1. 为社区流程创建one_step_unet.py文件。只要用户已安装相关包,该文件可包含任意所需包。确保仅有一个继承自[`DiffusionPipeline`]的流程类,用于从Hub加载模型权重和调度器配置。在`__init__`函数中添加UNet和调度器。 + + 同时添加`register_modules`函数,确保您的流程及其组件可通过[`~DiffusionPipeline.save_pretrained`]保存。 + +```py +from diffusers import DiffusionPipeline +import torch + +class UnetSchedulerOneForwardPipeline(DiffusionPipeline): + def __init__(self, unet, scheduler): + super().__init__() + + self.register_modules(unet=unet, scheduler=scheduler) +``` + +2. 在前向传播中(建议定义为`__call__`),可添加任意功能。对于"单步"流程,创建随机图像并通过设置`timestep=1`调用UNet和调度器一次。 + +```py + from diffusers import DiffusionPipeline + import torch + + class UnetSchedulerOneForwardPipeline(DiffusionPipeline): + def __init__(self, unet, scheduler): + super().__init__() + + self.register_modules(unet=unet, scheduler=scheduler) + + def __call__(self): + image = torch.randn( + (1, self.unet.config.in_channels, self.unet.config.sample_size, self.unet.config.sample_size), + ) + timestep = 1 + + model_output = self.unet(image, timestep).sample + scheduler_output = self.scheduler.step(model_output, timestep, image).prev_sample + + return scheduler_output +``` + +现在您可以通过传入UNet和调度器来运行流程,若流程结构相同也可加载预训练权重。 + +```python +from diffusers import DDPMScheduler, UNet2DModel + +scheduler = DDPMScheduler() +unet = UNet2DModel() + +pipeline = UnetSchedulerOneForwardPipeline(unet=unet, scheduler=scheduler) +output = pipeline() +# 加载预训练权重 +pipeline = UnetSchedulerOneForwardPipeline.from_pretrained("google/ddpm-cifar10-32", use_safetensors=True) +output = pipeline() +``` + +您可以选择将pipeline作为GitHub社区pipeline或Hub社区pipeline进行分享。 + + + + +通过向Diffusers[代码库](https://github.com/huggingface/diffusers)提交拉取请求来分享GitHub pipeline,将one_step_unet.py文件添加到[examples/community](https://github.com/huggingface/diffusers/tree/main/examples/community)子文件夹中。 + + + + +通过在Hub上创建模型仓库并上传one_step_unet.py文件来分享Hub pipeline。 + + + + +### 7. 贡献训练示例 + +Diffusers训练示例是位于[examples](https://github.com/huggingface/diffusers/tree/main/examples)目录下的训练脚本集合。 + +我们支持两种类型的训练示例: + +- 官方训练示例 +- 研究型训练示例 + +研究型训练示例位于[examples/research_projects](https://github.com/huggingface/diffusers/tree/main/examples/research_projects),而官方训练示例包含[examples](https://github.com/huggingface/diffusers/tree/main/examples)目录下除`research_projects`和`community`外的所有文件夹。 +官方训练示例由Diffusers核心维护者维护,研究型训练示例则由社区维护。 +这与[6. 贡献社区pipeline](#6-contribute-a-community-pipeline)中关于官方pipeline与社区pipeline的原因相同:核心维护者不可能维护扩散模型的所有可能训练方法。 +如果Diffusers核心维护者和社区认为某种训练范式过于实验性或不够普及,相应训练代码应放入`research_projects`文件夹并由作者维护。 + +官方训练和研究型示例都包含一个目录,其中含有一个或多个训练脚本、`requirements.txt`文件和`README.md`文件。用户使用时需要先克隆代码库: + +```bash +git clone https://github.com/huggingface/diffusers +``` + +并安装训练所需的所有额外依赖: + +```bash +cd diffusers +pip install -r examples//requirements.txt +``` + +因此添加示例时,`requirements.txt`文件应定义训练示例所需的所有pip依赖项,安装完成后用户即可运行示例训练脚本。可参考[DreamBooth的requirements.txt文件](https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/requirements.txt)。 +- 运行示例所需的所有代码应集中在单个Python文件中 +- 用户应能通过命令行`python .py --args`直接运行示例 +- 示例应保持简洁,主要展示如何使用Diffusers进行训练。示例脚本的目的**不是**创建最先进的扩散模型,而是复现已知训练方案,避免添加过多自定义逻辑。因此,这些示例也力求成为优质的教学材料。 + +提交示例时,强烈建议参考现有示例(如[dreambooth](https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py))来了解规范格式。 +我们强烈建议贡献者使用[Accelerate库](https://github.com/huggingface/accelerate),因其与Diffusers深度集成。 +当示例脚本完成后,请确保添加详细的`README.md`说明使用方法,包括: +- 运行示例的具体命令(示例参见[此处](https://github.com/huggingface/diffusers/tree/main/examples/dreambooth#running-locally-with-pytorch)) +- 训练结果链接(日志/模型等),展示用户可预期的效果(示例参见[此处](https://api.wandb.ai/report/patrickvonplaten/xm6cd5q5)) +- 若添加非官方/研究性训练示例,**必须注明**维护者信息(含Git账号),格式参照[此处](https://github.com/huggingface/diffusers/tree/main/examples/research_projects/intel_opts#diffusers-examples-with-intel-optimizations) + +贡献官方训练示例时,还需在对应目录添加测试文件(如[examples/dreambooth/test_dreambooth.py](https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/test_dreambooth.py)),非官方示例无需此步骤。 + +### 8. 处理"Good second issue"类问题 + +标有[Good second issue](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+second+issue%22)标签的问题通常比[Good first issues](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)更复杂。 +这类问题的描述通常不会提供详细解决指引,需要贡献者对库有较深理解。 +若您想解决此类问题,可直接提交PR并关联对应issue。若已有未合并的PR,请分析原因后提交改进版。需注意,Good second issue类PR的合并难度通常高于good first issues。在需要帮助的时候请不要犹豫,大胆的向核心维护者询问。 + +### 9. 添加管道、模型和调度器 + +管道(pipelines)、模型(models)和调度器(schedulers)是Diffusers库中最重要的组成部分。它们提供了对最先进扩散技术的便捷访问,使得社区能够构建强大的生成式AI应用。 + +通过添加新的模型、管道或调度器,您可能为依赖Diffusers的任何用户界面开启全新的强大用例,这对整个生成式AI生态系统具有巨大价值。 + +Diffusers针对这三类组件都有一些开放的功能请求——如果您还不确定要添加哪个具体组件,可以浏览以下链接: +- [模型或管道](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22New+pipeline%2Fmodel%22) +- [调度器](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22New+scheduler%22) + +在添加任何组件之前,强烈建议您阅读[设计哲学指南](philosophy),以更好地理解这三类组件的设计理念。请注意,如果添加的模型、调度器或管道与我们的设计理念存在严重分歧,我们将无法合并,因为这会导致API不一致。如果您从根本上不同意某个设计选择,请改为提交[反馈问题](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=&template=feedback.md&title=),以便讨论是否应该更改库中的特定设计模式/选择,以及是否更新我们的设计哲学。保持库内的一致性对我们非常重要。 + +请确保在PR中添加原始代码库/论文的链接,并最好直接在PR中@原始作者,以便他们可以跟踪进展并在有疑问时提供帮助。 + +如果您在PR过程中遇到不确定或卡住的情况,请随时留言请求初步审查或帮助。 + +#### 复制机制(Copied from) + +在添加任何管道、模型或调度器代码时,理解`# Copied from`机制是独特且重要的。您会在整个Diffusers代码库中看到这种机制,我们使用它的原因是为了保持代码库易于理解和维护。用`# Copied from`机制标记代码会强制标记的代码与复制来源的代码完全相同。这使得每当您运行`make fix-copies`时,可以轻松更新并将更改传播到多个文件。 + +例如,在下面的代码示例中,[`~diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput`]是原始代码,而`AltDiffusionPipelineOutput`使用`# Copied from`机制来复制它。唯一的区别是将类前缀从`Stable`改为`Alt`。 + +```py +# 从 diffusers.pipelines.stable_diffusion.pipeline_output.StableDiffusionPipelineOutput 复制并将 Stable 替换为 Alt +class AltDiffusionPipelineOutput(BaseOutput): + """ + Alt Diffusion 流水线的输出类。 + + 参数: + images (`List[PIL.Image.Image]` 或 `np.ndarray`) + 长度为 `batch_size` 的去噪 PIL 图像列表,或形状为 `(batch_size, height, width, num_channels)` 的 NumPy 数组。 + nsfw_content_detected (`List[bool]`) + 指示对应生成图像是否包含"不适合工作场所"(nsfw)内容的列表,若无法执行安全检查则为 `None`。 + """ +``` + +要了解更多信息,请阅读[~不要~重复自己*](https://huggingface.co/blog/transformers-design-philosophy#4-machine-learning-models-are-static)博客文章的相应部分。 + +## 如何撰写优质问题 + +**问题描述越清晰,被快速解决的可能性就越高。** + +1. 确保使用了正确的issue模板。您可以选择*错误报告*、*功能请求*、*API设计反馈*、*新模型/流水线/调度器添加*、*论坛*或空白issue。在[新建issue](https://github.com/huggingface/diffusers/issues/new/choose)时务必选择正确的模板。 +2. **精确描述**:为issue起一个恰当的标题。尽量用最简练的语言描述问题。提交issue时越精确,理解问题和潜在解决方案所需的时间就越少。确保一个issue只针对一个问题,不要将多个问题放在同一个issue中。如果发现多个问题,请分别创建多个issue。如果是错误报告,请尽可能精确描述错误类型——不应只写"diffusers出错"。 +3. **可复现性**:无法复现的代码片段 == 无法解决问题。如果遇到错误,维护人员必须能够复现它。确保包含一个可以复制粘贴到Python解释器中复现问题的代码片段。确保您的代码片段是可运行的,即没有缺少导入或图像链接等问题。issue应包含错误信息和可直接复制粘贴以复现相同错误的代码片段。如果issue涉及本地模型权重或无法被读者访问的本地数据,则问题无法解决。如果无法共享数据或模型,请尝试创建虚拟模型或虚拟数据。 +4. **最小化原则**:通过尽可能简洁的描述帮助读者快速理解问题。删除所有与问题无关的代码/信息。如果发现错误,请创建最简单的代码示例来演示问题,不要一发现错误就把整个工作流程都转储到issue中。例如,如果在训练模型时某个阶段出现错误或训练过程中遇到问题时,应首先尝试理解训练代码的哪部分导致了错误,并用少量代码尝试复现。建议使用模拟数据替代完整数据集进行测试。 +5. 添加引用链接。当提及特定命名、方法或模型时,请务必提供引用链接以便读者理解。若涉及具体PR或issue,请确保添加对应链接。不要假设读者了解你所指内容。issue中引用链接越丰富越好。 +6. 规范格式。请确保规范格式化issue内容:Python代码使用代码语法块,错误信息使用标准代码语法。详见[GitHub官方格式文档](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)。 +7. 请将issue视为百科全书的精美词条,而非待解决的工单。每个规范撰写的issue不仅是向维护者有效传递问题的方式,更是帮助社区深入理解库特性的公共知识贡献。 + +## 优质PR编写规范 + +1. 保持风格统一。理解现有设计模式和语法规范,确保新增代码与代码库现有结构无缝衔接。显著偏离现有设计模式或用户界面的PR将不予合并。 +2. 聚焦单一问题。每个PR应当只解决一个明确问题,避免"顺手修复其他问题"的陷阱。包含多个无关修改的PR会极大增加审查难度。 +3. 如适用,建议添加代码片段演示新增功能的使用方法。 +4. PR标题应准确概括其核心贡献。 +5. 若PR针对某个issue,请在描述中注明issue编号以建立关联(也让关注该issue的用户知晓有人正在处理); +6. 进行中的PR请在标题添加`[WIP]`前缀。这既能避免重复劳动,也可与待合并PR明确区分; +7. 文本表述与格式要求请参照[优质issue编写规范](#how-to-write-a-good-issue); +8. 确保现有测试用例全部通过; +9. 必须添加高覆盖率测试。未经充分测试的代码不予合并。 +- 若新增`@slow`测试,请使用`RUN_SLOW=1 python -m pytest tests/test_my_new_model.py`确保通过。 +CircleCI不执行慢速测试,但GitHub Actions会每日夜间运行! +10. 所有公开方法必须包含格式规范、兼容markdown的说明文档。可参考[`pipeline_latent_diffusion.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/latent_diffusion/pipeline_latent_diffusion.py) +11. 由于代码库快速增长,必须确保不会添加明显增加仓库体积的文件(如图片、视频等非文本文件)。建议优先使用托管在hf.co的`dataset`(例如[`hf-internal-testing`](https://huggingface.co/hf-internal-testing)或[huggingface/documentation-images](https://huggingface.co/datasets/huggingface/documentation-images))存放这类文件。若为外部贡献,可将图片添加到PR中并请Hugging Face成员将其迁移至该数据集。 + +## 提交PR流程 + +编写代码前,强烈建议先搜索现有PR或issue,确认没有重复工作。如有疑问,建议先创建issue获取反馈。 + +贡献至🧨 Diffusers需要基本的`git`技能。虽然`git`学习曲线较高,但其拥有最完善的手册。在终端输入`git --help`即可查阅,或参考书籍[Pro Git](https://git-scm.com/book/en/v2)。 + +请按以下步骤操作([支持的Python版本](https://github.com/huggingface/diffusers/blob/83bc6c94eaeb6f7704a2a428931cf2d9ad973ae9/setup.py#L270)): + +1. 在[仓库页面](https://github.com/huggingface/diffusers)点击"Fork"按钮创建代码副本至您的GitHub账户 + +2. 克隆fork到本地,并添加主仓库为远程源: + ```bash + $ git clone git@github.com:<您的GitHub账号>/diffusers.git + $ cd diffusers + $ git remote add upstream https://github.com/huggingface/diffusers.git + ``` + +3. 创建新分支进行开发: + ```bash + $ git checkout -b 您的开发分支名称 + ``` +**禁止**直接在`main`分支上修改 + +4. 在虚拟环境中运行以下命令配置开发环境: + ```bash + $ pip install -e ".[dev]" + ``` +若已克隆仓库,可能需要先执行`git pull`获取最新代码 + +5. 在您的分支上开发功能 + +开发过程中应确保测试通过。可运行受影响测试: + ```bash + $ pytest tests/<待测文件>.py + ``` +执行测试前请安装测试依赖: + ```bash + $ pip install -e ".[test]" + ``` +也可运行完整测试套件(需高性能机器): + ```bash + $ make test + ``` + +🧨 Diffusers使用`black`和`isort`工具保持代码风格统一。修改后请执行自动化格式校正与代码验证,以下内容无法通过以下命令一次性自动化完成: + +```bash +$ make style +``` + +🧨 Diffusers 还使用 `ruff` 和一些自定义脚本来检查代码错误。虽然质量控制流程会在 CI 中运行,但您也可以通过以下命令手动执行相同的检查: + +```bash +$ make quality +``` + +当您对修改满意后,使用 `git add` 添加更改的文件,并通过 `git commit` 在本地记录这些更改: + +```bash +$ git add modified_file.py +$ git commit -m "关于您所做更改的描述性信息。" +``` + +定期将您的代码副本与原始仓库同步是一个好习惯。这样可以快速适应上游变更: + +```bash +$ git pull upstream main +``` + +使用以下命令将更改推送到您的账户: + +```bash +$ git push -u origin 此处替换为您的描述性分支名称 +``` + +6. 确认无误后,请访问您 GitHub 账户中的派生仓库页面。点击「Pull request」将您的更改提交给项目维护者审核。 + +7. 如果维护者要求修改,这很正常——核心贡献者也会遇到这种情况!为了让所有人能在 Pull request 中看到变更,请在本地分支继续工作并将修改推送到您的派生仓库,这些变更会自动出现在 Pull request 中。 + +### 测试 + +我们提供了全面的测试套件来验证库行为和多个示例。库测试位于 [tests 文件夹](https://github.com/huggingface/diffusers/tree/main/tests)。 + +我们推荐使用 `pytest` 和 `pytest-xdist`,因为它们速度更快。在仓库根目录下运行以下命令执行库测试: + +```bash +$ python -m pytest -n auto --dist=loadfile -s -v ./tests/ +``` + +实际上,这就是 `make test` 的实现方式! + +您可以指定更小的测试范围来仅验证您正在开发的功能。 + +默认情况下会跳过耗时测试。设置 `RUN_SLOW` 环境变量为 `yes` 可运行这些测试。注意:这将下载数十 GB 的模型文件——请确保您有足够的磁盘空间、良好的网络连接或充足的耐心! + +```bash +$ RUN_SLOW=yes python -m pytest -n auto --dist=loadfile -s -v ./tests/ +``` + +我们也完全支持 `unittest`,运行方式如下: + +```bash +$ python -m unittest discover -s tests -t . -v +$ python -m unittest discover -s examples -t examples -v +``` + +### 将派生仓库的 main 分支与上游(HuggingFace)main 分支同步 + +为避免向上游仓库发送引用通知(这会给相关 PR 添加注释并向开发者发送不必要的通知),在同步派生仓库的 main 分支时,请遵循以下步骤: +1. 尽可能避免通过派生仓库的分支和 PR 来同步上游,而是直接合并到派生仓库的 main 分支 +2. 如果必须使用 PR,请在检出分支后执行以下操作: +```bash +$ git checkout -b 您的同步分支名称 +$ git pull --squash --no-commit upstream main +$ git commit -m '提交信息(不要包含 GitHub 引用)' +$ git push --set-upstream origin 您的分支名称 +``` + -branch-for-syncing +``` + +### 风格指南 + +对于文档字符串,🧨 Diffusers 遵循 [Google 风格指南](https://google.github.io/styleguide/pyguide.html)。 + Disclaimers: This content is powered by i18n-agent-action with LLM service https://api.deepseek.com with model deepseek-chat, for some reason, (for example, we are not native speaker) we use LLM to provide this translate for you. If you find any corrections, please file an issue or raise a PR back to github, and switch back to default language. \ No newline at end of file diff --git a/docs/source/zh/conceptual/evaluation.md b/docs/source/zh/conceptual/evaluation.md new file mode 100644 index 000000000000..ffc3d3e247ed --- /dev/null +++ b/docs/source/zh/conceptual/evaluation.md @@ -0,0 +1,557 @@ + + +# 扩散模型评估指南 + + + 在 Colab 中打开 + + +> [!TIP] +> 鉴于当前已出现针对图像生成扩散模型的成熟评估框架(如[HEIM](https://crfm.stanford.edu/helm/heim/latest/)、[T2I-Compbench](https://huggingface.co/papers/2307.06350)、[GenEval](https://huggingface.co/papers/2310.11513)),本文档部分内容已过时。 + +像 [Stable Diffusion](https://huggingface.co/docs/diffusers/stable_diffusion) 这类生成模型的评估本质上是主观的。但作为开发者和研究者,我们经常需要在众多可能性中做出审慎选择。那么当面对不同生成模型(如 GANs、Diffusion 等)时,该如何决策? + +定性评估容易产生偏差,可能导致错误结论;而定量指标又未必能准确反映图像质量。因此,通常需要结合定性与定量评估来获得更可靠的模型选择依据。 + +本文档将系统介绍扩散模型的定性与定量评估方法(非穷尽列举)。对于定量方法,我们将重点演示如何结合 `diffusers` 库实现这些评估。 + +文档所示方法同样适用于评估不同[噪声调度器](https://huggingface.co/docs/diffusers/main/en/api/schedulers/overview)在固定生成模型下的表现差异。 + +## 评估场景 + +我们涵盖以下扩散模型管线的评估: + +- 文本引导图像生成(如 [`StableDiffusionPipeline`](https://huggingface.co/docs/diffusers/main/en/api/pipelines/stable_diffusion/text2img)) +- 基于文本和输入图像的引导生成(如 [`StableDiffusionImg2ImgPipeline`](https://huggingface.co/docs/diffusers/main/en/api/pipelines/stable_diffusion/img2img) 和 [`StableDiffusionInstructPix2PixPipeline`](https://huggingface.co/docs/diffusers/main/en/api/pipelines/pix2pix)) +- 类别条件图像生成模型(如 [`DiTPipeline`](https://huggingface.co/docs/diffusers/main/en/api/pipe)) + +## 定性评估 + +定性评估通常涉及对生成图像的人工评判。评估维度包括构图质量、图文对齐度和空间关系等方面。标准化的提示词能为这些主观指标提供统一基准。[DrawBench](https://imagen.research.google/)和[PartiPrompts](https://parti.research.google/)是常用的定性评估提示词数据集,分别由Imagen和Parti团队提出。 + +根据[Parti官方网站](https://parti.research.google/)说明: + +> PartiPrompts (P2)是我们发布的包含1600多个英文提示词的丰富集合,可用于测量模型在不同类别和挑战维度上的能力。 + +![parti-prompts](https://huggingface.co/datasets/diffusers/docs-images/resolve/main/evaluation_diffusion_models/parti-prompts.png) + +PartiPrompts包含以下字段: +- Prompt(提示词) +- Category(类别,如"抽象"、"世界知识"等) +- Challenge(难度等级,如"基础"、"复杂"、"文字与符号"等) + +这些基准测试支持对不同图像生成模型进行并排人工对比评估。为此,🧨 Diffusers团队构建了**Open Parti Prompts**——一个基于Parti Prompts的社区驱动型定性评估基准,用于比较顶尖开源扩散模型: +- [Open Parti Prompts游戏](https://huggingface.co/spaces/OpenGenAI/open-parti-prompts):展示10个parti提示词对应的4张生成图像,用户选择最符合提示的图片 +- [Open Parti Prompts排行榜](https://huggingface.co/spaces/OpenGenAI/parti-prompts-leaderboard):对比当前最优开源扩散模型的性能榜单 + +为进行手动图像对比,我们演示如何使用`diffusers`处理部分PartiPrompts提示词。 + +以下是从不同挑战维度(基础、复杂、语言结构、想象力、文字与符号)采样的提示词示例(使用[nateraw/parti-prompts](https://huggingface.co/datasets/nateraw/parti-prompts)数据集): + +```python +from datasets import load_dataset + +# prompts = load_dataset("nateraw/parti-prompts", split="train") +# prompts = prompts.shuffle() +# sample_prompts = [prompts[i]["Prompt"] for i in range(5)] + +# 为保证可复现性,固定使用以下示例提示词 +sample_prompts = [ + "a corgi", + "a hot air balloon with a yin-yang symbol, with the moon visible in the daytime sky", + "a car with no windows", + "a cube made of porcupine", + 'The saying "BE EXCELLENT TO EACH OTHER" written on a red brick wall with a graffiti image of a green alien wearing a tuxedo. A yellow fire hydrant is on a sidewalk in the foreground.', +] +``` + +现在我们可以使用Stable Diffusion([v1-4 checkpoint](https://huggingface.co/CompVis/stable-diffusion-v1-4))生成这些提示词对应的图像: + +```python +import torch + +seed = 0 +generator = torch.manual_seed(seed) + +images = sd_pipeline(sample_prompts, num_images_per_prompt=1, generator=generator).images +``` + +![parti-prompts-14](https://huggingface.co/datasets/diffusers/docs-images/resolve/main/evaluation_diffusion_models/parti-prompts-14.png) + +我们也可以通过设置`num_images_per_prompt`参数来比较同一提示词生成的不同图像。使用不同检查点([v1-5](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5))运行相同流程后,结果如下: + +![parti-prompts-15](https://huggingface.co/datasets/diffusers/docs-images/resolve/main/evaluation_diffusion_models/parti-prompts-15.png) + +当使用多个待评估模型为所有提示词生成若干图像后,这些结果将提交给人类评估员进行打分。有关DrawBench和PartiPrompts基准测试的更多细节,请参阅各自的论文。 + + + +在模型训练过程中查看推理样本有助于评估训练进度。我们的[训练脚本](https://github.com/huggingface/diffusers/tree/main/examples/)支持此功能,并额外提供TensorBoard和Weights & Biases日志记录功能。 + + + +## 定量评估 + +本节将指导您如何评估三种不同的扩散流程,使用以下指标: +- CLIP分数 +- CLIP方向相似度 +- FID(弗雷歇起始距离) + +### 文本引导图像生成 + +[CLIP分数](https://huggingface.co/papers/2104.08718)用于衡量图像-标题对的匹配程度。CLIP分数越高表明匹配度越高🔼。该分数是对"匹配度"这一定性概念的量化测量,也可以理解为图像与标题之间的语义相似度。研究发现CLIP分数与人类判断具有高度相关性。 + +首先加载[`StableDiffusionPipeline`]: + +```python +from diffusers import StableDiffusionPipeline +import torch + +model_ckpt = "CompVis/stable-diffusion-v1-4" +sd_pipeline = StableDiffusionPipeline.from_pretrained(model_ckpt, torch_dtype=torch.float16).to("cuda") +``` + +使用多个提示词生成图像: + +```python +prompts = [ + "火星上宇航员骑马的照片", + "亚马逊雨林中高科技太阳能朋克乌托邦", + "皮卡丘在埃菲尔铁塔景观餐厅享用美食", + "贫民窟中表现主义风格的机甲机器人", + "正在准备美味餐点的昆虫机器人", + "迪士尼风格、artstation画风的雪山之巅小木屋", +] + +images = sd_pipeline(prompts, num_images_per_prompt=1, output_type="np").images + +print(images.shape) +# (6, 512, 512, 3) +``` + +然后计算CLIP分数: + +```python +from torchmetrics.functional.multimodal import clip_score +from functools import partial + +clip_score_fn = partial(clip_score, model_name_or_path="openai/clip-vit-base-patch16") + +def calculate_clip_score(images, prompts): + images_int = (images * 255).astype("uint8") + clip_score = clip_score_fn(torch.from_numpy(images_int).permute(0, 3, 1, 2), prompts).detach() + return round(float(clip_score), 4) + +sd_clip_score = calculate_clip_score(images, prompts) +print(f"CLIP分数: {sd_clip_score}") +# CLIP分数: 35.7038 +``` + +上述示例中,我们为每个提示生成一张图像。如果为每个提示生成多张图像,则需要计算每个提示生成图像的平均分数。 + +当需要比较两个兼容[`StableDiffusionPipeline`]的检查点时,应在调用管道时传入生成器。首先使用[v1-4 Stable Diffusion检查点](https://huggingface.co/CompVis/stable-diffusion-v1-4)以固定种子生成图像: + +```python +seed = 0 +generator = torch.manual_seed(seed) + +images = sd_pipeline(prompts, num_images_per_prompt=1, generator=generator, output_type="np").images +``` + +然后加载[v1-5检查点](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5)生成图像: + +```python +model_ckpt_1_5 = "stable-diffusion-v1-5/stable-diffusion-v1-5" +sd_pipeline_1_5 = StableDiffusionPipeline.from_pretrained(model_ckpt_1_5, torch_dtype=torch.float16).to("cuda") + +images_1_5 = sd_pipeline_1_5(prompts, num_images_per_prompt=1, generator=generator, output_type="np").images +``` + +最后比较两者的CLIP分数: + +```python +sd_clip_score_1_4 = calculate_clip_score(images, prompts) +print(f"v-1-4版本的CLIP分数: {sd_clip_score_1_4}") +# v-1-4版本的CLIP分数: 34.9102 + +sd_clip_score_1_5 = calculate_clip_score(images_1_5, prompts) +print(f"v-1-5版本的CLIP分数: {sd_clip_score_1_5}") +# v-1-5版本的CLIP分数: 36.2137 +``` + +结果表明[v1-5](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5)检查点性能优于前代。但需注意,我们用于计算CLIP分数的提示词数量较少。实际评估时应使用更多样化且数量更大的提示词集。 + + + +该分数存在固有局限性:训练数据中的标题是从网络爬取,并提取自图片关联的`alt`等标签。这些描述未必符合人类描述图像的方式,因此我们需要人工"设计"部分提示词。 + + + +### 图像条件式文本生成图像 + +这种情况下,生成管道同时接受输入图像和文本提示作为条件。以[`StableDiffusionInstructPix2PixPipeline`]为例,该管道接收编辑指令作为输入提示,并接受待编辑的输入图像。 + +示例图示: +![编辑指令](https://huggingface.co/datasets/diffusers/docs-images/resolve/main/evaluation_diffusion_models/edit-instruction.png) + +评估此类模型的策略之一是测量两幅图像间变化的连贯性(通过[CLIP](https://huggingface.co/docs/transformers/model_doc/clip)定义)中两个图像之间的变化与两个图像描述之间的变化的一致性(如论文[《CLIP-Guided Domain Adaptation of Image Generators》](https://huggingface.co/papers/2108.00946)所示)。这被称为“**CLIP方向相似度**”。 + +- **描述1**对应输入图像(图像1),即待编辑的图像。 +- **描述2**对应编辑后的图像(图像2),应反映编辑指令。 + +以下是示意图: + +![edit-consistency](https://huggingface.co/datasets/diffusers/docs-images/resolve/main/evaluation_diffusion_models/edit-consistency.png) + +我们准备了一个小型数据集来实现该指标。首先加载数据集: + +```python +from datasets import load_dataset + +dataset = load_dataset("sayakpaul/instructpix2pix-demo", split="train") +dataset.features +``` + +```bash +{'input': Value(dtype='string', id=None), + 'edit': Value(dtype='string', id=None), + 'output': Value(dtype='string', id=None), + 'image': Image(decode=True, id=None)} +``` + +数据字段说明: + +- `input`:与`image`对应的原始描述。 +- `edit`:编辑指令。 +- `output`:反映`edit`指令的修改后描述。 + +查看一个样本: + +```python +idx = 0 +print(f"Original caption: {dataset[idx]['input']}") +print(f"Edit instruction: {dataset[idx]['edit']}") +print(f"Modified caption: {dataset[idx]['output']}") +``` + +```bash +Original caption: 2. FAROE ISLANDS: An archipelago of 18 mountainous isles in the North Atlantic Ocean between Norway and Iceland, the Faroe Islands has 'everything you could hope for', according to Big 7 Travel. It boasts 'crystal clear waterfalls, rocky cliffs that seem to jut out of nowhere and velvety green hills' +Edit instruction: make the isles all white marble +Modified caption: 2. WHITE MARBLE ISLANDS: An archipelago of 18 mountainous white marble isles in the North Atlantic Ocean between Norway and Iceland, the White Marble Islands has 'everything you could hope for', according to Big 7 Travel. It boasts 'crystal clear waterfalls, rocky cliffs that seem to jut out of nowhere and velvety green hills' +``` + +对应的图像: + +```python +dataset[idx]["image"] +``` + +![edit-dataset](https://huggingface.co/datasets/diffusers/docs-images/resolve/main/evaluation_diffusion_models/edit-dataset.png) + +我们将根据编辑指令修改数据集中的图像,并计算方向相似度。 + +首先加载[`StableDiffusionInstructPix2PixPipeline`]: + +```python +from diffusers import StableDiffusionInstructPix2PixPipeline + +instruct_pix2pix_pipeline = StableDiffusionInstructPix2PixPipeline.from_pretrained( + "timbrooks/instruct-pix2pix", torch_dtype=torch.float16 +).to("cuda") +``` + +执行编辑操作: + +```python +import numpy as np + + +def edit_image(input_image, instruction): + image = instruct_pix2pix_pipeline( + instruction, + image=input_image, + output_type="np", + generator=generator, + ).images[0] + return image + +input_images = [] +original_captions = [] +modified_captions = [] +edited_images = [] + +for idx in range(len(dataset)): + input_image = dataset[idx]["image"] + edit_instruction = dataset[idx]["edit"] + edited_image = edit_image(input_image, edit_instruction) + + input_images.append(np.array(input_image)) + original_captions.append(dataset[idx]["input"]) + modified_captions.append(dataset[idx]["output"]) + edited_images.append(edited_image) +``` + +为测量方向相似度,我们首先加载CLIP的图像和文本编码器: + +```python +from transformers import ( + CLIPTokenizer, + CLIPTextModelWithProjection, + CLIPVisionModelWithProjection, + CLIPImageProcessor, +) + +clip_id = "openai/clip-vit-large-patch14" +tokenizer = CLIPTokenizer.from_pretrained(clip_id) +text_encoder = CLIPTextModelWithProjection.from_pretrained(clip_id).to("cuda") +image_processor = CLIPImageProcessor.from_pretrained(clip_id) +image_encoder = CLIPVisionModelWithProjection.from_pretrained(clip_id).to("cuda") +``` + +注意我们使用的是特定CLIP检查点——`openai/clip-vit-large-patch14`,因为Stable Diffusion预训练正是基于此CLIP变体。详见[文档](https://huggingface.co/docs/transformers/model_doc/clip)。 + +接着准备计算方向相似度的PyTorch `nn.Module`: + +```python +import torch.nn as nn +import torch.nn.functional as F + + +class DirectionalSimilarity(nn.Module): + def __init__(self, tokenizer, text_encoder, image_processor, image_encoder): + super().__init__() + self.tokenizer = tokenizer + self.text_encoder = text_encoder + self.image_processor = image_processor + self.image_encoder = image_encoder + + def preprocess_image(self, image): + image = self.image_processor(image, return_tensors="pt")["pixel_values"] + return {"pixel_values": image.to("cuda")} + + def tokenize_text(self, text): + inputs = self.tokenizer( + text, + max_length=self.tokenizer.model_max_length, + padding="max_length", + truncation=True, + return_tensors="pt", + ) + return {"input_ids": inputs.input_ids.to("cuda")} + + def encode_image(self, image): + preprocessed_image = self.preprocess_image(image) + image_features = self.image_encoder(**preprocessed_image).image_embeds + image_features = image_features / image_features.norm(dim=1, keepdim=True) + return image_features + + def encode_text(self, text): + tokenized_text = self.tokenize_text(text) + text_features = self.text_encoder(**tokenized_text).text_embeds + text_features = text_features / text_features.norm(dim=1, keepdim=True) + return text_features + + def compute_directional_similarity(self, img_feat_one, img_feat_two, text_feat_one, text_feat_two): + sim_direction = F.cosine_similarity(img_feat_two - img_feat_one, text_feat_two - text_feat_one) + return sim_direction + + def forward(self, image_one, image_two, caption_one, caption_two): + img_feat_one = self.encode_image(image_one) + img_feat_two = self.encode_image(image_two) + text_feat_one = self.encode_text(caption_one) + text_feat_two = self.encode_text(caption_two) + directional_similarity = self.compute_directional_similarity( + img_feat_one, img_feat_two, text_feat_one, text_feat_two + ) + return directional_similarity +``` + +现在让我们使用`DirectionalSimilarity`模块: + +```python +dir_similarity = DirectionalSimilarity(tokenizer, text_encoder, image_processor, image_encoder) +scores = [] + +for i in range(len(input_images)): + original_image = input_images[i] + original_caption = original_captions[i] + edited_image = edited_images[i] + modified_caption = modified_captions[i] + + similarity_score = dir_similarity(original_image, edited_image, original_caption, modified_caption) + scores.append(float(similarity_score.detach().cpu())) + +print(f"CLIP方向相似度: {np.mean(scores)}") +# CLIP方向相似度: 0.0797976553440094 +``` + +与CLIP分数类似,CLIP方向相似度数值越高越好。 + +需要注意的是,`StableDiffusionInstructPix2PixPipeline`提供了两个控制参数`image_guidance_scale`和`guidance_scale`来调节最终编辑图像的质量。建议您尝试调整这两个参数,观察它们对方向相似度的影响。 + +我们可以扩展这个度量标准来评估原始图像与编辑版本的相似度,只需计算`F.cosine_similarity(img_feat_two, img_feat_one)`。对于这类编辑任务,我们仍希望尽可能保留图像的主要语义特征(即保持较高的相似度分数)。 + +该度量方法同样适用于类似流程,例如[`StableDiffusionPix2PixZeroPipeline`](https://huggingface.co/docs/diffusers/main/en/api/pipelines/pix2pix_zero#diffusers.StableDiffusionPix2PixZeroPipeline)。 + + + +CLIP分数和CLIP方向相似度都依赖CLIP模型,可能导致评估结果存在偏差。 + + + +***扩展IS、FID(后文讨论)或KID等指标存在困难***,当被评估模型是在大型图文数据集(如[LAION-5B数据集](https://laion.ai/blog/laion-5b/))上预训练时。因为这些指标的底层都使用了在ImageNet-1k数据集上预训练的InceptionNet来提取图像特征。Stable Diffusion的预训练数据集与InceptionNet的预训练数据集可能重叠有限,因此不适合作为特征提取器。 + +***上述指标更适合评估类别条件模型***,例如[DiT](https://huggingface.co/docs/diffusers/main/en/api/pipelines/dit)。该模型是在ImageNet-1k类别条件下预训练的。 +这是9篇文档中的第8部分。 + +### 基于类别的图像生成 + +基于类别的生成模型通常是在带有类别标签的数据集(如[ImageNet-1k](https://huggingface.co/datasets/imagenet-1k))上进行预训练的。评估这些模型的常用指标包括Fréchet Inception Distance(FID)、Kernel Inception Distance(KID)和Inception Score(IS)。本文档重点介绍FID([Heusel等人](https://huggingface.co/papers/1706.08500)),并展示如何使用[`DiTPipeline`](https://huggingface.co/docs/diffusers/api/pipelines/dit)计算该指标,该管道底层使用了[DiT模型](https://huggingface.co/papers/2212.09748)。 + +FID旨在衡量两组图像数据集的相似程度。根据[此资源](https://mmgeneration.readthedocs.io/en/latest/quick_run.html#fid): + +> Fréchet Inception Distance是衡量两组图像数据集相似度的指标。研究表明其与人类对视觉质量的主观判断高度相关,因此最常用于评估生成对抗网络(GAN)生成样本的质量。FID通过计算Inception网络特征表示所拟合的两个高斯分布之间的Fréchet距离来实现。 + +这两个数据集本质上是真实图像数据集和生成图像数据集(本例中为人工生成的图像)。FID通常基于两个大型数据集计算,但本文档将使用两个小型数据集进行演示。 + +首先下载ImageNet-1k训练集中的部分图像: + +```python +from zipfile import ZipFile +import requests + + +def download(url, local_filepath): + r = requests.get(url) + with open(local_filepath, "wb") as f: + f.write(r.content) + return local_filepath + +dummy_dataset_url = "https://hf.co/datasets/sayakpaul/sample-datasets/resolve/main/sample-imagenet-images.zip" +local_filepath = download(dummy_dataset_url, dummy_dataset_url.split("/")[-1]) + +with ZipFile(local_filepath, "r") as zipper: + zipper.extractall(".") +``` + +```python +from PIL import Image +import os +import numpy as np + +dataset_path = "sample-imagenet-images" +image_paths = sorted([os.path.join(dataset_path, x) for x in os.listdir(dataset_path)]) + +real_images = [np.array(Image.open(path).convert("RGB")) for path in image_paths] +``` + +这些是来自以下ImageNet-1k类别的10张图像:"cassette_player"、"chain_saw"(2张)、"church"、"gas_pump"(3张)、"parachute"(2张)和"tench"。 + +

+ 真实图像
+ 真实图像 +

+ +加载图像后,我们对其进行轻量级预处理以便用于FID计算: + +```python +from torchvision.transforms import functional as F +import torch + + +def preprocess_image(image): + image = torch.tensor(image).unsqueeze(0) + image = image.permute(0, 3, 1, 2) / 255.0 + return F.center_crop(image, (256, 256)) + +real_images = torch.stack([dit_pipeline.preprocess_image(image) for image in real_images]) +print(real_images.shape) +# torch.Size([10, 3, 256, 256]) +``` + +我们现在加载[`DiTPipeline`](https://huggingface.co/docs/diffusers/api/pipelines/dit)来生成基于上述类别的条件图像。 + +```python +from diffusers import DiTPipeline, DPMSolverMultistepScheduler + +dit_pipeline = DiTPipeline.from_pretrained("facebook/DiT-XL-2-256", torch_dtype=torch.float16) +dit_pipeline.scheduler = DPMSolverMultistepScheduler.from_config(dit_pipeline.scheduler.config) +dit_pipeline = dit_pipeline.to("cuda") + +seed = 0 +generator = torch.manual_seed(seed) + + +words = [ + "cassette player", + "chainsaw", + "chainsaw", + "church", + "gas pump", + "gas pump", + "gas pump", + "parachute", + "parachute", + "tench", +] + +class_ids = dit_pipeline.get_label_ids(words) +output = dit_pipeline(class_labels=class_ids, generator=generator, output_type="np") + +fake_images = output.images +fake_images = torch.tensor(fake_images) +fake_images = fake_images.permute(0, 3, 1, 2) +print(fake_images.shape) +# torch.Size([10, 3, 256, 256]) +``` + +现在,我们可以使用[`torchmetrics`](https://torchmetrics.readthedocs.io/)计算FID分数。 + +```python +from torchmetrics.image.fid import FrechetInceptionDistance + +fid = FrechetInceptionDistance(normalize=True) +fid.update(real_images, real=True) +fid.update(fake_images, real=False) + +print(f"FID分数: {float(fid.compute())}") +# FID分数: 177.7147216796875 +``` + +FID分数越低越好。以下因素会影响FID结果: + +- 图像数量(包括真实图像和生成图像) +- 扩散过程中引入的随机性 +- 扩散过程的推理步数 +- 扩散过程中使用的调度器 + +对于最后两点,最佳实践是使用不同的随机种子和推理步数进行多次评估,然后报告平均结果。 + + + +FID结果往往具有脆弱性,因为它依赖于许多因素: + +* 计算过程中使用的特定Inception模型 +* 计算实现的准确性 +* 图像格式(PNG和JPG的起点不同) + +需要注意的是,FID通常在比较相似实验时最有用,但除非作者仔细公开FID测量代码,否则很难复现论文结果。 + +这些注意事项同样适用于其他相关指标,如KID和IS。 + + + +最后,让我们可视化检查这些`fake_images`。 + +

+ 生成图像
+ 生成图像示例 +

diff --git a/docs/source/zh/using-diffusers/loading.md b/docs/source/zh/using-diffusers/loading.md deleted file mode 100644 index 5974a10e4364..000000000000 --- a/docs/source/zh/using-diffusers/loading.md +++ /dev/null @@ -1,613 +0,0 @@ -# 加载流程管道 - -[[在Colab中打开]] - -扩散系统由参数化模型和调度器等多个组件组成,这些组件以复杂的方式交互。为此我们设计了[`DiffusionPipeline`],将整个扩散系统的复杂性封装成简单易用的API。同时[`DiffusionPipeline`]完全可定制,您可以修改每个组件来构建适合自己需求的扩散系统。 - -本指南将展示如何加载: -- 从Hub和本地加载流程管道 -- 将不同组件加载到流程管道中 -- 在不增加内存使用的情况下加载多个流程管道 -- 检查点变体,如不同的浮点类型或非指数移动平均(EMA)权重 - -## 加载流程管道 - -> [!TIP] -> 如果您对[`DiffusionPipeline`]类的工作原理感兴趣,可直接跳转到[DiffusionPipeline详解](#diffusionpipeline-explained)部分。 - -加载任务流程管道有两种方式: -1. 加载通用的[`DiffusionPipeline`]类,让它自动从检查点检测正确的流程管道类 -2. 为特定任务加载特定的流程管道类 - - - - -[`DiffusionPipeline`]类是从[Hub](https://huggingface.co/models?library=diffusers&sort=trending)加载最新热门扩散模型的简单通用方法。它使用[`~DiffusionPipeline.from_pretrained`]方法自动从检查点检测任务的正确流程管道类,下载并缓存所有需要的配置和权重文件,返回一个可用于推理的流程管道。 - -```python -from diffusers import DiffusionPipeline - -pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True) -``` - -同样的检查点也可以用于图像到图像任务。[`DiffusionPipeline`]类可以处理任何任务,只要您提供适当的输入。例如,对于图像到图像任务,您需要向流程管道传递初始图像。 - -```py -from diffusers import DiffusionPipeline - -pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True) - -init_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/img2img-init.png") -prompt = "丛林中的宇航员,彩色" -``` -以下是您提供的英文内容的中文翻译,保持Diffusers、stable_diffusion、consisid等专有名词不译,并保留Markdown格式: - ---- - -### 特定任务管道 - -若已知模型对应的具体管道类,可直接通过该类加载检查点。例如加载Stable Diffusion模型时,使用[`StableDiffusionPipeline`]类: - -```python -from diffusers import StableDiffusionPipeline - -pipeline = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True) -``` - -同一检查点也可用于其他任务(如图像到图像生成)。此时需改用对应任务的管道类,例如使用[`StableDiffusionImg2ImgPipeline`]加载相同检查点: - -```python -from diffusers import StableDiffusionImg2ImgPipeline - -pipeline = StableDiffusionImg2ImgPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True) -``` - ---- - -### 组件级数据类型指定 - -通过向`torch_dtype`参数传递字典,可为不同子模型定制数据类型。例如以`torch.bfloat16`精度加载transformer组件,其他组件默认使用`torch.float16`: - -```python -from diffusers import HunyuanVideoPipeline -import torch - -pipe = HunyuanVideoPipeline.from_pretrained( - "hunyuanvideo-community/HunyuanVideo", - torch_dtype={"transformer": torch.bfloat16, "default": torch.float16}, -) -print(pipe.transformer.dtype, pipe.vae.dtype) # 输出: (torch.bfloat16, torch.float16) -``` - -若组件未在字典中显式指定且未设置`default`,将默认加载为`torch.float32`。 - ---- - -### 本地管道加载 - -使用[git-lfs](https://git-lfs.github.com/)手动下载检查点到本地后加载: - -```bash -git-lfs install -git clone https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5 -``` - -下载完成后,将本地路径(如`./stable-diffusion-v1-5`)传递给[`~DiffusionPipeline.from_pretrained`]: - -```python -from diffusers import DiffusionPipeline - -stable_diffusion = DiffusionPipeline.from_pretrained("./stable-diffusion-v1-5", use_safetensors=True) -``` - ---- - -### 内存需求评估工具 - -在下载前,可通过下方空间评估管道内存需求以确认硬件兼容性: - -
- -
- -### 自定义管道 - -您可以通过向管道中加载不同的组件来实现定制化。这一点非常重要,因为您可以: - -- 根据需求切换为生成速度更快或生成质量更高的调度器(通过调用管道上的`scheduler.compatibles`方法查看兼容的调度器) -- 将默认管道组件替换为更新且性能更优的版本 - -例如,让我们用以下组件定制默认的[stabilityai/stable-diffusion-xl-base-1.0](https://hf.co/stabilityai/stable-diffusion-xl-base-1.0)模型: - -- 使用[`HeunDiscreteScheduler`]以牺牲生成速度为代价来生成更高质量的图像。必须传入`subfolder="scheduler"`参数到[`~HeunDiscreteScheduler.from_pretrained`],以便从管道仓库的正确[子文件夹](https://hf.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main/scheduler)加载调度器配置。 -- 使用在fp16模式下运行更稳定的VAE。 - -```python -from diffusers import StableDiffusionXLPipeline, HeunDiscreteScheduler, AutoencoderKL -import torch - -scheduler = HeunDiscreteScheduler.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", subfolder="scheduler") -vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16, use_safetensors=True) -``` - -现在将新的调度器和VAE传入[`StableDiffusionXLPipeline`]: - -```python -pipeline = StableDiffusionXLPipeline.from_pretrained( - "stabilityai/stable-diffusion-xl-base-1.0", - scheduler=scheduler, - vae=vae, - torch_dtype=torch.float16, - variant="fp16", - use_safetensors=True -).to("cuda") -``` - -### 复用管道 - -当您加载多个共享相同模型组件的管道时,复用这些共享组件比重新将所有内容加载到内存中更有意义,尤其是在硬件内存受限的情况下。例如: - -1. 您使用[`StableDiffusionPipeline`]生成了一张图像,但想通过[`StableDiffusionSAGPipeline`]提升其质量。这两个管道共享相同的预训练模型,因此加载两次会浪费内存。 -2. 您想向从现有[`StableDiffusionPipeline`]实例化的[`AnimateDiffPipeline`]中添加一个模型组件(如[`MotionAdapter`](../api/pipelines/animatediff#animatediffpipeline))。同样,这两个管道共享相同的预训练模型,加载全新管道会浪费内存。 - -通过[`DiffusionPipeline.from_pipe`] API,您可以在多个管道之间切换,利用它们的不同特性而不会增加内存使用。这类似于在管道中开启或关闭某个功能。 - -> [!提示] -> 若要在不同任务(而非功能)之间切换,请使用[`~DiffusionPipeline`]方法。 -以下是您提供的英文内容的中文翻译,保持Diffusers、stable_diffusion、consisid等专有名词不变,并保留Markdown格式: - -(此为文档10部分中的第4部分) - -使用[`AutoPipeline`](../api/pipelines/auto_pipeline)类的[`~DiffusionPipeline.from_pipe`]方法可以自动根据任务识别管道类别(更多细节请参阅[AutoPipeline教程](../tutorials/autopipeline))。 - -让我们从[`StableDiffusionPipeline`]开始,然后复用已加载的模型组件创建[`StableDiffusionSAGPipeline`]来提升生成质量。您将使用搭载[IP-Adapter](./ip_adapter)的[`StableDiffusionPipeline`]生成一张熊吃披萨的图片。 - -```python -from diffusers import DiffusionPipeline, StableDiffusionSAGPipeline -import torch -import gc -from diffusers.utils import load_image -from accelerate.utils import compute_module_sizes - -image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/load_neg_embed.png") - -pipe_sd = DiffusionPipeline.from_pretrained("SG161222/Realistic_Vision_V6.0_B1_noVAE", torch_dtype=torch.float16) -pipe_sd.load_ip_adapter("h94/IP-Adapter", subfolder="models", weight_name="ip-adapter_sd15.bin") -pipe_sd.set_ip_adapter_scale(0.6) -pipe_sd.to("cuda") - -generator = torch.Generator(device="cpu").manual_seed(33) -out_sd = pipe_sd( - prompt="熊吃披萨", - negative_prompt="白平衡错误, 昏暗, 草图, 最差质量, 低质量", - ip_adapter_image=image, - num_inference_steps=50, - generator=generator, -).images[0] -out_sd -``` - -
- -
- -作为参考,您可以查看此过程消耗的内存情况。 - -```python -def bytes_to_giga_bytes(bytes): - return bytes / 1024 / 1024 / 1024 -print(f"最大内存占用: {bytes_to_giga_bytes(torch.cuda.max_memory_allocated())} GB") -"最大内存占用: 4.406213283538818 GB" -``` - -现在通过[`~DiffusionPipeline.from_pipe`]方法,将[`StableDiffusionPipeline`]中的管道组件复用到[`StableDiffusionSAGPipeline`]中。 - -> [!警告] -> 某些管道方法在通过[`~DiffusionPipeline.from_pipe`]创建的新管道上可能无法正常工作。例如[`~DiffusionPipeline.enable_model_cpu_offload`]方法会根据每个管道独特的卸载序列在模型组件上安装钩子。如果新管道中模型执行顺序不同,CPU卸载可能无法正确工作。 -> -> 为确保功能正常,我们建议对通过[`~DiffusionPipeline.from_pipe`]创建的新管道重新应用管道方法。 - -```python -pipe_sag = StableDiffusionSAGPipeline.from_pipe( - pipe_sd -) - -generator = torch.Generator(device="cpu").manual_seed(33) -out_sag = pipe_sag( - prompt="熊吃披萨", - negative_prompt="白平衡错误, 昏暗, 草图, 最差质量, 低质量", - ip_adapter_image=image, - num_inference_steps=50, - generator=generator, - guidance_scale=1.0, - sag_scale=0.75 -).images[0] -out_sag -``` - -
- -
-
- -
- -如果检查内存使用情况,会发现与之前保持一致,因为 [`StableDiffusionPipeline`] 和 [`StableDiffusionSAGPipeline`] 共享相同的管道组件。这使得您可以互换使用它们,而无需额外的内存开销。 - -```py -print(f"最大内存分配量: {bytes_to_giga_bytes(torch.cuda.max_memory_allocated())} GB") -"最大内存分配量: 4.406213283538818 GB" -``` - -接下来,我们使用 [`AnimateDiffPipeline`] 为图像添加动画效果,同时向管道中添加 [`MotionAdapter`] 模块。对于 [`AnimateDiffPipeline`],需要先卸载 IP-Adapter,并在创建新管道后重新加载(这一步骤仅适用于 [`AnimateDiffPipeline`])。 - -```py -from diffusers import AnimateDiffPipeline, MotionAdapter, DDIMScheduler -from diffusers.utils import export_to_gif - -pipe_sag.unload_ip_adapter() -adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2", torch_dtype=torch.float16) - -pipe_animate = AnimateDiffPipeline.from_pipe(pipe_sd, motion_adapter=adapter) -pipe_animate.scheduler = DDIMScheduler.from_config(pipe_animate.scheduler.config, beta_schedule="linear") -# 重新加载 IP-Adapter 和 LoRA 权重 -pipe_animate.load_ip_adapter("h94/IP-Adapter", subfolder="models", weight_name="ip-adapter_sd15.bin") -pipe_animate.load_lora_weights("guoyww/animatediff-motion-lora-zoom-out", adapter_name="zoom-out") -pipe_animate.to("cuda") - -generator = torch.Generator(device="cpu").manual_seed(33) -pipe_animate.set_adapters("zoom-out", adapter_weights=0.75) -out = pipe_animate( - prompt="熊吃披萨", - num_frames=16, - num_inference_steps=50, - ip_adapter_image=image, - generator=generator, -).frames[0] -export_to_gif(out, "out_animate.gif") -``` - -
- -
- -[`AnimateDiffPipeline`] 对内存的需求更高,会消耗 15GB 内存(关于这对内存使用的影响,请参阅 [from_pipe 的内存使用情况](#memory-usage-of-from_pipe) 部分)。 - -```py -print(f"最大内存分配量: {bytes_to_giga_bytes(torch.cuda.max_memory_allocated())} GB") -"最大内存分配量: 15.178664207458496 GB" -``` - -### 修改 from_pipe 组件 - -通过 [`~DiffusionPipeline.from_pipe`] 加载的管道可以使用不同的模型组件或方法进行自定义。但是,每当修改模型组件的状态时,会影响共享相同组件的所有其他管道。例如,如果在 [`StableDiffusionSAGPipeline`] 上调用 [`~diffusers.loaders.IPAdapterMixin.unload_ip_adapter`],那么将无法在 [`StableDiffusionPipeline`] 中使用 IP-Adapter,因为它已从共享组件中移除。 - -```py -pipe.sag_unload_ip_adapter() - -generator = to -```markdown -rch.Generator(device="cpu").manual_seed(33) -out_sd = pipe_sd( - prompt="熊吃披萨", - negative_prompt="白平衡错误, 黑暗, 草图, 最差质量, 低质量", - ip_adapter_image=image, - num_inference_steps=50, - generator=generator, -).images[0] -"AttributeError: 'NoneType' object has no attribute 'image_projection_layers'" -``` - -### from_pipe的内存占用 - -使用[`~DiffusionPipeline.from_pipe`]加载多个流程时,内存需求取决于内存占用最高的流程,与创建的流程数量无关。 - -| 流程类型 | 内存占用 (GB) | -|---|---| -| StableDiffusionPipeline | 4.400 | -| StableDiffusionSAGPipeline | 4.400 | -| AnimateDiffPipeline | 15.178 | - -由于[`AnimateDiffPipeline`]内存需求最高,因此*总内存占用*仅基于该流程。只要后续创建的流程内存需求不超过[`AnimateDiffPipeline`],内存占用就不会增加。各流程可交替使用,不会产生额外内存开销。 - -## 安全检测器 - -Diffusers为Stable Diffusion模型实现了[安全检测器](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/safety_checker.py),用于筛查可能生成的有害内容。该检测器会将生成输出与已知的NSFW内容硬编码库进行比对。如需禁用安全检测器,可向[`~DiffusionPipeline.from_pretrained`]方法传递`safety_checker=None`参数。 - -```python -from diffusers import DiffusionPipeline - -pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", safety_checker=None, use_safetensors=True) -""" -您已通过传递`safety_checker=None`禁用了的安全检测器。请确保遵守Stable Diffusion许可条款,避免在公开服务或应用中展示未过滤结果。Diffusers团队和Hugging Face强烈建议在所有面向公众的场景中保持安全过滤器启用,仅在进行网络行为分析或结果审计时禁用。更多信息请参阅https://github.com/huggingface/diffusers/pull/254。 -""" -``` - -## 检查点变体 - -检查点变体通常指以下两种权重类型: - -- 存储为不同浮点类型(如[torch.float16](https://pytorch.org/docs/stable/tensors.html#data-types))的检查点,下载仅需一半带宽和存储空间。但继续训练或使用CPU时不可用此变体。 -- 非指数移动平均(Non-EMA)权重,此类变体不应用于推理,仅适用于继续微调模型。 - -> [!提示] -> 当检查点包含...(后续内容待补充) -### 模型变体 - -即使模型结构完全相同,但如果它们在不同的数据集上训练或采用了不同的训练配置,就应当存放在独立的代码库中。例如,[stabilityai/stable-diffusion-2](https://hf.co/stabilityai/stable-diffusion-2) 和 [stabilityai/stable-diffusion-2-1](https://hf.co/stabilityai/stable-diffusion-2-1) 就分别存储在不同的代码库中。 - -反之,若某个变体与原检查点**完全一致**,则意味着它们具有相同的序列化格式(如 [safetensors](./using_safetensors))、完全一致的模型结构,且所有张量权重形状均相同。 - -| **检查点类型** | **权重文件名** | **加载参数** | -|----------------------|-------------------------------------------|---------------------------| -| 原始版本 | diffusion_pytorch_model.safetensors | - | -| 浮点精度变体 | diffusion_pytorch_model.fp16.safetensors | `variant`, `torch_dtype` | -| 非EMA变体 | diffusion_pytorch_model.non_ema.safetensors| `variant` | - -加载变体时有两个关键参数: - -- `torch_dtype` 指定加载权重的浮点精度。例如,若想通过加载 fp16 变体节省带宽,需同时设置 `variant="fp16"` 和 `torch_dtype=torch.float16` 以*将权重转换为 fp16*。若仅设置 `torch_dtype=torch.float16`,系统会先下载默认的 fp32 权重再执行转换。 - -- `variant` 指定从代码库加载哪个文件。例如,要从 [stable-diffusion-v1-5](https://hf.co/stable-diffusion-v1-5/stable-diffusion-v1-5/tree/main/unet) 加载 UNet 的非EMA变体,需设置 `variant="non_ema"` 来下载对应的 `non_ema` 文件。 - - - - -```python -from diffusers import DiffusionPipeline -import torch - -pipeline = DiffusionPipeline.from_pretrained( - "stable-diffusion-v1-5/stable-diffusion-v1-5", - variant="fp16", - torch_dtype=torch.float16, - use_safetensors=True -) -``` - - - - -```python -pipeline = DiffusionPipeline.from_pretrained( - "stable-diffusion-v1-5/stable-diffusion-v1-5", - variant="non_ema", - use_safetensors=True -) -``` - - - - -通过 [`DiffusionPipeline.save_pretrained`] 方法的 `variant` 参数,可将检查点保存为不同浮点精度或非EMA变体。建议将变体保存在原始检查点同一目录下,以便从同一位置加载不同版本。 - - - - -```python -from diffusers import DiffusionPipeline - -pipeline.save_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", variant="fp16") -``` - - - - -```python -pipeline.save_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", variant="non_ema") -``` - - - -以下是您提供的英文内容的中文翻译,保留了Diffusers、stable_diffusion、consisid等专有名词的英文形式,并维持了Markdown格式: - -```markdown -on-v1-5/stable-diffusion-v1-5", variant="non_ema") -``` - -
-
- -如果不将变体保存到现有文件夹中,则必须指定 `variant` 参数,否则会抛出 `Exception` 异常,因为它无法找到原始检查点。 - -```python -# 👎 这种方式不可行 -pipeline = DiffusionPipeline.from_pretrained( - "./stable-diffusion-v1-5", torch_dtype=torch.float16, use_safetensors=True -) -# 👍 这种方式可行 -pipeline = DiffusionPipeline.from_pretrained( - "./stable-diffusion-v1-5", variant="fp16", torch_dtype=torch.float16, use_safetensors=True -) -``` - -## DiffusionPipeline 原理解析 - -作为类方法,[`DiffusionPipeline.from_pretrained`] 主要承担两项职责: - -- 下载推理所需的最新版文件夹结构并缓存。若本地缓存中已存在最新文件夹结构,[`DiffusionPipeline.from_pretrained`] 会直接复用缓存而不会重复下载文件。 -- 将缓存的权重加载至正确的流水线[类](../api/pipelines/overview#diffusers-summary)(该信息从 `model_index.json` 文件中获取),并返回其实例。 - -流水线的底层文件夹结构与其类实例直接对应。例如,[`StableDiffusionPipeline`] 对应 [`stable-diffusion-v1-5/stable-diffusion-v1-5`](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5) 中的文件夹结构。 - -```python -from diffusers import DiffusionPipeline - -repo_id = "stable-diffusion-v1-5/stable-diffusion-v1-5" -pipeline = DiffusionPipeline.from_pretrained(repo_id, use_safetensors=True) -print(pipeline) -``` - -您会看到 pipeline 是 [`StableDiffusionPipeline`] 的实例,由七个组件构成: - -- `"feature_extractor"`:来自 🤗 Transformers 的 [`~transformers.CLIPImageProcessor`]。 -- `"safety_checker"`:用于屏蔽有害内容的[组件](https://github.com/huggingface/diffusers/blob/e55687e1e15407f60f32242027b7bb8170e58266/src/diffusers/pipelines/stable_diffusion/safety_checker.py#L32)。 -- `"scheduler"`:[`PNDMScheduler`] 的实例。 -- `"text_encoder"`:来自 🤗 Transformers 的 [`~transformers.CLIPTextModel`]。 -- `"tokenizer"`:来自 🤗 Transformers 的 [`~transformers.CLIPTokenizer`]。 -- `"unet"`:[`UNet2DConditionModel`] 的实例。 -- `"vae"`:[`AutoencoderKL`] 的实例。 - -```json -StableDiffusionPipeline { - "feature_extractor": [ - "transformers", - "CLIPImageProcessor" - ], - "safety_checker": [ - "stable_diffusion", - "StableDiffusionSafetyChecker" - ], - "scheduler": [ - "diffusers", - "PNDMScheduler" - ], - "text_encoder": [ - "transformers", - "CLIPTextModel" - ], - "tokenizer": [ - "transformers", - "CLIPTokenizer" - ], - "unet": [ - "diffusers", - "UNet2DConditionModel" - ], - "vae": [ - "diffusers", - "AutoencoderKL" - ] -} -``` - -将流水线实例的组件与 [`stable-diffusion-v1-5/stable-diffusion-v1-5`](https://huggingface.co/stable-diffusion-v1-5/stable-diffusio -``` - -(注:由于您提供的英文内容在结尾处被截断,中文翻译也保持相同截断位置。若需完整翻译最后部分,请提供剩余内容。) -以下是您提供的英文内容的中文翻译,已按要求保留Diffusers、stable_diffusion等专有名词不翻译,并保持Markdown格式: - -(这是文档10部分中的第9部分) - -观察[stable_diffusion-v1-5](https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main)的文件夹结构,您会发现仓库中每个组件都有独立的文件夹: - -``` -. -├── feature_extractor -│   └── preprocessor_config.json -├── model_index.json -├── safety_checker -│   ├── config.json -| ├── model.fp16.safetensors -│ ├── model.safetensors -│ ├── pytorch_model.bin -| └── pytorch_model.fp16.bin -├── scheduler -│   └── scheduler_config.json -├── text_encoder -│   ├── config.json -| ├── model.fp16.safetensors -│ ├── model.safetensors -│ |── pytorch_model.bin -| └── pytorch_model.fp16.bin -├── tokenizer -│   ├── merges.txt -│   ├── special_tokens_map.json -│   ├── tokenizer_config.json -│   └── vocab.json -├── unet -│   ├── config.json -│   ├── diffusion_pytorch_model.bin -| |── diffusion_pytorch_model.fp16.bin -│ |── diffusion_pytorch_model.f16.safetensors -│ |── diffusion_pytorch_model.non_ema.bin -│ |── diffusion_pytorch_model.non_ema.safetensors -│ └── diffusion_pytorch_model.safetensors -|── vae -. ├── config.json -. ├── diffusion_pytorch_model.bin - ├── diffusion_pytorch_model.fp16.bin - ├── diffusion_pytorch_model.fp16.safetensors - └── diffusion_pytorch_model.safetensors -``` - -您可以通过属性访问管道的每个组件来查看其配置: - -```py -pipeline.tokenizer -CLIPTokenizer( - name_or_path="/root/.cache/huggingface/hub/models--runwayml--stable-diffusion-v1-5/snapshots/39593d5650112b4cc580433f6b0435385882d819/tokenizer", - vocab_size=49408, - model_max_length=77, - is_fast=False, - padding_side="right", - truncation_side="right", - special_tokens={ - "bos_token": AddedToken("<|startoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=True), - "eos_token": AddedToken("<|endoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=True), - "unk_token": AddedToken("<|endoftext|>", rstrip=False, lstrip=False, single_word=False, normalized=True), - "pad_token": "<|endoftext|>", - }, - clean_up_tokenization_spaces=True -) -``` - -每个管道都需要一个[`model_index.json`](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/blob/main/model_index.json)文件,该文件会告诉[`DiffusionPipeline`]: - -- 从`_class_name`加载哪个管道类 -- 创建模型时使用的🧨 Diffusers版本`_diffusers_version` -- 子文件夹中存储了哪些库的哪些组件(`name`对应组件和子文件夹名称,`library`对应要加载类的库名,`class`对应类名) - -```json -{ - "_class_name": "StableDiffusionPipeline", - "_diffusers_version": "0.6.0", - "feature_extractor": [ - "transformers", - "CLIPImageProcessor" - ], - "safety_checker": [ - "stable_diffusion", - "StableDiffusionSafetyChecker" - ], - "scheduler": [ - "diffusers", - "PNDMScheduler" - ], - "text_encoder": [ - "transformers", - "CLIPTextModel" - ], - "tokenizer": [ - "transformers", -``` -```json -{ - "text_encoder": [ - "transformers", - "CLIPTextModel" - ], - "tokenizer": [ - "transformers", - "CLIPTokenizer" - ], - "unet": [ - "diffusers", - "UNet2DConditionModel" - ], - "vae": [ - "diffusers", - "AutoencoderKL" - ] -} -``` From 2d3c79c11bf374a22b46e80a2d7d6649dd09a483 Mon Sep 17 00:00:00 2001 From: SamYuan1990 Date: Mon, 4 Aug 2025 19:03:34 +0800 Subject: [PATCH 4/7] Try to passs CI check Signed-off-by: SamYuan1990 --- docs/source/zh/_toctree.yml | 60 ++++++++++++++++++++++- docs/source/zh/conceptual/contribution.md | 1 - docs/source/zh/training/adapt_a_model.md | 1 - 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/docs/source/zh/_toctree.yml b/docs/source/zh/_toctree.yml index 6416c468a8e9..85fcea92aabd 100644 --- a/docs/source/zh/_toctree.yml +++ b/docs/source/zh/_toctree.yml @@ -1,6 +1,6 @@ - sections: - local: index - title: 🧨 Diffusers + title: Diffusers - local: quicktour title: 快速入门 - local: stable_diffusion @@ -10,3 +10,61 @@ - local: installation title: 安装 title: 开始 + +- title: Training + isExpanded: false + sections: + - local: training/overview + title: Overview + - local: training/adapt_a_model + title: Adapt a model to a new task + - title: Models + sections: + - local: training/text2image + title: Text-to-image + - local: training/controlnet + title: ControlNet + - title: Methods + sections: + - local: training/text_inversion + title: Textual Inversion + - local: training/dreambooth + title: DreamBooth + - local: training/lora + title: LoRA + +- title: Inference optimization + isExpanded: false + sections: + - local: optimization/fp16 + title: Accelerate inference + - title: Community optimizations + sections: + - local: optimization/xformers + title: xFormers + +- title: Model accelerators and hardware + isExpanded: false + sections: + - local: using-diffusers/stable_diffusion_jax_how_to + title: JAX/Flax + - local: optimization/onnx + title: ONNX + +- title: DiffusionPipeline + isExpanded: false + sections: + - local: using-diffusers/schedulers + title: Load schedulers and models + +- title: Resources + isExpanded: false + sections: + - local: conceptual/philosophy + title: Philosophy + - local: conceptual/contribution + title: How to contribute? + - local: conceptual/ethical_guidelines + title: Diffusers' Ethical Guidelines + - local: conceptual/evaluation + title: Evaluating Diffusion Models \ No newline at end of file diff --git a/docs/source/zh/conceptual/contribution.md b/docs/source/zh/conceptual/contribution.md index 4656c18e48ee..be3476d8e598 100644 --- a/docs/source/zh/conceptual/contribution.md +++ b/docs/source/zh/conceptual/contribution.md @@ -489,4 +489,3 @@ $ git push --set-upstream origin 您的分支名称 ### 风格指南 对于文档字符串,🧨 Diffusers 遵循 [Google 风格指南](https://google.github.io/styleguide/pyguide.html)。 - Disclaimers: This content is powered by i18n-agent-action with LLM service https://api.deepseek.com with model deepseek-chat, for some reason, (for example, we are not native speaker) we use LLM to provide this translate for you. If you find any corrections, please file an issue or raise a PR back to github, and switch back to default language. \ No newline at end of file diff --git a/docs/source/zh/training/adapt_a_model.md b/docs/source/zh/training/adapt_a_model.md index 89dfc3799829..b5f915569739 100644 --- a/docs/source/zh/training/adapt_a_model.md +++ b/docs/source/zh/training/adapt_a_model.md @@ -45,4 +45,3 @@ unet = AutoModel.from_pretrained( ``` 此时文生图模型的其他组件权重仍保持预训练状态,但UNet的输入卷积层权重(`conv_in.weight`)会随机初始化。由于这一关键变化,必须对模型进行修复任务的微调,否则模型将仅会输出噪声。 - Disclaimers: This content is powered by i18n-agent-action with LLM service https://api.deepseek.com with model deepseek-chat, for some reason, (for example, we are not native speaker) we use LLM to provide this translate for you. If you find any corrections, please file an issue or raise a PR back to github, and switch back to default language. \ No newline at end of file From 31474e637c91b7560fce87de15098fe87f4fe50c Mon Sep 17 00:00:00 2001 From: SamYuan1990 Date: Tue, 5 Aug 2025 15:35:30 +0800 Subject: [PATCH 5/7] fix up for human review process Signed-off-by: SamYuan1990 --- docs/source/zh/_toctree.yml | 4 - docs/source/zh/conceptual/contribution.md | 46 ++- .../zh/conceptual/ethical_guidelines.md | 6 +- docs/source/zh/conceptual/evaluation.md | 33 +- docs/source/zh/conceptual/philosophy.md | 4 +- docs/source/zh/optimization/fp16.md | 4 +- docs/source/zh/training/controlnet.md | 2 +- docs/source/zh/training/dreambooth.md | 329 ------------------ docs/source/zh/training/lora.md | 6 +- docs/source/zh/training/overview.md | 10 +- docs/source/zh/using-diffusers/schedulers.md | 4 +- 11 files changed, 55 insertions(+), 393 deletions(-) delete mode 100644 docs/source/zh/training/dreambooth.md diff --git a/docs/source/zh/_toctree.yml b/docs/source/zh/_toctree.yml index 85fcea92aabd..0295496ffd2d 100644 --- a/docs/source/zh/_toctree.yml +++ b/docs/source/zh/_toctree.yml @@ -28,8 +28,6 @@ sections: - local: training/text_inversion title: Textual Inversion - - local: training/dreambooth - title: DreamBooth - local: training/lora title: LoRA @@ -46,8 +44,6 @@ - title: Model accelerators and hardware isExpanded: false sections: - - local: using-diffusers/stable_diffusion_jax_how_to - title: JAX/Flax - local: optimization/onnx title: ONNX diff --git a/docs/source/zh/conceptual/contribution.md b/docs/source/zh/conceptual/contribution.md index be3476d8e598..0f9743882523 100644 --- a/docs/source/zh/conceptual/contribution.md +++ b/docs/source/zh/conceptual/contribution.md @@ -19,7 +19,7 @@ http://www.apache.org/licenses/LICENSE-2.0 ## 概述 -您可以通过多种方式做出贡献,从在issue和讨论区回答问题,到向核心库添加新的扩散模型。 +您可以通过多种方式做出贡献,从在issue和讨论区回答问题,到向核心库添加新的diffusion模型。 下面我们按难度升序列出不同的贡献方式,所有方式对社区都很有价值: @@ -33,7 +33,7 @@ http://www.apache.org/licenses/LICENSE-2.0 * 8. 解决标记为"Good second issue"的中等难度问题,详见[此处](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+second+issue%22) * 9. 添加新pipeline/模型/调度器,参见["New Pipeline/Model"](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22New+pipeline%2Fmodel%22)和["New scheduler"](https://github.com/huggingface/diffusers/issues?q=is%3Aopen+is%3Aissue+label%3A%22New+scheduler%22)类issue。此类贡献请先阅读[设计哲学](https://github.com/huggingface/diffusers/blob/main/PHILOSOPHY.md) -重申:所有贡献对社区都具有重要价值。下文将详细说明各类贡献方式。 +重申:**所有贡献对社区都具有重要价值。**下文将详细说明各类贡献方式。 对于4-9类贡献,您需要提交PR(拉取请求),具体操作详见[如何提交PR](#how-to-open-a-pr)章节。 @@ -48,13 +48,13 @@ http://www.apache.org/licenses/LICENSE-2.0 - 论文解读 - 基于Diffusers库的个人项目求助 - 一般性问题 -- 关于扩散模型的伦理讨论 +- 关于diffusion模型的伦理讨论 - ... 论坛/Discord上的每个问题都能促使社区公开分享知识,很可能帮助未来遇到相同问题的初学者。请务必提出您的疑问。 同样地,通过回答问题您也在为社区创造公共知识文档,这种贡献极具价值。 -请注意:提问/回答时投入的精力越多,产生的公共知识质量就越高。精心构建的问题与专业解答能形成高质量知识库,而表述不清的问题则可能降低讨论价值。 +**请注意**:提问/回答时投入的精力越多,产生的公共知识质量就越高。精心构建的问题与专业解答能形成高质量知识库,而表述不清的问题则可能降低讨论价值。 低质量的问题或回答会降低公共知识库的整体质量。 简而言之,高质量的问题或回答应具备*精确性*、*简洁性*、*相关性*、*易于理解*、*可访问性*和*格式规范/表述清晰*等特质。更多详情请参阅[如何提交优质议题](#how-to-write-a-good-issue)章节。 @@ -111,11 +111,7 @@ http://www.apache.org/licenses/LICENSE-2.0 #### 2.3 设计反馈 -关于库设计的反馈(无论正面还是负面)能极大帮助核心维护者打造更友好的库。要了解当前设计理念,请参阅[此文档](https://huggingface.co/docs/diffusers/conceptu - -### 2.3 设计理念反馈 - -Diffusers库遵循特定的[设计理念](https://github.com/huggingface/diffusers/blob/main/PHILOSOPHY.md)。如果您认为某个设计选择与当前理念不符,请说明原因及改进建议。如果某个设计选择因过度遵循理念而限制了使用场景,也请解释原因并提出调整方案。 +关于库设计的反馈(无论正面还是负面)能极大帮助核心维护者打造更友好的库。要了解当前设计理念,请参阅[此文档](https://huggingface.co/docs/diffusers/conceptual/philosophy)如果您认为某个设计选择与当前理念不符,请说明原因及改进建议。如果某个设计选择因过度遵循理念而限制了使用场景,也请解释原因并提出调整方案。 若某个设计对您特别实用,请同样留下备注——这对未来的设计决策极具参考价值。 您可通过[此链接](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=&template=feedback.md&title=)提交设计反馈。 @@ -130,7 +126,7 @@ Diffusers库遵循特定的[设计理念](https://github.com/huggingface/diffuse #### 2.5 新模型/调度器/pipeline提案 -若扩散模型社区发布了您希望集成到Diffusers库的新模型、pipeline或调度器,请提供以下信息: +若diffusion模型社区发布了您希望集成到Diffusers库的新模型、pipeline或调度器,请提供以下信息: * 简要说明并附论文或发布链接 * 开源实现链接(如有) * 模型权重下载链接(如已公开) @@ -141,7 +137,7 @@ Diffusers库遵循特定的[设计理念](https://github.com/huggingface/diffuse ### 3. 解答GitHub问题 -回答GitHub问题可能需要Diffusers的技术知识,但我们鼓励所有人尝试参与——即使您对答案不完全确定。高质量回答的建议: +回答GitHub问题可能需要Diffusers的技术知识,但我们鼓励所有人尝试参与——即使您对答案不完全正确。高质量回答的建议: - 保持简洁精炼 - 严格聚焦问题本身 - 提供代码/论文等佐证材料 @@ -152,7 +148,6 @@ Diffusers库遵循特定的[设计理念](https://github.com/huggingface/diffuse - 标记重复issue并附原链接 - 推荐用户至[论坛](https://discuss.huggingface.co/c/discussion-related-to-httpsgithubcomhuggingfacediffusers/63)或[Discord](https://discord.gg/G7tWnz98XR) -(注:保留技术专有名词Diffusers/stable_diffusion/consisid原文) 在确认提交的Bug报告正确且需要修改源代码后,请继续阅读以下章节内容。 以下所有贡献都需要提交PR(拉取请求)。具体操作步骤详见[如何提交PR](#how-to-open-a-pr)章节。 @@ -166,7 +161,7 @@ Diffusers库遵循特定的[设计理念](https://github.com/huggingface/diffuse ### 5. 文档贡献 -优秀库必然拥有优秀文档!官方文档是新用户的首要接触点,因此文档贡献具有极高价值。贡献形式包括: +优秀库**必然**拥有优秀文档!官方文档是新用户的首要接触点,因此文档贡献具有**极高价值**。贡献形式包括: - 修正拼写/语法错误 - 修复文档字符串格式错误(如显示异常或链接失效) - 修正文档字符串中张量的形状/维度描述 @@ -175,12 +170,11 @@ Diffusers库遵循特定的[设计理念](https://github.com/huggingface/diffuse - 文档翻译 [官方文档页面](https://huggingface.co/docs/diffusers/index)所有内容均属可修改范围,对应[文档源文件](https://github.com/huggingface/diffusers/tree/main/docs/source)可进行编辑。修改前请查阅[验证说明](https://github.com/huggingface/diffusers/tree/main/docs)。 -以下是翻译成中文的内容(保留Diffusers、stable_diffusion、consisid等术语不翻译): ### 6. 贡献社区流程 > [!TIP] -> 阅读[社区流程](../using-diffusers/custom_pipeline_overview#community-pipelines)指南了解GitHub与Hugging Face Hub社区流程的区别。若想了解我们设立社区流程的原因,请查看GitHub Issue [#841](https://github.com/huggingface/diffusers/issues/841)(简而言之,我们无法维护扩散模型所有可能的推理使用方式,但也不希望限制社区构建这些流程)。 +> 阅读[社区流程](../using-diffusers/custom_pipeline_overview#community-pipelines)指南了解GitHub与Hugging Face Hub社区流程的区别。若想了解我们设立社区流程的原因,请查看GitHub Issue [#841](https://github.com/huggingface/diffusers/issues/841)(简而言之,我们无法维护diffusion模型所有可能的推理使用方式,但也不希望限制社区构建这些流程)。 贡献社区流程是向社区分享创意与成果的绝佳方式。您可以在[`DiffusionPipeline`]基础上构建流程,任何人都能通过设置`custom_pipeline`参数加载使用。本节将指导您创建一个简单的"单步"流程——UNet仅执行单次前向传播并调用调度器一次。 @@ -264,7 +258,7 @@ Diffusers训练示例是位于[examples](https://github.com/huggingface/diffuser 研究型训练示例位于[examples/research_projects](https://github.com/huggingface/diffusers/tree/main/examples/research_projects),而官方训练示例包含[examples](https://github.com/huggingface/diffusers/tree/main/examples)目录下除`research_projects`和`community`外的所有文件夹。 官方训练示例由Diffusers核心维护者维护,研究型训练示例则由社区维护。 -这与[6. 贡献社区pipeline](#6-contribute-a-community-pipeline)中关于官方pipeline与社区pipeline的原因相同:核心维护者不可能维护扩散模型的所有可能训练方法。 +这与[6. 贡献社区pipeline](#6-contribute-a-community-pipeline)中关于官方pipeline与社区pipeline的原因相同:核心维护者不可能维护diffusion模型的所有可能训练方法。 如果Diffusers核心维护者和社区认为某种训练范式过于实验性或不够普及,相应训练代码应放入`research_projects`文件夹并由作者维护。 官方训练和研究型示例都包含一个目录,其中含有一个或多个训练脚本、`requirements.txt`文件和`README.md`文件。用户使用时需要先克隆代码库: @@ -283,7 +277,7 @@ pip install -r examples//requirements.txt 因此添加示例时,`requirements.txt`文件应定义训练示例所需的所有pip依赖项,安装完成后用户即可运行示例训练脚本。可参考[DreamBooth的requirements.txt文件](https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/requirements.txt)。 - 运行示例所需的所有代码应集中在单个Python文件中 - 用户应能通过命令行`python .py --args`直接运行示例 -- 示例应保持简洁,主要展示如何使用Diffusers进行训练。示例脚本的目的**不是**创建最先进的扩散模型,而是复现已知训练方案,避免添加过多自定义逻辑。因此,这些示例也力求成为优质的教学材料。 +- **示例**应保持简洁,主要展示如何使用Diffusers进行训练。示例脚本的目的**不是**创建最先进的diffusion模型,而是复现已知训练方案,避免添加过多自定义逻辑。因此,这些示例也力求成为优质的教学材料。 提交示例时,强烈建议参考现有示例(如[dreambooth](https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py))来了解规范格式。 我们强烈建议贡献者使用[Accelerate库](https://github.com/huggingface/accelerate),因其与Diffusers深度集成。 @@ -302,7 +296,7 @@ pip install -r examples//requirements.txt ### 9. 添加管道、模型和调度器 -管道(pipelines)、模型(models)和调度器(schedulers)是Diffusers库中最重要的组成部分。它们提供了对最先进扩散技术的便捷访问,使得社区能够构建强大的生成式AI应用。 +管道(pipelines)、模型(models)和调度器(schedulers)是Diffusers库中最重要的组成部分。它们提供了对最先进diffusion技术的便捷访问,使得社区能够构建强大的生成式AI应用。 通过添加新的模型、管道或调度器,您可能为依赖Diffusers的任何用户界面开启全新的强大用例,这对整个生成式AI生态系统具有巨大价值。 @@ -326,13 +320,15 @@ Diffusers针对这三类组件都有一些开放的功能请求——如果您 # 从 diffusers.pipelines.stable_diffusion.pipeline_output.StableDiffusionPipelineOutput 复制并将 Stable 替换为 Alt class AltDiffusionPipelineOutput(BaseOutput): """ - Alt Diffusion 流水线的输出类。 + Output class for Alt Diffusion pipelines. - 参数: - images (`List[PIL.Image.Image]` 或 `np.ndarray`) - 长度为 `batch_size` 的去噪 PIL 图像列表,或形状为 `(batch_size, height, width, num_channels)` 的 NumPy 数组。 + Args: + images (`List[PIL.Image.Image]` or `np.ndarray`) + List of denoised PIL images of length `batch_size` or NumPy array of shape `(batch_size, height, width, + num_channels)`. nsfw_content_detected (`List[bool]`) - 指示对应生成图像是否包含"不适合工作场所"(nsfw)内容的列表,若无法执行安全检查则为 `None`。 + List indicating whether the corresponding generated image contains "not-safe-for-work" (nsfw) content or + `None` if safety checking could not be performed. """ ``` @@ -344,7 +340,7 @@ class AltDiffusionPipelineOutput(BaseOutput): 1. 确保使用了正确的issue模板。您可以选择*错误报告*、*功能请求*、*API设计反馈*、*新模型/流水线/调度器添加*、*论坛*或空白issue。在[新建issue](https://github.com/huggingface/diffusers/issues/new/choose)时务必选择正确的模板。 2. **精确描述**:为issue起一个恰当的标题。尽量用最简练的语言描述问题。提交issue时越精确,理解问题和潜在解决方案所需的时间就越少。确保一个issue只针对一个问题,不要将多个问题放在同一个issue中。如果发现多个问题,请分别创建多个issue。如果是错误报告,请尽可能精确描述错误类型——不应只写"diffusers出错"。 -3. **可复现性**:无法复现的代码片段 == 无法解决问题。如果遇到错误,维护人员必须能够复现它。确保包含一个可以复制粘贴到Python解释器中复现问题的代码片段。确保您的代码片段是可运行的,即没有缺少导入或图像链接等问题。issue应包含错误信息和可直接复制粘贴以复现相同错误的代码片段。如果issue涉及本地模型权重或无法被读者访问的本地数据,则问题无法解决。如果无法共享数据或模型,请尝试创建虚拟模型或虚拟数据。 +3. **可复现性**:无法复现的代码片段 == 无法解决问题。如果遇到错误,维护人员必须能够**复现**它。确保包含一个可以复制粘贴到Python解释器中复现问题的代码片段。确保您的代码片段是可运行的,即没有缺少导入或图像链接等问题。issue应包含错误信息和可直接复制粘贴以复现相同错误的代码片段。如果issue涉及本地模型权重或无法被读者访问的本地数据,则问题无法解决。如果无法共享数据或模型,请尝试创建虚拟模型或虚拟数据。 4. **最小化原则**:通过尽可能简洁的描述帮助读者快速理解问题。删除所有与问题无关的代码/信息。如果发现错误,请创建最简单的代码示例来演示问题,不要一发现错误就把整个工作流程都转储到issue中。例如,如果在训练模型时某个阶段出现错误或训练过程中遇到问题时,应首先尝试理解训练代码的哪部分导致了错误,并用少量代码尝试复现。建议使用模拟数据替代完整数据集进行测试。 5. 添加引用链接。当提及特定命名、方法或模型时,请务必提供引用链接以便读者理解。若涉及具体PR或issue,请确保添加对应链接。不要假设读者了解你所指内容。issue中引用链接越丰富越好。 6. 规范格式。请确保规范格式化issue内容:Python代码使用代码语法块,错误信息使用标准代码语法。详见[GitHub官方格式文档](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)。 @@ -482,8 +478,6 @@ $ git checkout -b 您的同步分支名称 $ git pull --squash --no-commit upstream main $ git commit -m '提交信息(不要包含 GitHub 引用)' $ git push --set-upstream origin 您的分支名称 -``` - -branch-for-syncing ``` ### 风格指南 diff --git a/docs/source/zh/conceptual/ethical_guidelines.md b/docs/source/zh/conceptual/ethical_guidelines.md index 1fbd956e30be..535cc86e5f0c 100644 --- a/docs/source/zh/conceptual/ethical_guidelines.md +++ b/docs/source/zh/conceptual/ethical_guidelines.md @@ -11,7 +11,7 @@ http://www.apache.org/licenses/LICENSE-2.0 ## 前言 -[Diffusers](https://huggingface.co/docs/diffusers/index)不仅提供预训练的扩散模型,还是一个模块化工具箱,支持推理和训练功能。 +[Diffusers](https://huggingface.co/docs/diffusers/index)不仅提供预训练的diffusion模型,还是一个模块化工具箱,支持推理和训练功能。 鉴于该技术在实际场景中的应用及其可能对社会产生的负面影响,我们认为有必要制定项目伦理准则,以指导Diffusers库的开发、用户贡献和使用规范。 @@ -39,7 +39,7 @@ Diffusers社区将在项目开发中贯彻以下伦理准则,并协调社区 ## 实施案例:安全功能与机制 -团队持续开发技术和非技术工具,以应对扩散技术相关的伦理与社会风险。社区反馈对于功能实施和风险意识提升具有不可替代的价值: +团队持续开发技术和非技术工具,以应对diffusion技术相关的伦理与社会风险。社区反馈对于功能实施和风险意识提升具有不可替代的价值: - [**社区讨论区**](https://huggingface.co/docs/hub/repositories-pull-requests-discussions):促进社区成员就项目开展协作讨论。 @@ -47,7 +47,7 @@ Diffusers社区将在项目开发中贯彻以下伦理准则,并协调社区 - **部署安全强化**: - - [**Safe Stable Diffusion**](https://huggingface.co/docs/diffusers/main/en/api/pipelines/stable_diffusion/stable_diffusion_safe):解决Stable Diffusion等基于未过滤网络爬取数据训练的模型容易产生不当内容的问题。相关论文:[安全潜在扩散:缓解扩散模型中的不当退化](https://huggingface.co/papers/2211.05105)。 + - [**Safe Stable Diffusion**](https://huggingface.co/docs/diffusers/main/en/api/pipelines/stable_diffusion/stable_diffusion_safe):解决Stable Diffusion等基于未过滤网络爬取数据训练的模型容易产生不当内容的问题。相关论文:[Safe Latent Diffusion:缓解diffusion模型中的不当退化](https://huggingface.co/papers/2211.05105)。 - [**安全检测器**](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/safety_checker.py):通过比对图像生成后嵌入空间中硬编码有害概念集的类别概率进行检测。有害概念列表经特殊处理以防逆向工程。 diff --git a/docs/source/zh/conceptual/evaluation.md b/docs/source/zh/conceptual/evaluation.md index ffc3d3e247ed..e809c8730d34 100644 --- a/docs/source/zh/conceptual/evaluation.md +++ b/docs/source/zh/conceptual/evaluation.md @@ -8,14 +8,14 @@ http://www.apache.org/licenses/LICENSE-2.0 除非适用法律要求或书面同意,本软件按"原样"分发,不附带任何明示或暗示的担保或条件。详见许可证中规定的特定语言权限和限制。 --> -# 扩散模型评估指南 +# Diffusion模型评估指南 在 Colab 中打开 > [!TIP] -> 鉴于当前已出现针对图像生成扩散模型的成熟评估框架(如[HEIM](https://crfm.stanford.edu/helm/heim/latest/)、[T2I-Compbench](https://huggingface.co/papers/2307.06350)、[GenEval](https://huggingface.co/papers/2310.11513)),本文档部分内容已过时。 +> 鉴于当前已出现针对图像生成Diffusion模型的成熟评估框架(如[HEIM](https://crfm.stanford.edu/helm/heim/latest/)、[T2I-Compbench](https://huggingface.co/papers/2307.06350)、[GenEval](https://huggingface.co/papers/2310.11513)),本文档部分内容已过时。 像 [Stable Diffusion](https://huggingface.co/docs/diffusers/stable_diffusion) 这类生成模型的评估本质上是主观的。但作为开发者和研究者,我们经常需要在众多可能性中做出审慎选择。那么当面对不同生成模型(如 GANs、Diffusion 等)时,该如何决策? @@ -27,7 +27,7 @@ http://www.apache.org/licenses/LICENSE-2.0 ## 评估场景 -我们涵盖以下扩散模型管线的评估: +我们涵盖以下Diffusion模型管线的评估: - 文本引导图像生成(如 [`StableDiffusionPipeline`](https://huggingface.co/docs/diffusers/main/en/api/pipelines/stable_diffusion/text2img)) - 基于文本和输入图像的引导生成(如 [`StableDiffusionImg2ImgPipeline`](https://huggingface.co/docs/diffusers/main/en/api/pipelines/stable_diffusion/img2img) 和 [`StableDiffusionInstructPix2PixPipeline`](https://huggingface.co/docs/diffusers/main/en/api/pipelines/pix2pix)) @@ -35,7 +35,7 @@ http://www.apache.org/licenses/LICENSE-2.0 ## 定性评估 -定性评估通常涉及对生成图像的人工评判。评估维度包括构图质量、图文对齐度和空间关系等方面。标准化的提示词能为这些主观指标提供统一基准。[DrawBench](https://imagen.research.google/)和[PartiPrompts](https://parti.research.google/)是常用的定性评估提示词数据集,分别由Imagen和Parti团队提出。 +定性评估通常涉及对生成图像的人工评判。评估维度包括构图质量、图文对齐度和空间关系等方面。标准化的提示词能为这些主观指标提供统一基准。DrawBench和PartiPrompts是常用的定性评估提示词数据集,分别由[Imagen](https://imagen.research.google/)和[Parti](https://parti.research.google/)团队提出。 根据[Parti官方网站](https://parti.research.google/)说明: @@ -48,13 +48,13 @@ PartiPrompts包含以下字段: - Category(类别,如"抽象"、"世界知识"等) - Challenge(难度等级,如"基础"、"复杂"、"文字与符号"等) -这些基准测试支持对不同图像生成模型进行并排人工对比评估。为此,🧨 Diffusers团队构建了**Open Parti Prompts**——一个基于Parti Prompts的社区驱动型定性评估基准,用于比较顶尖开源扩散模型: +这些基准测试支持对不同图像生成模型进行并排人工对比评估。为此,🧨 Diffusers团队构建了**Open Parti Prompts**——一个基于Parti Prompts的社区驱动型定性评估基准,用于比较顶尖开源diffusion模型: - [Open Parti Prompts游戏](https://huggingface.co/spaces/OpenGenAI/open-parti-prompts):展示10个parti提示词对应的4张生成图像,用户选择最符合提示的图片 -- [Open Parti Prompts排行榜](https://huggingface.co/spaces/OpenGenAI/parti-prompts-leaderboard):对比当前最优开源扩散模型的性能榜单 +- [Open Parti Prompts排行榜](https://huggingface.co/spaces/OpenGenAI/parti-prompts-leaderboard):对比当前最优开源diffusion模型的性能榜单 为进行手动图像对比,我们演示如何使用`diffusers`处理部分PartiPrompts提示词。 -以下是从不同挑战维度(基础、复杂、语言结构、想象力、文字与符号)采样的提示词示例(使用[nateraw/parti-prompts](https://huggingface.co/datasets/nateraw/parti-prompts)数据集): +以下是从不同挑战维度(基础、复杂、语言结构、想象力、文字与符号)采样的提示词示例(使用[PartiPrompts作为数据集](https://huggingface.co/datasets/nateraw/parti-prompts)): ```python from datasets import load_dataset @@ -63,7 +63,7 @@ from datasets import load_dataset # prompts = prompts.shuffle() # sample_prompts = [prompts[i]["Prompt"] for i in range(5)] -# 为保证可复现性,固定使用以下示例提示词 +# Fixing these sample prompts in the interest of reproducibility. sample_prompts = [ "a corgi", "a hot air balloon with a yin-yang symbol, with the moon visible in the daytime sky", @@ -96,7 +96,7 @@ images = sd_pipeline(sample_prompts, num_images_per_prompt=1, generator=generato 在模型训练过程中查看推理样本有助于评估训练进度。我们的[训练脚本](https://github.com/huggingface/diffusers/tree/main/examples/)支持此功能,并额外提供TensorBoard和Weights & Biases日志记录功能。 - +
## 定量评估 @@ -123,12 +123,12 @@ sd_pipeline = StableDiffusionPipeline.from_pretrained(model_ckpt, torch_dtype=to ```python prompts = [ - "火星上宇航员骑马的照片", - "亚马逊雨林中高科技太阳能朋克乌托邦", - "皮卡丘在埃菲尔铁塔景观餐厅享用美食", - "贫民窟中表现主义风格的机甲机器人", - "正在准备美味餐点的昆虫机器人", - "迪士尼风格、artstation画风的雪山之巅小木屋", + "a photo of an astronaut riding a horse on mars", + "A high tech solarpunk utopia in the Amazon rainforest", + "A pikachu fine dining with a view to the Eiffel Tower", + "A mecha robot in a favela in expressionist style", + "an insect robot preparing a delicious meal", + "A small cabin on top of a snowy mountain in the style of Disney, artstation", ] images = sd_pipeline(prompts, num_images_per_prompt=1, output_type="np").images @@ -193,13 +193,14 @@ print(f"v-1-5版本的CLIP分数: {sd_clip_score_1_5}") 该分数存在固有局限性:训练数据中的标题是从网络爬取,并提取自图片关联的`alt`等标签。这些描述未必符合人类描述图像的方式,因此我们需要人工"设计"部分提示词。 - +
### 图像条件式文本生成图像 这种情况下,生成管道同时接受输入图像和文本提示作为条件。以[`StableDiffusionInstructPix2PixPipeline`]为例,该管道接收编辑指令作为输入提示,并接受待编辑的输入图像。 示例图示: + ![编辑指令](https://huggingface.co/datasets/diffusers/docs-images/resolve/main/evaluation_diffusion_models/edit-instruction.png) 评估此类模型的策略之一是测量两幅图像间变化的连贯性(通过[CLIP](https://huggingface.co/docs/transformers/model_doc/clip)定义)中两个图像之间的变化与两个图像描述之间的变化的一致性(如论文[《CLIP-Guided Domain Adaptation of Image Generators》](https://huggingface.co/papers/2108.00946)所示)。这被称为“**CLIP方向相似度**”。 diff --git a/docs/source/zh/conceptual/philosophy.md b/docs/source/zh/conceptual/philosophy.md index 4d7baa34d17b..581e582bba56 100644 --- a/docs/source/zh/conceptual/philosophy.md +++ b/docs/source/zh/conceptual/philosophy.md @@ -45,7 +45,7 @@ http://www.apache.org/licenses/LICENSE-2.0 Hugging Face称此设计为**单文件政策**——即某个类的几乎所有代码都应写在单一自包含文件中。更多哲学探讨可参阅[此博文](https://huggingface.co/blog/transformers-design-philosophy)。 -Diffusers对流程和调度器完全遵循该哲学,但对扩散模型仅部分适用。原因在于多数扩散流程(如[DDPM](https://huggingface.co/docs/diffusers/api/pipelines/ddpm)、[Stable Diffusion](https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/overview#stable-diffusion-pipelines)、[unCLIP (DALL·E 2)](https://huggingface.co/docs/diffusers/api/pipelines/unclip)和[Imagen](https://imagen.research.google/))都基于相同扩散模型——[UNet](https://huggingface.co/docs/diffusers/api/models/unet2d-cond)。 +Diffusers对流程和调度器完全遵循该哲学,但对diffusion模型仅部分适用。原因在于多数扩散流程(如[DDPM](https://huggingface.co/docs/diffusers/api/pipelines/ddpm)、[Stable Diffusion](https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/overview#stable-diffusion-pipelines)、[unCLIP (DALL·E 2)](https://huggingface.co/docs/diffusers/api/pipelines/unclip)和[Imagen](https://imagen.research.google/))都基于相同扩散模型——[UNet](https://huggingface.co/docs/diffusers/api/models/unet2d-cond)。 现在您应已理解🧨 Diffusers的设计理念🤗。我们力求在全库贯彻这些原则,但仍存在少数例外或欠佳设计。如有反馈,我们❤️欢迎在[GitHub提交](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=&template=feedback.md&title=)。 @@ -68,7 +68,7 @@ Diffusers对流程和调度器完全遵循该哲学,但对扩散模型仅部 - 流程**非**功能完备的用户界面。完整UI推荐[InvokeAI](https://github.com/invoke-ai/InvokeAI)、[Diffuzers](https://github.com/abhishekkrthakur/diffuzers)或[lama-cleaner](https://github.com/Sanster/lama-cleaner)。 - 每个流程应通过唯一的`__call__`方法运行,且参数命名应跨流程统一。 - 流程应以其解决的任务命名。 -- 几乎所有新扩散流程都应在新文件夹/文件中实现。 +- 几乎所有新diffusion流程都应在新文件夹/文件中实现。 ### 模型 diff --git a/docs/source/zh/optimization/fp16.md b/docs/source/zh/optimization/fp16.md index 408316229855..1088482d2432 100644 --- a/docs/source/zh/optimization/fp16.md +++ b/docs/source/zh/optimization/fp16.md @@ -12,7 +12,7 @@ specific language governing permissions and limitations under the License. # 加速推理 -扩散模型在推理时速度较慢,因为生成是一个迭代过程,需要经过一定数量的"步数"逐步将噪声细化为图像或视频。要加速这一过程,您可以尝试使用不同的[调度器](../api/schedulers/overview)、降低模型权重的精度以加快计算、使用更高效的内存注意力机制等方法。 +Diffusion模型在推理时速度较慢,因为生成是一个迭代过程,需要经过一定数量的"步数"逐步将噪声细化为图像或视频。要加速这一过程,您可以尝试使用不同的[调度器](../api/schedulers/overview)、降低模型权重的精度以加快计算、使用更高效的内存注意力机制等方法。 将这些技术组合使用,可以比单独使用任何一种技术获得更快的推理速度。 @@ -174,7 +174,7 @@ pipeline(prompt, num_inference_steps=30).images[0] ### 区域编译 -[区域编译](https://docs.pytorch.org/tutorials/recipes/regional_compilation.html)通过仅编译模型中*小而频繁重复的块*(通常是transformer层)来减少冷启动延迟,并为每个后续出现的块重用编译后的工件。对于许多扩散架构,这提供了与全图编译相同的运行时加速,并将编译时间减少了8-10倍。 +[区域编译](https://docs.pytorch.org/tutorials/recipes/regional_compilation.html)通过仅编译模型中*小而频繁重复的块*(通常是transformer层)来减少冷启动延迟,并为每个后续出现的块重用编译后的工件。对于许多diffusion架构,这提供了与全图编译相同的运行时加速,并将编译时间减少了8-10倍。 使用[`~ModelMixin.compile_repeated_blocks`]方法(一个包装`torch.compile`的辅助函数)在任何组件(如transformer模型)上,如下所示。 diff --git a/docs/source/zh/training/controlnet.md b/docs/source/zh/training/controlnet.md index 11eaf3501076..e943177cedaf 100644 --- a/docs/source/zh/training/controlnet.md +++ b/docs/source/zh/training/controlnet.md @@ -106,7 +106,7 @@ write_basic_config() 训练脚本提供了丰富的可配置参数,所有参数及其说明详见 [`parse_args()`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/controlnet/train_controlnet.py#L231) 函数。虽然该函数已为每个参数提供默认值(如训练批大小、学习率等),但您可以通过命令行参数覆盖这些默认值。 -例如,使用fp16混合精度加速训练: +例如,使用fp16混合精度加速训练, 可使用`--mixed_precision`参数 ```bash accelerate launch train_controlnet.py \ diff --git a/docs/source/zh/training/dreambooth.md b/docs/source/zh/training/dreambooth.md deleted file mode 100644 index 5f4e4c803431..000000000000 --- a/docs/source/zh/training/dreambooth.md +++ /dev/null @@ -1,329 +0,0 @@ - -# DreamBooth 训练指南 - -[DreamBooth](https://huggingface.co/papers/2208.12242) 是一种通过少量主题或风格样本图像即可更新整个扩散模型的训练技术。其核心原理是将提示词中的特殊标记与示例图像关联起来。 - -## 硬件要求与优化 - -若使用显存有限的GPU进行训练,建议在训练命令中启用 `gradient_checkpointing`(梯度检查点)和 `mixed_precision`(混合精度)参数。还可通过 [xFormers](../optimization/xformers) 启用内存高效注意力机制来降低显存占用。虽然JAX/Flax训练支持TPU和GPU高效训练,但不支持梯度检查点和xFormers。若需使用Flax加速训练,建议配备显存>30GB的GPU。 - -## 环境配置 - -本指南基于 [train_dreambooth.py](https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py) 脚本解析。运行前请先安装库: - -```bash -git clone https://github.com/huggingface/diffusers -cd diffusers -pip install . -``` - -进入示例目录并安装依赖: - - - - -```bash -cd examples/dreambooth -pip install -r requirements.txt -``` - - - - -```bash -cd examples/dreambooth -pip install -r requirements_flax.txt -``` - - - - - - -🤗 Accelerate 是支持多GPU/TPU和混合精度训练的库,能根据硬件自动配置训练环境。参阅 [快速入门](https://huggingface.co/docs/accelerate/quicktour) 了解更多。 - - - -初始化加速环境: - -```bash -accelerate config -``` - -或创建默认配置: - -```bash -accelerate config default -``` - -非交互式环境(如notebook)可使用: - -```py -from accelerate.utils import write_basic_config -write_basic_config() -``` - -自定义数据集训练请参阅 [创建训练数据集](create_dataset) 指南。 - -## 核心参数解析 - - - -DreamBooth对超参数极其敏感,容易过拟合。建议阅读 [训练博客](https://huggingface.co/blog/dreambooth) 获取不同主题的推荐参数。 - - - -主要参数说明(完整参数见 [`parse_args()`](https://github.com/huggingface/diffusers/blob/072e00897a7cf4302c347a63ec917b4b8add16d4/examples/dreambooth/train_dreambooth.py#L228)): - -- `--pretrained_model_name_or_path`:Hub模型ID或本地路径 -- `--instance_data_dir`:训练图像目录 -- `--instance_prompt`:包含特殊标记的提示词 -- `--train_text_encoder`:是否同时训练文本编码器 -- `--output_dir`:模型保存路径 -- `--push_to_hub`:是否推送至Hub -- `--checkpointing_steps`:检查点保存频率,配合`--resume_from_checkpoint`可恢复训练 - -### Min-SNR加权策略 - -[Min-SNR](https://huggingface.co/papers/2303.09556) 策略通过损失重平衡加速收敛,支持`epsilon`和`v_prediction`预测类型(仅PyTorch可用): - -```bash -accelerate launch train_dreambooth.py --snr_gamma=5.0 -``` - -### 先验保留损失 - -通过模型自生成样本增强多样性: - -```bash -accelerate launch train_dreambooth.py \ - --with_prior_preservation \ - --prior_loss_weight=1.0 \ - --class_data_dir="path/to/class/images" \ - --class_prompt="类别描述文本" -``` - -### 文本编码器训练 - -需24GB+显存,可显著提升生成质量(特别面部生成): - -```bash -accelerate launch train_dreambooth.py --train_text_encoder -``` - -## 训练流程解析 - -核心组件: -- [`DreamBoothDataset`](https://github.com/huggingface/diffusers/blob/072e00897a7cf4302c347a63ec917b4b8add16d4/examples/dreambooth/train_dreambooth.py#L604):预处理图像与提示词 -- [`PromptDataset`](https://github.com/huggingface/diffusers/blob/072e00897a7cf4302c347a63ec917b4b8add16d4/examples/dreambooth/train_dreambooth.py#L738):生成类别图像提示词 - -先验保留损失的类别图像生成逻辑: - -```py -# 生成示例代码片段 -``` - -模型加载流程: - -```py -# 加载tokenizer、调度器和模型的代码示例 -``` - -训练数据集构建: - -```py -# 数据集创建代码示例 -``` - -去噪训练循环详见 [理解pipeline](../using-diffusers/write_own_pipeline) 教程。 - -## 启动训练 - -示例使用 [狗狗数据集](https://huggingface.co/datasets/diffusers/dog-example): - -```py -from huggingface_hub import snapshot_download -local_dir = "./dog" -snapshot_download("diffusers/dog-example", local_dir=local_dir, repo_type="dataset", ignore_patterns=".gitattributes") -``` - -训练过程可视化参数: - -```bash ---validation_prompt="a photo of a sks dog" --num_validation_images=4 --validation_steps=100 -``` - - - - -16GB显卡优化方案: - -```bash -pip install bitsandbytes -accelerate launch train_dreambooth.py --gradient_checkpointing --use_8bit_adam -``` - - - - -12GB显卡优化方案: - -```bash -accelerate launch train_dreambooth.py \ - --use_8bit_adam \ - --gradient_checkpointing \ - --enable_xformers_memory_efficient_attention \ - --set_grads_to_none -``` - - - - -8GB显卡需使用DeepSpeed: - -```bash -accelerate config # 配置阶段选择DeepSpeed -``` - -需配合`deepspeed.ops.adam.DeepSpeedCPUAdam`优化器。 - - - - - - - -```bash -export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5" -export INSTANCE_DIR="./dog" -export OUTPUT_DIR="path_to_saved_model" - -accelerate launch train_dreambooth.py \ - --pretrained_model_name_or_path=$MODEL_NAME \ - --instance_data_dir=$INSTANCE_DIR \ - --output_dir=$OUTPUT_DIR \ - --instance_prompt="a photo of sks dog" \ - --resolution=512 \ - --train_batch_size=1 \ - --gradient_accumulation_steps=1 \ - --learning_rate=5e-6 \ - --lr_scheduler="constant" \ - --lr_warmup_steps=0 \ - --max_train_steps=400 \ - --push_to_hub -``` - - - - -```bash -export MODEL_NAME="duongna/stable-diffusion-v1-4-flax" -export INSTANCE_DIR="./dog" -export OUTPUT_DIR="path-to-save-model" - -python train_dreambooth_flax.py \ - --pretrained_model_name_or_path=$MODEL_NAME \ - --instance_data_dir=$INSTANCE_DIR \ - --output_dir=$OUTPUT_DIR \ - --instance_prompt="a photo of sks dog" \ - --resolution=512 \ - --train_batch_size=1 \ - --learning_rate=5e-6 \ - --max_train_steps=400 \ - --push_to_hub -``` - - - - -## 推理应用 - - - - -```py -from diffusers import DiffusionPipeline -import torch - -pipeline = DiffusionPipeline.from_pretrained("path_to_saved_model", torch_dtype=torch.float16, use_safetensors=True).to("cuda") -image = pipeline("A photo of sks dog in a bucket", num_inference_steps=50, guidance_scale=7.5).images[0] -image.save("dog-bucket.png") -``` - - - - -```py -# Flax推理代码示例 -``` - - - - -## 进阶训练方案 - -### LoRA训练 - -参数高效训练技术,详见 [LoRA指南](lora)。 - -### SDXL训练 - -支持高分辨率生成的增强模型,详见 [SDXL指南](sdxl)。 - -### DeepFloyd IF训练 - -三阶段级联模型,关键参数: -- `--resolution=64`(基础模型) -- `--pre_compute_text_embeddings`(预计算文本嵌入) -- `--tokenizer_max_length=77`(T5编码器设置) - - - - -```bash -# 第一阶段LoRA训练命令 -``` - - - - -```bash -# 第二阶段LoRA训练命令 -``` - - - - -```bash -# 第一阶段全模型训练命令 -``` - - - - -```bash -# 第二阶段全模型训练命令 -``` - - - - -### 训练建议 -1. 常见物体可不微调上采样器 -2. 面部等细节建议全参数训练 -3. 使用较低学习率 -4. 推荐`DDPMScheduler` - -## 后续步骤 - -- 学习如何加载 [DreamBooth模型](../using-diffusers/loading_adapters) 进行推理 \ No newline at end of file diff --git a/docs/source/zh/training/lora.md b/docs/source/zh/training/lora.md index d1a4f658afc7..a7b7abb32d00 100644 --- a/docs/source/zh/training/lora.md +++ b/docs/source/zh/training/lora.md @@ -133,7 +133,7 @@ lora_layers = filter(lambda p: p.requires_grad, unet.parameters()) -当需要微调文本编码器时(如SDXL模型),Diffusers同样支持通过PEFT库实现。[`~peft.LoraConfig`]配置适配器参数后注入文本编码器,并筛选LoRA层进行训练。 +当需要微调文本编码器时(如SDXL模型),Diffusers同样支持通过[PEFT](https://hf.co/docs/peft)库实现。[`~peft.LoraConfig`]配置适配器参数后注入文本编码器,并筛选LoRA层进行训练。 ```py text_lora_config = LoraConfig( @@ -170,7 +170,7 @@ optimizer = optimizer_cls( 完成所有配置后,即可启动训练脚本!🚀 -以下示例使用[火影忍者BLIP标注数据集](https://huggingface.co/datasets/lambdalabs/naruto-blip-captions)训练生成火影角色。请设置环境变量`MODEL_NAME`和`DATASET_NAME`指定基础模型和数据集,`OUTPUT_DIR`设置输出目录,`HUB_MODEL_ID`指定Hub存储库名称。脚本运行后将生成以下文件: +以下示例使用[Naruto BLIP captions](https://huggingface.co/datasets/lambdalabs/naruto-blip-captions)训练生成火影角色。请设置环境变量`MODEL_NAME`和`DATASET_NAME`指定基础模型和数据集,`OUTPUT_DIR`设置输出目录,`HUB_MODEL_ID`指定Hub存储库名称。脚本运行后将生成以下文件: - 模型检查点 - `pytorch_lora_weights.safetensors`(训练好的LoRA权重) @@ -220,7 +220,7 @@ import torch pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", torch_dtype=torch.float16).to("cuda") pipeline.load_lora_weights("path/to/lora/model", weight_name="pytorch_lora_weights.safetensors") -image = pipeline("蓝色眼睛的火影忍者角色").images[0] +image = pipeline("A naruto with blue eyes").images[0] ``` ## 后续步骤 diff --git a/docs/source/zh/training/overview.md b/docs/source/zh/training/overview.md index 0133c318fb36..ebf814aefe44 100644 --- a/docs/source/zh/training/overview.md +++ b/docs/source/zh/training/overview.md @@ -9,7 +9,7 @@ http://www.apache.org/licenses/LICENSE-2.0 # 概述 -🤗 Diffusers 提供了一系列训练脚本供您训练自己的扩散模型。您可以在 [diffusers/examples](https://github.com/huggingface/diffusers/tree/main/examples) 找到所有训练脚本。 +🤗 Diffusers 提供了一系列训练脚本供您训练自己的diffusion模型。您可以在 [diffusers/examples](https://github.com/huggingface/diffusers/tree/main/examples) 找到所有训练脚本。 每个训练脚本具有以下特点: @@ -22,10 +22,10 @@ http://www.apache.org/licenses/LICENSE-2.0 | 训练类型 | 支持SDXL | 支持LoRA | 支持Flax | |---|---|---|---| -| [无条件图像生成](https://github.com/huggingface/diffusers/tree/main/examples/unconditional_image_generation) [![在Colab打开](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/training_example.ipynb) | | | | -| [文生图](https://github.com/huggingface/diffusers/tree/main/examples/text_to_image) | 👍 | 👍 | 👍 | -| [文本反转](https://github.com/huggingface/diffusers/tree/main/examples/textual_inversion) [![在Colab打开](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/sd_textual_inversion_training.ipynb) | | | 👍 | -| [DreamBooth](https://github.com/huggingface/diffusers/tree/main/examples/dreambooth) [![在Colab打开](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/sd_dreambooth_training.ipynb) | 👍 | 👍 | 👍 | +| [unconditional image generation](https://github.com/huggingface/diffusers/tree/main/examples/unconditional_image_generation) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/training_example.ipynb) | | | | +| [text-to-image](https://github.com/huggingface/diffusers/tree/main/examples/text_to_image) | 👍 | 👍 | 👍 | +| [textual inversion](https://github.com/huggingface/diffusers/tree/main/examples/textual_inversion) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/sd_textual_inversion_training.ipynb) | | | 👍 | +| [DreamBooth](https://github.com/huggingface/diffusers/tree/main/examples/dreambooth) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/sd_dreambooth_training.ipynb) | 👍 | 👍 | 👍 | | [ControlNet](https://github.com/huggingface/diffusers/tree/main/examples/controlnet) | 👍 | | 👍 | | [InstructPix2Pix](https://github.com/huggingface/diffusers/tree/main/examples/instruct_pix2pix) | 👍 | | | | [Custom Diffusion](https://github.com/huggingface/diffusers/tree/main/examples/custom_diffusion) | | | | diff --git a/docs/source/zh/using-diffusers/schedulers.md b/docs/source/zh/using-diffusers/schedulers.md index 8764276d8310..8032c1a98904 100644 --- a/docs/source/zh/using-diffusers/schedulers.md +++ b/docs/source/zh/using-diffusers/schedulers.md @@ -12,7 +12,7 @@ http://www.apache.org/licenses/LICENSE-2.0 # 加载调度器与模型 -[[在Colab中打开]] +[[open-in-colab]] Diffusion管道是由可互换的调度器(schedulers)和模型(models)组成的集合,可通过混合搭配来定制特定用例的流程。调度器封装了整个去噪过程(如去噪步数和寻找去噪样本的算法),其本身不包含可训练参数,因此内存占用极低。模型则主要负责从含噪输入到较纯净样本的前向传播过程。 @@ -81,7 +81,7 @@ pipeline = DiffusionPipeline.from_pretrained( "stable-diffusion-v1-5/stable-diffusion-v1-5", torch_dtype=torch.float16, use_safetensors=True ).to("cuda") -prompt = "一张宇航员在火星上骑马的高清照片,高分辨率,高画质。" +prompt = "A photograph of an astronaut riding a horse on Mars, high resolution, high definition." generator = torch.Generator(device="cuda").manual_seed(8) ``` From 2eeecafbfd98291275c88246336c4fa30477419a Mon Sep 17 00:00:00 2001 From: SamYuan1990 Date: Fri, 8 Aug 2025 11:18:25 +0800 Subject: [PATCH 6/7] fix up Signed-off-by: SamYuan1990 --- docs/source/zh/_toctree.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/zh/_toctree.yml b/docs/source/zh/_toctree.yml index 0295496ffd2d..f286025635e0 100644 --- a/docs/source/zh/_toctree.yml +++ b/docs/source/zh/_toctree.yml @@ -1,4 +1,5 @@ -- sections: +- title: 开始Diffusers + sections: - local: index title: Diffusers - local: quicktour @@ -9,7 +10,6 @@ title: 身份保持的文本到视频生成 - local: installation title: 安装 - title: 开始 - title: Training isExpanded: false @@ -63,4 +63,4 @@ - local: conceptual/ethical_guidelines title: Diffusers' Ethical Guidelines - local: conceptual/evaluation - title: Evaluating Diffusion Models \ No newline at end of file + title: Evaluating Diffusion Models From 57d98e11f9dfcbce952fd308f3e301904146951d Mon Sep 17 00:00:00 2001 From: SamYuan1990 Date: Sat, 9 Aug 2025 10:16:37 +0800 Subject: [PATCH 7/7] fix review comments Signed-off-by: SamYuan1990 --- docs/source/zh/_toctree.yml | 41 +++++++++++-------- .../zh/{ => using-diffusers}/consisid.md | 0 2 files changed, 24 insertions(+), 17 deletions(-) rename docs/source/zh/{ => using-diffusers}/consisid.md (100%) diff --git a/docs/source/zh/_toctree.yml b/docs/source/zh/_toctree.yml index f286025635e0..2d02be911f54 100644 --- a/docs/source/zh/_toctree.yml +++ b/docs/source/zh/_toctree.yml @@ -2,14 +2,29 @@ sections: - local: index title: Diffusers + - local: installation + title: 安装 - local: quicktour title: 快速入门 - local: stable_diffusion title: 有效和高效的扩散 - - local: consisid - title: 身份保持的文本到视频生成 - - local: installation - title: 安装 + +- title: DiffusionPipeline + isExpanded: false + sections: + - local: using-diffusers/schedulers + title: Load schedulers and models + +- title: Inference optimization + isExpanded: false + sections: + - local: optimization/fp16 + title: Accelerate inference + - title: Community optimizations + sections: + - local: optimization/xformers + title: xFormers + - title: Training isExpanded: false @@ -31,31 +46,23 @@ - local: training/lora title: LoRA -- title: Inference optimization - isExpanded: false - sections: - - local: optimization/fp16 - title: Accelerate inference - - title: Community optimizations - sections: - - local: optimization/xformers - title: xFormers - - title: Model accelerators and hardware isExpanded: false sections: - local: optimization/onnx title: ONNX -- title: DiffusionPipeline +- title: Specific pipeline examples isExpanded: false sections: - - local: using-diffusers/schedulers - title: Load schedulers and models + - local: using-diffusers/consisid + title: ConsisID - title: Resources isExpanded: false sections: + - title: Task recipes + sections: - local: conceptual/philosophy title: Philosophy - local: conceptual/contribution diff --git a/docs/source/zh/consisid.md b/docs/source/zh/using-diffusers/consisid.md similarity index 100% rename from docs/source/zh/consisid.md rename to docs/source/zh/using-diffusers/consisid.md