尧图精选

Diffusers 无条件图像生成实战指南:用 DiffusionPipeline 与 DDPM 从零生成图像

🕒 发布时间:2026/9/10 4:15:08 📁 来源:尧图网络
Diffusers 无条件图像生成实战指南用 DiffusionPipeline 与 DDPM 从零生成图像【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers无条件图像生成Unconditional Image Generation是扩散模型最基础也最直观的应用场景模型不依赖任何文本提示或参考图像仅凭纯噪声出发一步步去噪最终还原出与训练数据分布相似的图像。本文以 Diffusers 官方文档docs/source/ko/using-diffusers/unconditional_image_generation.md为主线结合仓库内DDPMPipeline源码与无条件训练脚本系统讲解如何用DiffusionPipeline一行加载预训练 checkpoint、在 GPU 上完成推理、保存输出图像并深入剖析去噪循环的底层原理与推理参数最后介绍如何训练属于自己的无条件生成模型。什么是无条件图像生成无条件图像生成是相对条件生成如文生图、图生图而言的。它的特点在于无输入条件不需要文本提示prompt、类别标签或参考图模型只从随机高斯噪声出发目标是学习数据分布训练阶段模型学习训练集的像素分布推理阶段从中采样生成像训练数据但又不完全相同的新图像典型的落地场景生成与数据集同风格的新样本例如蝴蝶图像、花朵图像、卡通头像、人脸等。在 Diffusers 中这类任务通常由DDPMPipeline、DDIMPipeline等无提示词的 pipeline 承担配合UNet2DModel这类二维 U-Net 去噪骨干与DDPMScheduler调度器完成整个去噪采样流程。一行代码加载预训练 pipelineDiffusionPipeline是 Diffusers 提供的统一入口类位于 src/diffusers/pipelines/pipeline_utils.py官方文档称其为为推理使用预训练扩散系统的最简单方式。它最大的价值在于自动装配只需要指定一个 checkpoint 标识from_pretrained就会根据 checkpoint 内的配置文件自动实例化对应的模型组件如 U-Net、调度器如 DDPMScheduler并把所有参数权重下载到本地缓存。最基本的用法只需两行代码from diffusers import DiffusionPipeline generator DiffusionPipeline.from_pretrained(anton-l/ddpm-butterflies-128)其中from_pretrained的第一个参数pretrained_model_name_or_path支持两种来源见 pipeline_utils.py 中该方法的 docstring传入值含义Hub 上的 repo id字符串例如anton-l/ddpm-butterflies-128从 Hugging Face Hub 下载本地目录路径例如./my_pipeline_directory/加载通过save_pretrained保存的 pipeline 目录from_pretrained会一次性下载并缓存 pipeline 的全部组成部件——模型权重、tokenizer如存在、调度器配置等因此用户无需关心内部的组件组装细节。该 checkpoint 的训练数据是蝴蝶图像因此生成的图像内容以蝴蝶为主。关于模型规模原文档提到该模型包含约 14 亿参数并强烈建议在 GPU 上运行。需要注意anton-l/ddpm-butterflies-128是 128×128 分辨率的小型 DDPM 模型实际参数量远小于 14 亿14 亿规模通常指 Stable Diffusion 这类大型文生图模型推理对显存的要求也相对宽松。准确的参数规模以你所加载 checkpoint 的模型卡与配置文件为准不同 checkpoint 差异很大。文末我们也会看到自己训练的无条件模型完全可以在单卡甚至 CPU 上跑通推理。加载 pipeline 时的常用参数from_pretrained还支持丰富的关键字参数详见 源码 docstring以下是实践中最常用的几个pipe DiffusionPipeline.from_pretrained( anton-l/ddpm-butterflies-128, torch_dtypetorch.float16, # 以半精度加载节省显存并加速推理 cache_dir./cache, # 自定义缓存目录 local_files_onlyTrue, # 仅使用本地已缓存文件不联网下载 revisionmain, # 指定分支 / tag / commit force_downloadFalse, # 强制重新下载覆盖缓存 )torch_dtype覆盖默认精度加载模型。以torch.float16加载可将显存占用与推理开销大幅降低cache_dir修改权重缓存位置便于离线部署或多环境共享缓存local_files_only设为True时只从本地缓存读取适合离线环境revision选择 checkpoint 的特定版本分支名、tag 或 commit idforce_download强制重新拉取忽略已有缓存。将 pipeline 迁移到 GPU 与 CPU 推理的注意事项加载完成后pipeline 默认位于 CPU。与 PyTorch 模块一致通过.to(device)可将全部内部模块U-Net、调度器等迁移到指定设备generator.to(cuda)源码层面to方法见 pipeline_utils.py会遍历 pipeline 注册的所有torch.nn.Module组件并逐个迁移。文档同样指出推荐在 GPU 上运行以获得可接受的推理速度若以torch.float16精度加载则不建议移回 CPU 运行——PyTorch 的float16运算在 CPU 上缺乏完整支持可能导致推理失败源码会在检测到float16 CPU 组合时给出警告见 pipeline_utils.py。此外在 Apple Silicon 上也可以使用generator.to(mps)迁移到 MPS 设备DDPMPipeline源码中专门处理了device.type mps时随机张量生成的可复现性问题见 pipeline_ddpm.py。生成并保存图像设备迁移完成后直接调用 pipeline 对象即可生成图像image generator().images[0]几点说明默认output_typepil因此images列表中的元素是PIL.Image 对象内部通过numpy_to_pil转换见 pipeline_ddpm.py可直接用于展示或后续图像处理返回对象是ImagePipelineOutputreturn_dictTrue时通过.images属性取得图像列表若return_dictFalse则返回普通 tuple第一个元素即图像列表每个元素对应一个 batch 中的一张图batch_size默认 1。保存图像同样简单image.save(generated_image.png)PIL.Image.save会根据文件扩展名自动选择编码格式也支持jpg、webp等常见格式。深入 DDPMPipeline__call__参数与去噪循环原理当加载anton-l/ddpm-butterflies-128这类 DDPM checkpoint 时DiffusionPipeline.from_pretrained实际实例化的是DDPMPipeline源码位于 src/diffusers/pipelines/ddpm/pipeline_ddpm.py它由UNet2DModel与DDPMScheduler两个核心组件组成。理解它的__call__签名就等于掌握了无条件生成的全部控制旋钮torch.no_grad() def __call__( self, batch_size: int 1, # 一次生成的图像数量 generator: torch.Generator | list[torch.Generator] | None None, # 随机数生成器用于可复现 num_inference_steps: int 1000, # 去噪步数 output_type: str | None pil, # 输出格式pil / np / pt return_dict: bool True, # 返回 ImagePipelineOutput 还是 tuple ) - ImagePipelineOutput | tuple:各参数详解参数默认值作用与取值范围batch_size1生成的图像数量设大于 1 可一次生成多张generatorNonetorch.Generator实例传入后随机噪声可复现便于调试与对照实验num_inference_steps1000去噪迭代步数。步数越多图像质量通常越高但推理耗时线性增长DDPM 默认 1000 步实践中可结合 DDIM 等调度器大幅减少步数output_typepil输出格式pilPIL.Image、npnumpy 数组、pttorch.Tensorreturn_dictTrueTrue返回ImagePipelineOutputFalse返回(images,)元组底层去噪循环从噪声到图像DDPMPipeline.__call__的完整执行流程见 pipeline_ddpm.py清晰地展示了无条件生成的工作原理初始化纯噪声根据unet.config.sample_size与in_channels构造(batch_size, channels, height, width)形状用randn_tensor采样高斯噪声作为起始图像x_T设置时间步调用self.scheduler.set_timesteps(num_inference_steps)由调度器生成递减的时间步序列迭代去噪对每个时间步t先让 U-Net 预测噪声model_output self.unet(image, t).sample再由调度器根据预测噪声计算上一时刻图像image self.scheduler.step(model_output, t, image, generatorgenerator).prev_sample实现x_t - x_{t-1}的逐步去噪像素域还原将潜空间图像映射回[0, 1]image (image / 2 0.5).clamp(0, 1)格式转换与输出根据output_type转换为 PIL / numpy / tensor并以ImagePipelineOutput返回。整个过程被torch.no_grad()包裹推理阶段不计算梯度节省显存。理解这五步后若想进一步加速只需把DDPMScheduler换成DDIMScheduler并减少num_inference_steps——这也是从 1000 步 DDPM 走向实用化采样的经典路径。推理加速与显存优化技巧针对无条件生成这类长时间推理任务Diffusers 提供了若干开箱即用的优化开关它们在DiffusionPipeline基类中均有实现enable_attention_slicing()将注意力计算切分为多个子块顺序执行牺牲少量速度换取显存大幅下降见 pipeline_utils.py显存紧张时优先开启enable_xformers_memory_efficient_attention()借助 xFormers 库使用内存高效的注意力算子兼顾速度与显存见 pipeline_utils.py需要先pip install xformersenable_model_cpu_offload()将 pipeline 各组件按序在 CPU 与 GPU 之间换入换出用 PCIe 传输换取显存占用的大幅下降见 pipeline_utils.py适合超大模型在单卡上运行半精度加载from_pretrained(..., torch_dtypetorch.float16)配合 GPU 使用几乎可减半显存与计算量。一个组合使用的示例pipe DiffusionPipeline.from_pretrained( anton-l/ddpm-butterflies-128, torch_dtypetorch.float16, ).to(cuda) pipe.enable_attention_slicing() # 如需更低显存pipe.enable_model_cpu_offload() image pipe(num_inference_steps100).images[0]让结果可复现torch.Generator 的用法扩散采样依赖随机噪声每次调用都会得到不同结果。若需要复现实验结果或做公平的对比可显式传入torch.Generatorimport torch g torch.Generator(devicecuda).manual_seed(0) image pipe(generatorg).images[0]相同 seed 下噪声初始化与调度器的每一步采样scheduler.step(..., generatorgenerator)都可复现从而得到完全一致的输出图像。训练属于自己的无条件生成模型除了直接使用预训练 checkpoint你还可以在自定义数据集上训练无条件生成模型。仓库提供了开箱即用的训练脚本 examples/unconditional_image_generation/train_unconditional.py 与配套测试 test_unconditional.py详细说明见 examples/unconditional_image_generation/README.md。环境准备在新建的虚拟环境中从源码安装 Diffusers并安装示例依赖git clone https://github.com/huggingface/diffusers cd diffusers pip install .进入示例目录安装训练依赖并初始化 Accelerate 分布式环境cd examples/unconditional_image_generation pip install -r requirements.txt accelerate config训练一个花朵无条件生成模型以 Oxford Flowers 数据集为例训练一个 DDPM UNet 模型accelerate launch train_unconditional.py \ --dataset_namehuggan/flowers-102-categories \ --resolution64 --center_crop --random_flip \ --output_dirddpm-ema-flowers-64 \ --train_batch_size16 \ --num_epochs100 \ --gradient_accumulation_steps1 \ --use_ema \ --learning_rate1e-4 \ --lr_warmup_steps500 \ --mixed_precisionno \ --push_to_hub核心参数速查参数作用--dataset_name/--train_data_dir指定 Hub 数据集名或本地图片文件夹路径文件夹内任意层级放.png等图片即可脚本自动用ImageFolder收集--resolution训练分辨率如 64/128影响显存与训练耗时--center_crop、--random_flip数据增强中心裁剪与随机水平翻转--use_ema启用指数移动平均稳定输出质量--gradient_accumulation_steps梯度累积步数等效放大 batch size--mixed_precisionno/fp16等控制混合精度训练--push_to_hub训练完成后将模型推送到 Hub--output_dir模型与日志输出目录使用自己的数据训练两种方式任选本地文件夹把图片放进任意目录支持子目录执行accelerate launch train_unconditional.py --train_data_dir 路径 ...上传到 Hub用datasets库的load_dataset(imagefolder, data_dir...)构建数据集并push_to_hub后以--dataset_name传入。若数据包含 16/32 位通道如医学 TIFF可加--preserve_input_precision保留原始精度。多 GPU 分布式训练借助 Accelerate 可无缝扩展到多卡accelerate launch --mixed_precisionfp16 --multi_gpu train_unconditional.py \ --dataset_namehuggan/pokemon \ --resolution64 --center_crop --random_flip \ --output_dirddpm-ema-pokemon-64 \ --train_batch_size16 \ --num_epochs100 \ --gradient_accumulation_steps1 \ --use_ema \ --learning_rate1e-4 \ --lr_warmup_steps500 \ --mixed_precisionfp16 \ --loggerwandb如需使用 Weights Biases 记录训练曲线先pip install wandb再用--loggerwandb开启。训练完成后同样用DiffusionPipeline.from_pretrained加载--output_dir指定目录即可推理from diffusers import DiffusionPipeline pipe DiffusionPipeline.from_pretrained(ddpm-ema-flowers-64).to(cuda) image pipe(num_inference_steps200).images[0] image.save(my_flower.png)小结本文围绕 Diffusers 无条件图像生成展开从DiffusionPipeline.from_pretrained的一行加载到 GPU 迁移与图像保存再到DDPMPipeline.__call__的五个核心参数与底层噪声初始化 → 迭代去噪 → 像素还原的完整链路最后给出了推理加速技巧、可复现生成方法以及基于train_unconditional.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),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →