Diffusers 中的 Stable Diffusion XL 完全指南:模型加载、微条件控制与专家集成去噪
Diffusers 中的 Stable Diffusion XL 完全指南模型加载、微条件控制与专家集成去噪【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers导读Stable Diffusion XLSDXL是由 Stability AI 提出的高分辨率文生图潜在扩散模型论文《SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis》于 2023 年发布。相比此前版本的 Stable DiffusionSDXL 使用了三倍规模的 UNet 主干、双文本编码器更长的 cross-attention 上下文以及多种新的条件注入方案micro-conditioning并配套一个用于后处理提质的 refiner 模型。本文以 stable_diffusion_xl.md 为核心骨架结合当前仓库中StableDiffusionXLPipeline、StableDiffusionXLImg2ImgPipeline、StableDiffusionXLInpaintPipeline的源码与测试系统讲解模型加载、文生图/图生图/局部重绘、refiner 两种使用方式、微条件与双提示词控制以及显存优化手段。读完本文你将能够独立搭建一套包含 base refiner 的 SDXL 完整生成流程并掌握控制输出分辨率与构图的高级技巧。背景SDXL 与经典 Stable Diffusion 的区别论文摘要指出与 Stable Diffusion 早期版本相比SDXL 的参数量增长主要来自更多的注意力模块和更大的 cross-attention 上下文——因为 SDXL 引入了第二个文本编码器。同时SDXL 在多种宽高比上训练并引入了一个专门的refiner 模型通过事后post-hoc图生图技术进一步提升生成样本的视觉保真度。在 Diffusers 中SDXL 由src/diffusers/pipelines/stable_diffusion_xl/目录下的三个核心管线实现pipeline_stable_diffusion_xl.pyStableDiffusionXLPipeline文生图pipeline_stable_diffusion_xl_img2img.pyStableDiffusionXLImg2ImgPipeline图生图pipeline_stable_diffusion_xl_inpaint.pyStableDiffusionXLInpaintPipeline局部重绘。三个管线均支持 micro-conditioning 参数且可通过AutoPipelineForText2Image、AutoPipelineForImage2Image、AutoPipelineForInpainting等自动管线统一调度见 auto_pipeline.py 中的注册表。环境准备与依赖SDXL 生成需要以下库在 Colab 中可取消注释安装# uncomment to install the necessary libraries in Colab #!pip install -q diffusers transformers accelerate invisible-watermark0.2.0[!WARNING] 官方建议安装 invisible-watermark 库来标识 AI 生成图像。若安装了该库水印功能会默认启用如需关闭请在加载管线时显式指定pipeline StableDiffusionXLPipeline.from_pretrained(..., add_watermarkerFalse)水印处理逻辑位于 watermark.py仓库对 watermarker 的开/关提供了完整支持。加载模型检查点从子目录结构加载from_pretrained模型权重可能以子文件夹形式存放在 Hugging Face Hub 或本地磁盘上此时应使用StableDiffusionXLPipeline.from_pretrainedfrom diffusers import StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline import torch pipeline StableDiffusionXLPipeline.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16, variantfp16, use_safetensorsTrue ).to(cuda) # or mps, xpu, cpu refiner StableDiffusionXLImg2ImgPipeline.from_pretrained( stabilityai/stable-diffusion-xl-refiner-1.0, dtypetorch.float16, use_safetensorsTrue, variantfp16 ).to(cuda)参数说明dtypetorch.float16以半精度加载权重显著降低显存占用并加速推理variantfp16加载 fp16 变体权重文件若 Hub 上同时存在 fp32/fp16 版本use_safetensorsTrue优先使用.safetensors格式安全性更好、加载更快.to(cuda)将模型迁移到 GPU也支持mpsApple Silicon、xpuIntel与cpu。从单文件格式加载from_single_file若检查点以单个.ckpt或.safetensors文件形式存放例如社区常见的 WebUI 格式权重可使用from_single_filefrom diffusers import StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline import torch pipeline StableDiffusionXLPipeline.from_single_file( https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/blob/main/sd_xl_base_1.0.safetensors, dtypetorch.float16 ).to(cuda) # or mps, xpu, cpu refiner StableDiffusionXLImg2ImgPipeline.from_single_file( https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/blob/main/sd_xl_refiner_1.0.safetensors, dtypetorch.float16 ).to(cuda)该方法在加载时会自动识别单文件中的 UNet、双文本编码器与 VAE 权重并组装成完整管线适用于各类社区共享的合并权重。使用 AutoPipeline 自动选择除了直接实例化具体管线还可以借助自动管线让 Diffusers 根据任务自动匹配最合适的 SDXL 管线。下面的文生图示例就是通过AutoPipelineForText2Image完成的它内部会自动解析stabilityai/stable-diffusion-xl-base-1.0并选中StableDiffusionXLPipeline。文生图Text-to-image文生图只需传入文本提示词。默认情况下 SDXL 生成1024x1024的图像以获得最佳效果也可以尝试height、width设为 768x768 或 512x512但低于 512x512 的效果通常不佳详见下文分辨率建议。from diffusers import AutoPipelineForText2Image import torch pipeline_text2image AutoPipelineForText2Image.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16, variantfp16, use_safetensorsTrue ).to(cuda) # or mps, xpu, cpu prompt Astronaut in a jungle, cold color palette, muted colors, detailed, 8k image pipeline_text2image(promptprompt).images[0] image图生图Image-to-image图生图模式下 SDXL 在768x768 到 1024x1024之间的图像尺寸上表现最佳。传入一张初始图像和提示词即可对其进行条件化重绘from diffusers import AutoPipelineForImage2Image from diffusers.utils import load_image, make_image_grid # use from_pipe to avoid consuming additional memory when loading a checkpoint pipeline AutoPipelineForImage2Image.from_pipe(pipeline_text2image).to(cuda) # or mps, xpu, cpu url https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png init_image load_image(url) prompt a dog catching a frisbee in the jungle image pipeline(prompt, imageinit_image, strength0.8, guidance_scale10.5).images[0] make_image_grid([init_image, image], rows1, cols2)两个关键点from_pipe复用组件从已有pipeline_text2image直接转换管线类型避免重复加载同一检查点、节省额外显存strength控制重绘强度从源码看pipeline_stable_diffusion_xl_img2img.py 第 561-573 行strength必须处于[0.0, 1.0]区间否则会抛出ValueError其值越大初始图像被破坏的程度越深、重绘幅度越大。strength与denoising_start互斥——当denoising_start被显式设置时strength会被忽略get_timesteps中按denoising_start决定去噪范围。局部重绘Inpainting局部重绘需要原始图像 掩码mask掩码中白色区域即待重绘区域。构造描述替换内容的提示词即可from diffusers import AutoPipelineForInpainting from diffusers.utils import load_image, make_image_grid # use from_pipe to avoid consuming additional memory when loading a checkpoint pipeline AutoPipelineForInpainting.from_pipe(pipeline_text2image).to(cuda) # or mps, xpu, cpu img_url https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png mask_url https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-inpaint-mask.png init_image load_image(img_url) mask_image load_image(mask_url) prompt A deep sea diver floating image pipeline(promptprompt, imageinit_image, mask_imagemask_image, strength0.85, guidance_scale12.5).images[0] make_image_grid([init_image, mask_image, image], rows1, cols3)StableDiffusionXLInpaintPipeline同样支持strength默认去噪占比与guidance_scale前者控制重绘范围大小后者控制与提示词的对齐程度。使用 refiner 提升图像质量SDXL 附带一个专门负责低噪声阶段去噪的 refiner 模型stabilityai/stable-diffusion-xl-refiner-1.0用于在 base 模型输出基础上生成更高质量的图像。官方提供两种用法base 与 refiner 联合推理ensemble of expert denoisers一次性生成精修图像先 base 后 refiner原文所对应的训练方式先用 base 生成图像再让 refiner 补充细节。方式一Base Refiner专家去噪器集成将 base 与 refiner 联合使用时本质是ensemble of expert denoisers专家去噪器集成源自 eDiff-I 研究。该方案所需的总去噪步数更少因此明显更快代价是无法直接查看 base 的中间输出——因为此时 base 的输出仍含有大量噪声。在集成中base 模型担任高噪声阶段的专家refiner 担任低噪声阶段的专家。加载时为了让两个模型共享文本编码器与 VAE需要在加载 refiner 时显式传入 base 的组件from diffusers import DiffusionPipeline import torch base DiffusionPipeline.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16, variantfp16, use_safetensorsTrue ).to(cuda) # or mps, xpu, cpu refiner DiffusionPipeline.from_pretrained( stabilityai/stable-diffusion-xl-refiner-1.0, text_encoder_2base.text_encoder_2, vaebase.vae, dtypetorch.float16, use_safetensorsTrue, variantfp16, ).to(cuda)接下来为两个模型分配各自的去噪区间base 模型通过denoising_end控制提前终止点refiner 模型通过denoising_start控制起始点。[!TIP]denoising_end与denoising_start都是 0 到 1 之间的浮点数表示调度器离散时间步的比例。一旦设置了这两个参数strength将被忽略——去噪步数由模型训练所用的离散时间步与声明的分数截断点共同决定。下面的例子中denoising_end0.8让 base 完成前 80% 的高噪声时间步去噪denoising_start0.8让 refiner 完成后 20% 的低噪声时间步去噪。注意 base 的输出类型必须设为latent潜在空间张量而不是 PIL 图像prompt A majestic lion jumping from a big stone at night image base( promptprompt, num_inference_steps40, denoising_end0.8, output_typelatent, ).images image refiner( promptprompt, num_inference_steps40, denoising_start0.8, imageimage, ).images[0] image该用法可复用于局部重绘场景将 base 与 refiner 都加载进StableDiffusionXLInpaintPipelinebase 侧设置denoising_endoutput_typelatentrefiner 侧设置denoising_startfrom diffusers import StableDiffusionXLInpaintPipeline from diffusers.utils import load_image, make_image_grid import torch base StableDiffusionXLInpaintPipeline.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16, variantfp16, use_safetensorsTrue ).to(cuda) # or mps, xpu, cpu refiner StableDiffusionXLInpaintPipeline.from_pretrained( stabilityai/stable-diffusion-xl-refiner-1.0, text_encoder_2base.text_encoder_2, vaebase.vae, dtypetorch.float16, use_safetensorsTrue, variantfp16, ).to(cuda) 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 load_image(img_url) mask_image load_image(mask_url) prompt A majestic tiger sitting on a bench num_inference_steps 75 high_noise_frac 0.7 image base( promptprompt, imageinit_image, mask_imagemask_image, num_inference_stepsnum_inference_steps, denoising_endhigh_noise_frac, output_typelatent, ).images image refiner( promptprompt, imageimage, mask_imagemask_image, num_inference_stepsnum_inference_steps, denoising_starthigh_noise_frac, ).images[0] make_image_grid([init_image, mask_image, image.resize((512, 512))], rows1, cols3)这种专家去噪器集成的方法对所有可用调度器均适用。仓库测试 test_stable_diffusion_xl.py 中的test_stable_diffusion_two_xl_mixture_of_denoiser_fast/test_stable_diffusion_two_xl_mixture_of_denoiser正是对这种两阶段衔接的自动化验证测试通过denoising_end 1.0 - (split / num_train_timesteps)与denoising_start 1.0 - (split / num_train_timesteps)精确切分时间步并断言两阶段实际执行的t序列与期望完全一致见第 386-454 行从源码层面印证了denoising_end/denoising_start的语义。方式二Base 后接 Refiner两阶段串行先用 base 生成一张完全去噪的图像再用 refiner 以图生图方式补充细节。加载方式与上面一致from diffusers import DiffusionPipeline import torch base DiffusionPipeline.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16, variantfp16, use_safetensorsTrue ).to(cuda) # or mps, xpu, cpu refiner DiffusionPipeline.from_pretrained( stabilityai/stable-diffusion-xl-refiner-1.0, text_encoder_2base.text_encoder_2, vaebase.vae, dtypetorch.float16, use_safetensorsTrue, variantfp16, ).to(cuda)先生成 latent 输出prompt Astronaut in a jungle, cold color palette, muted colors, detailed, 8k image base(promptprompt, output_typelatent).images[0]再交给 refiner 精修注意 latent 需要补上 batch 维image refiner(promptprompt, imageimage[None, :]).images[0][!WARNING] SDXL refiner 也可以搭配其他 base 模型使用。例如先用 Hunyuan-DiT 或 PixArt-Sigma 管线生成提示词遵循度更高的图像再将该图像交给 SDXL refiner 提升最终生成质量。官方强调这种方式可显著增强最终图像的整体质感。对于局部重绘场景可将 base 与 refiner 都加载进StableDiffusionXLInpaintPipeline去掉denoising_end和denoising_start参数并为 refiner 选择更少的推理步数。微条件Micro-conditioningSDXL 在训练中引入了多种额外条件注入技术统称为micro-conditioning包括原始图像尺寸original size、目标图像尺寸target size和裁剪坐标crop coordinates。这些微条件可以在推理时用于生成高质量、主体居中的图像。[!TIP] 借助 classifier-free guidance微条件与负微条件参数可以同时使用。它们对StableDiffusionXLPipeline、StableDiffusionXLImg2ImgPipeline、StableDiffusionXLInpaintPipeline以及StableDiffusionXLControlNetPipeline均可用。从源码看pipeline_stable_diffusion_xl.py 第 823-859 行__call__中默认值如下crops_coords_top_left(0, 0)、negative_crops_coords_top_left(0, 0)而original_size、target_size、negative_original_size、negative_target_size缺省时在运行期分别回落到(height, width)或(1024, 1024)见第 1033-1034 行与第 1137-1146 行。这些元组会被_get_add_time_ids拼接成add_time_ids注入 UNet第 730-732 行。尺寸条件Size conditioning尺寸条件分为两类original_size来自训练批次中被放大的图像训练数据中近 40% 是较小的图像直接丢弃太浪费因此 SDXL 学会了放大伪影不应出现在高分辨率图像中。推理时用original_size指示原始分辨率。默认值(1024, 1024)生成的图像质量最高、接近数据集中 1024x1024 的图像若设为更低的(256, 256)模型仍输出 1024x1024 图像但画面会呈现低分辨率图像的风格图案更简单、更模糊。target_size来自 SDXL 针对不同宽高比的微调。推理时默认(1024, 1024)会得到类似数据集中方形图像的构图。官方建议target_size与original_size保持一致但也鼓励自行实验其他组合。Diffusers 还支持对图像尺寸施加负向条件引导生成远离特定分辨率from diffusers import StableDiffusionXLPipeline import torch pipe StableDiffusionXLPipeline.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16, variantfp16, use_safetensorsTrue ).to(cuda) # or mps, xpu, cpu prompt Astronaut in a jungle, cold color palette, muted colors, detailed, 8k image pipe( promptprompt, negative_original_size(512, 512), negative_target_size(1024, 1024), ).images[0]裁剪条件Crop conditioning早期 Stable Diffusion 模型生成的图像有时看起来像被裁切过原因是训练时为了让批内图像尺寸统一图像确实会被裁剪。通过对裁剪坐标施加条件SDXL 学会了不裁剪坐标(0, 0)通常对应主体居中、面部完整——这也是 Diffusers 的默认值。若想生成偏离中心的构图可以尝试其他坐标from diffusers import StableDiffusionXLPipeline import torch pipeline StableDiffusionXLPipeline.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16, variantfp16, use_safetensorsTrue ).to(cuda) # or mps, xpu, cpu prompt Astronaut in a jungle, cold color palette, muted colors, detailed, 8k image pipeline(promptprompt, crops_coords_top_left(256, 0)).images[0] image同样可以指定负裁剪坐标引导生成远离某些裁剪参数from diffusers import StableDiffusionXLPipeline import torch pipe StableDiffusionXLPipeline.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16, variantfp16, use_safetensorsTrue ).to(cuda) # or mps, xpu, cpu prompt Astronaut in a jungle, cold color palette, muted colors, detailed, 8k image pipe( promptprompt, negative_original_size(512, 512), negative_crops_coords_top_left(0, 0), negative_target_size(1024, 1024), ).images[0] image为每个文本编码器使用不同提示词SDXL 使用两个文本编码器因此可以为两者传入不同的提示词从而提升生成质量prompt传给OAI CLIP-ViT/L-14prompt_2传给OpenCLIP-ViT/bigG-14。from diffusers import StableDiffusionXLPipeline import torch pipeline StableDiffusionXLPipeline.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16, variantfp16, use_safetensorsTrue ).to(cuda) # or mps, xpu, cpu # prompt is passed to OAI CLIP-ViT/L-14 prompt Astronaut in a jungle, cold color palette, muted colors, detailed, 8k # prompt_2 is passed to OpenCLIP-ViT/bigG-14 prompt_2 Van Gogh painting image pipeline(promptprompt, prompt_2prompt_2).images[0] image使用负提示词时对应参数为negative_prompt与negative_prompt_2negative_prompt_2缺省时复用negative_prompt。从源码encode_prompt的调用签名第 1081-1095 行可以看出prompt/prompt_2最终会被分别编码并合并为最终的prompt_embeds与pooled_prompt_embeds。此外双文本编码器还支持**文本反演textual inversion**嵌入但需要按 textual inversion 推理指南 中的方法分别加载。分辨率建议与调度器注意事项大多数 SDXL 检查点的最佳出图尺寸是1024x1024768x768 与 512x512 也可用但效果会打折低于 512x512 不建议使用默认检查点如stabilityai/stable-diffusion-xl-base-1.0在低分辨率下效果不佳。使用 DPM 系列调度器且步数少于 50时由于求解器数值不稳定可能产生视觉伪影。官方给出的修复建议对应 PR 5541对 ODE/SDE 求解器设置use_karras_sigmasTrue或lu_lambdasTrue以改善图像质量若使用均匀步长求解器如 DPM2M 或 DPM2M SDE请设置euler_at_finalTrue。推理参数速查call核心参数以下参数来自StableDiffusionXLPipeline.__call__的签名与文档pipeline_stable_diffusion_xl.py 第 823-992 行参数默认值说明prompt/prompt_2None双文本编码器的提示词prompt_2缺省时复用promptheight/width1024生成图像尺寸低于 512 效果不佳num_inference_steps50去噪步数越多质量越高但越慢denoising_endNone提前终止去噪的比例0~1用于 base 阶段guidance_scale5.0CFG 引导强度大于 1 时启用越高越贴合提示词但可能降低画质negative_prompt/negative_prompt_2None负提示词negative_prompt_2缺省复用前者output_typepil输出格式可选pil或latent供 refiner 接力original_size(height, width)微条件原始图像尺寸crops_coords_top_left(0, 0)微条件左上裁剪坐标target_size(height, width)微条件目标图像尺寸negative_original_size(1024, 1024)负微条件原始尺寸negative_crops_coords_top_left(0, 0)负微条件裁剪坐标negative_target_size(1024, 1024)负微条件目标尺寸clip_skipNone跳过 CLIP 层数1 表示使用倒数第二层输出计算提示词嵌入guidance_rescale0.0引导重缩放因子零终端 SNR 下的过曝修复显存优化与推理加速SDXL 体积较大在受限硬件上可能需要优化内存。官方给出三条建议CPU 卸载解决 OOM显存不足用enable_model_cpu_offload替代.to(cuda)- base.to(cuda) # or mps, xpu, cpu - refiner.to(cuda) base.enable_model_cpu_offload() refiner.enable_model_cpu_offload()torch.compile提速约 20%需要torch2.0 base.unet torch.compile(base.unet, modereduce-overhead, fullgraphTrue) refiner.unet torch.compile(refiner.unet, modereduce-overhead, fullgraphTrue)xFormers内存高效注意力torch2.0时用于运行 SDXL详见 xFormers 优化指南 base.enable_xformers_memory_efficient_attention() refiner.enable_xformers_memory_efficient_attention()此外StableDiffusionXLPipeline还内置了enable_attention_slicing、enable_vae_slicing、enable_vae_tiling、enable_sequential_cpu_offload等方法更多显存优化手段可参考 内存优化指南。仓库测试 test_stable_diffusion_xl.py 中也有test_stable_diffusion_xl_vae_slicing、test_stable_diffusion_xl_vae_tiling、test_freeu_enabled等用例对相关优化路径进行回归验证。延伸阅读官方 base 与 refiner 检查点可查看 Stability AI 的 Hub 组织stabilityai/stable-diffusion-xl-base-1.0与stabilityai/stable-diffusion-xl-refiner-1.0。若想研究 SDXL 所用UNet2DConditionModel的最小化实现可参考 PyTorch 编写且与 Diffusers 直接兼容的 minSDXL 项目。相关管线源码与测试pipeline_stable_diffusion_xl.pypipeline_stable_diffusion_xl_img2img.pypipeline_stable_diffusion_xl_inpaint.pywatermark.pytest_stable_diffusion_xl.pytest_stable_diffusion_xl_img2img.pytest_stable_diffusion_xl_inpaint.py【免费下载链接】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),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →