ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Diffusers Pipelines 完全指南:统一 API 下的扩散模型推理架构与实战

Diffusers Pipelines 完全指南:统一 API 下的扩散模型推理架构与实战 Diffusers Pipelines 完全指南统一 API 下的扩散模型推理架构与实战【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers导读本指南围绕 Diffusers 的 Pipeline流水线体系展开说明它如何将「多个独立训练的子模型 可替换的调度器」封装为开箱即用的端到端推理接口。你将理解 Pipeline 的核心设计哲学统一 API、按论文可复现、代码自解释、易于社区贡献、四大核心方法from_pretrained/save_pretrained/to/__call__、model_index.json的组件注册机制并通过 Stable Diffusion 的文生图、图生图、局部重绘三套可运行示例掌握 Pipeline 的实际用法。一、什么是 Pipeline为多组件扩散系统而生的统一推理层绝大多数现代扩散系统并非单一模型而是由多个独立训练的模型与高度可替换的调度器scheduler组件拼装而成。以 Stable Diffusion 为例一次端到端推理至少需要以下组件协同工作Autoencoder自动编码器负责图像与潜空间latent space之间的编解码Conditional UNet在给定条件文本等下执行去噪预测CLIP 文本编码器将自然语言提示词编码为条件向量该组件来自 Transformers 库而非 Diffusers 本身Scheduler定义去噪过程的时间步调度例如 PNDM 调度器CLIPImageProcessor对输入图像做预处理Safety Checker对生成结果做安全过滤实现见 safety_checker.py。这些组件虽然彼此独立训练、甚至来自不同框架但在推理时必须被当作一个整体来加载与驱动。这正是 pipelines/README.md 中 Pipeline 要解决的核心问题——在统一 API 之下把任意开源扩散系统组装成可运行的端到端推理流程。注意Pipeline不提供也不应该提供任何训练功能。若你需要官方训练示例请查看仓库的 examples 目录如 text_to_image、dreambooth、controlnet 等。二、Pipeline 的四大设计目标原文档明确了官方 Pipeline 体系始终追求的四点承诺可复现论文结果能够加载官方发布的权重并依据对应论文产出与原实现 1:1 一致的输出。例如 latent_diffusion 下的LDMTextToImagePipeline即基于《High-Resolution Image Synthesis with Latent Diffusion Models》官方权重实现极简推理接口以简单统一的方式运行模型推理详见下文「Pipelines API」代码自解释Pipeline 代码与论文可对照阅读逻辑直白易懂详见「Pipelines Summary」易于社区贡献任何人都能方便地为官方 Pipeline 贡献新实现详见「Contribution」。三、Pipelines 总览官方支持的 Pipeline 清单下表汇总了原文档列出的官方支持 Pipeline、对应论文与任务类型Pipeline论文任务dance_diffusionDance Diffusion无条件音频生成ddpmDenoising Diffusion Probabilistic Models无条件图像生成ddimDenoising Diffusion Implicit Models无条件图像生成latent_diffusionHigh-Resolution Image Synthesis with Latent Diffusion Models文生图latent_diffusion_uncondHigh-Resolution Image Synthesis with Latent Diffusion Models无条件图像生成pndmPseudo Numerical Methods for Diffusion Models on Manifolds无条件图像生成score_sde_veScore-Based Generative Modeling through Stochastic Differential Equations无条件图像生成score_sde_vpScore-Based Generative Modeling through Stochastic Differential Equations无条件图像生成stable_diffusionStable Diffusion文生图 / 图生图文生图 / 文本引导局部重绘stochastic_karras_veElucidating the Design Space of Diffusion-Based Generative Models无条件图像生成从当前仓库源码结构看这份清单成型较早一部分早期 Pipeline如dance_diffusion、pndm、score_sde_ve、stochastic_karras_ve已随项目演进被迁移到 deprecated 目录以保持向后兼容而pipelines目录下如今已扩展出大量新架构覆盖图像、视频与音频生成例如 flux、flux2、cogvideo、wan、ltx2、hunyuan_video、cosmos、stable_audio_3 等任务类型也由「无条件/条件图像生成」拓展到「文本生成视频」「图像生成视频」「文本生成音频」等。需要强调的是Pipeline 是「按论文描述来玩转扩散系统」的最小示例。绝大多数 Pipeline 都可以替换不同的调度器甚至替换不同的模型组件——这正是其「组件可插拔」设计的体现。四、Pipelines API四大核心方法与组件注册机制扩散模型由多个独立训练的子模型构成且调度器随时可以替换推理时我们却希望一次性加载全部组件。为此所有 Pipeline 都基于基类DiffusionPipeline定义于 pipeline_utils.py提供以下统一能力1.from_pretrained从 Hub 或本地目录加载from_pretrained接受两类来源Hub 仓库 id例如stable-diffusion-v1-5/stable-diffusion-v1-5本地目录路径例如./stable-diffusion。要正确解析「该加载哪些模型/组件」必须在仓库根目录提供model_index.json文件基类中config_name model_index.json见 pipeline_utils.py。该文件为每个组件定义格式name: [library, class name]其中name是加载后挂在 Pipeline 上的属性名library是类所在的库或 Pipeline 子目录名class name是具体类名。DiffusionPipeline.from_pretrained的实现位于 pipeline_utils.py从源码 docstring 可以看到它支持丰富的高级参数dtype覆盖默认精度加载例如torch.float16/torch.bfloat16也可传字典为不同子模型指定不同精度如{transformer: torch.bfloat16, vae: torch.float16, default: torch.float16}custom_pipeline加载自定义/社区 PipelineHub 仓库、GitHub 社区脚本文件名或本地目录本地目录须包含pipeline.pydevice_map多设备放置策略目前仅支持balancedmax_memory、offload_folder、offload_state_dict大模型推理时的显存/内存管理low_cpu_mem_usage加载时只载入权重、不先初始化权重降低峰值内存use_safetensors强制或禁止使用 safetensors 权重use_onnx加载 ONNX 权重对应仓库中的pipeline_onnx_*系列torch_dtype、variant、revision、cache_dir、local_files_only、token等常用加载选项。2.save_pretrained保存完整 Pipelinesave_pretrained接受本地路径如./stable-diffusion会将 Pipeline 的所有模型/组件按属性名分别存入子目录如./stable_diffusion/unet并在根目录生成model_index.json从而保证整个 Pipeline 可随时从该本地路径重新实例化。实现在 pipeline_utils.py源码还提供了以下参数safe_serialization默认True使用 safetensors 而非 pickle 序列化variant以pytorch_model.variant.bin形式保存权重变体max_shard_sizecheckpoint 分片上限如5GBpush_to_hub保存后直接推送到 Hub需配合repo_id、private、token等。3.to设备与精度迁移to接受str或torch.device将所有torch.nn.Module类型的子模型移动到目标设备行为与 PyTorch 原生Module.to完全一致见 pipeline_utils.py。除设备外还支持精度迁移pipe.to(cuda)整体搬移到 GPUpipe.to(device, dtype)或pipe.to(dtypetorch.float16)同时迁移设备与 dtype若 Pipeline 已在目标 device/dtype 上则原样返回避免重复转换。4.__call__推理入口__call__定义了 Pipeline 的全部推理逻辑——从预处理、向各模型与调度器转发张量到后处理。其 API 因 Pipeline 而异文生图 Pipeline如StableDiffusionPipeline需要接收文本提示词而无条件图像生成 Pipeline如 DDPMPipeline无需任何输入即可运行。以 pipeline_stable_diffusion.py 的__call__为例其签名涵盖了prompt、height/width、num_inference_steps、guidance_scale、negative_prompt、num_images_per_prompt、generator随机种子、latents自定义潜变量、output_type、clip_skip、callback_on_step_end逐步回调等丰富参数。关键设计所有 Pipeline 的__call__都用torch.no_grad()装饰如 pipeline_stable_diffusion.py默认关闭 autograd因为 Pipeline 不应被用于训练。若你确需在前向过程中保留梯度官方建议自行编写 Pipeline参考 examples/community 中的社区示例。5. 组件复用components属性基类还暴露了components属性见 pipeline_utils.py返回初始化 Pipeline 所需的全部模块字典。其典型用途是用同一份权重实例化多个 Pipeline避免重复分配内存from diffusers import StableDiffusionPipeline, StableDiffusionImg2ImgPipeline, StableDiffusionInpaintPipeline text2img StableDiffusionPipeline.from_pretrained(stable-diffusion-v1-5/stable-diffusion-v1-5) img2img StableDiffusionImg2ImgPipeline(**text2img.components) inpaint StableDiffusionInpaintPipeline(**text2img.components)五、Contribution为官方 Pipeline 贡献新实现的四条原则社区贡献是 Pipeline 体系持续壮大的重要来源。官方对进入正式支持的 Pipeline 有明确的质量要求概括为四个关键词Self-contained自包含Pipeline 应尽可能自包含——所有功能要么直接定义在 Pipeline 文件内部要么只继承自DiffusionPipeline基类pipeline_utils.py要么直接挂接在自身的模型与调度器组件上Easy-to-use易于使用应能用几行代码加载并完成指定任务如文生图预处理、展开的去噪循环、后处理等大部分逻辑都应封装进__call__方法内部Easy-to-tweak易于改造当官方 Pipeline 无法覆盖你的特定场景时可复制 Pipeline 文件按需修改。代码应尽量可读使「预处理 → 去噪 → 后处理」的每一环节都易于调整。若希望让社区受益可贡献到 examples/community若你认为某个重要 Pipeline 应进入官方支持贡献到 pipelines 更好One-purpose-only单一用途一个 Pipeline 只服务于一个任务。即使图生图与局部重绘在建模层面高度相似也应拆分为不同 Pipeline以保持可读性与可改造性。六、实战示例以 Stable Diffusion 三件套上手 Pipeline以下示例均来自原文档可直接复制运行。6.1 文生图Text-to-Image# make sure youre logged in with hf auth login from diffusers import StableDiffusionPipeline, LMSDiscreteScheduler pipe StableDiffusionPipeline.from_pretrained(stable-diffusion-v1-5/stable-diffusion-v1-5) pipe pipe.to(cuda) prompt a photo of an astronaut riding a horse on mars image pipe(prompt).images[0] image.save(astronaut_rides_horse.png)要点pipe(prompt)返回的结果对象中images[0]即生成的 PIL 图像。若改用半精度加载以降低显存可传入torch_dtypetorch.float16。6.2 图生文生图Image-to-ImageStableDiffusionImg2ImgPipeline允许传入文本提示词与初始图像以初始图像为起点生成新图像import requests from PIL import Image from io import BytesIO from diffusers import StableDiffusionImg2ImgPipeline device cuda pipe StableDiffusionImg2ImgPipeline.from_pretrained( stable-diffusion-v1-5/stable-diffusion-v1-5, torch_dtypetorch.float16, ).to(device) # 下载一张初始图像 url https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg response requests.get(url) init_image Image.open(BytesIO(response.content)).convert(RGB) init_image init_image.resize((768, 512)) prompt A fantasy landscape, trending on artstation images pipe(promptprompt, imageinit_image, strength0.75, guidance_scale7.5).images images[0].save(fantasy_landscape.png)关键参数说明strength0.01.0控制对初始图像的保留程度值越大对原图的改动越大guidance_scale提示词引导强度7.5 为常见取值torch_dtypetorch.float16半精度加载显著降低显存占用。6.3 复用种子与潜变量微调提示词你可以通过自定义latents来精确复现结果或在某个满意的结果上微调提示词生成时传入固定的generatortorch.Generator(device).manual_seed(seed)即可在相同种子下复用相同的初始潜变量从而隔离「提示词」这一变量观察同一潜空间下不同提示词的效果差异。这一技巧也适用于上述文生图与图生图流程。6.4 局部重绘InpaintingStableDiffusionInpaintPipeline通过提供掩码mask与文本提示词只编辑图像的特定区域import PIL import requests import torch from io import BytesIO from diffusers import StableDiffusionInpaintPipeline def download_image(url): response requests.get(url) return PIL.Image.open(BytesIO(response.content)).convert(RGB) img_url https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png mask_url https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png init_image download_image(img_url).resize((512, 512)) mask_image download_image(mask_url).resize((512, 512)) pipe StableDiffusionInpaintPipeline.from_pretrained( stable-diffusion-v1-5/stable-diffusion-inpainting, torch_dtypetorch.float16, ) pipe pipe.to(cuda) prompt Face of a yellow cat, high resolution, sitting on a park bench image pipe(promptprompt, imageinit_image, mask_imagemask_image).images[0]要点重绘任务需使用专门的 inpainting 权重stable-diffusion-v1-5/stable-diffusion-inpainting其 UNet 输入通道与基础版不同mask_image中白色区域为待重绘区域。七、小结Pipeline 的价值与边界通过本文可以看到Diffusers 的 Pipeline 体系解决了扩散系统「组件多、来源杂、拼装难」的工程痛点统一 APIfrom_pretrained/save_pretrained/to/__call__让任意扩散系统都能几行代码跑起来model_index.json的声明式组件注册机制让加载与保存完全自描述components属性让不同任务间零成本共享权重。同时它也有明确边界——只做推理不做训练训练需求应转向 examples 目录自定义推理逻辑则应参考 examples/community 的社区脚本。若想进一步深入可以研读 pipeline_utils.py 中DiffusionPipeline基类的完整实现以及 tests/pipelines 下覆盖各 Pipeline 的测试用例它们是最佳的「可运行代码说明书」。【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表