Stable Diffusion 是一个深度学习模型,可以生成图片。本质上,它是一个程序,您可以提供输入(例如文本提示)并获得代表像素数组的张量,然后您可以将其保存为图像文件。无需使用特定的用户界面。在任何用户界面可用之前,您应该在代码中运行 Stable Diffusion。
在本教程中,我们将介绍如何使用 Hugging Face 的 diffusers
库来运行 Stable Diffusion。
完成本教程后,你将学到:
- 如何安装
diffusers
库及其依赖项 - 如何在
diffusers
中创建管道 - 如何微调您的图像生成过程
使用我的书 《掌握 Stable Diffusion 数字艺术》 启动您的项目。它提供了自学教程和可运行代码。
让我们开始吧。

在 Python 中运行 Stable Diffusion
照片作者: Himanshu Choudhary。保留部分权利。
概述
本教程分为三个部分;它们是
- Diffusers 库简介
- 自定义 Stable Diffusion 管道
- Diffusers 库中的其他模块
Diffusers 库简介
Stable Diffusion 以其强大的文本到图像生成能力席卷了整个领域。它能够根据文本描述生成高质量、细节丰富的图像,使其成为艺术家、设计师以及任何有创意火花的人的强大工具。通过 Stable Diffusion 模型文件,您可以使用 PyTorch 重建深度学习模型,但由于涉及许多步骤,您需要编写大量代码才能使用它。Hugging Face Diffusers 库可以利用 Stable Diffusion 的潜力,让您创造出自己梦幻般的创作。
在使用之前,您应该在 Python 环境中安装 diffusers 库
1 |
pip install diffusers transformers accelerate |
这些 Python 包有很多依赖项,包括 PyTorch。
在这篇文章中,您将使用 diffuers 库中的 pipeline 函数。它之所以被称为 pipeline,是因为它不是一个单一的深度学习模型允许您根据您的输入生成图片,而是许多较小的模型协同工作来实现这一点。让我们看一个例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from diffusers import StableDiffusionPipeline, DDPMScheduler import torch pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", variant="fp16", torch_dtype=torch.float16) pipe.to("cuda") prompt = "A cat took a fish and running in a market" scheduler = DDPMScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear") image = pipe( prompt, scheduler=scheduler, num_inference_steps=30, guidance_scale=7.5, ).images[0] image.save("cat.png") |
这些是生成图片并将其保存为 PNG 格式的 cat.png
的几行代码。这是生成图片的示例。

使用 Stable Diffusion 管道生成的图片。
然而,后端做了大量的工作。您传入了一个文本提示。此提示已使用预训练的嵌入模型转换为数值张量。然后将该张量传递给 Stable Diffusion 模型,该模型从 Hugging Face 存储库“CompVis/stable-diffusion-v1-4”(官方 Stable Diffusion v1.4 模型)下载。此模型将以 30 个步骤和 DDPM 调度器运行。Stable Diffusion 模型的输出将是一个浮点张量,在保存之前需要将其转换为像素值。所有这些都通过将组件与管道链接到对象 pipe
来完成。
自定义 Stable Diffusion 管道
在之前的代码中,您从 Hugging Face 存储库下载了一个预训练模型。即使对于同一个存储库,同一模型的不同“变体”也是可用的。大多数情况下,默认变体使用 32 位浮点数,适用于 CPU 和 GPU 运行。您在上面的代码中使用的变体是 fp16
,它使用 16 位浮点数。它并非总是可用,也并非总是如此命名。您应该检查相应的存储库以了解更多详细信息。
由于使用的变体是 16 位浮点数,因此您也指定了 torch_dtype
来使用 torch.float16
。请注意,大多数 CPU 无法处理 16 位浮点数(也称为半精度浮点数),但 GPU 可以。因此,您看到创建的管道通过语句 pipe.to("cuda")
传递到 GPU。
您可以尝试以下修改,您应该会观察到生成速度明显变慢,因为它是在 CPU 上运行的。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from diffusers import StableDiffusionPipeline, DDPMScheduler pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4") prompt = "A cat took a fish and running in a market" scheduler = DDPMScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear") image = pipe( prompt, scheduler=scheduler, num_inference_steps=30, guidance_scale=7.5, ).images[0] image.save("cat.png") |
但是,如果您一直在使用 Stable Diffusion Web UI 并下载了 Stable Diffusion 的第三方模型。在这种情况下,您应该熟悉以 SafeTensors 格式保存的模型文件。这与上述 Hugging Face 存储库格式不同。最值得注意的是,存储库将包含一个 config.json
文件来描述如何使用模型,但此类信息应该从 SafeTensor 模型文件中推断出来。
您仍然可以使用下载的模型文件。例如,使用以下代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from diffusers import StableDiffusionPipeline, DDPMScheduler model = "./path/realisticVisionV60B1_v60B1VAE.safetensors" pipe = StableDiffusionPipeline.from_single_file(model) pipe.to("cuda") prompt = "A cat took a fish and running away from the market" scheduler = DDPMScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear") image = pipe( prompt, scheduler=scheduler, num_inference_steps=30, guidance_scale=7.5, ).images[0] image.save("cat.png") |
此代码使用 StableDiffusionPipeline.from_single_file()
而不是 StableDiffusionPipeline.from_pretrained()
。此函数的参数假定为模型文件的路径。它将确定文件是 SafeTensors 格式。diffusers
库的巧妙之处在于,在您交换了创建管道的方式后,无需更改其他任何内容。
请注意,每个 Pipeline 都假定一种特定的架构。例如,diffusers
库中有一个 StableDiffusionXLPipeline
,专门用于 Stable Diffusion XL。您不能将模型文件与错误的管道构建器一起使用。
您可以发现,Stable Diffusion 图像生成过程中最重要的参数在您触发过程时调用 pipe()
函数时进行了描述。例如,您可以指定调度器、步长和 CFG 比例。调度器确实有一组配置参数。您可以从 diffuers
库支持的众多调度器中进行选择,您可以在 diffusers API 手册的详细信息中找到它们。
例如,以下是使用更快的替代方案 Euler Scheduler,并保持其他所有内容不变。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler model = "./path/realisticVisionV60B1_v60B1VAE.safetensors" pipe = StableDiffusionPipeline.from_single_file(model) pipe.to("cuda") prompt = "A cat took a fish and running away from the market" scheduler = EulerDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear") image = pipe( prompt, scheduler=scheduler, num_inference_steps=30, guidance_scale=7.5, ).images[0] image.save("cat.png") |
Diffusers 库中的其他模块
StableDiffusionPipeline
并不是 diffusers
库中唯一的管道。如上所述,您有用于 XL 模型的 StableDiffusionXLPipeline
,但还有更多。例如,如果您不仅提供文本提示,而是使用 img2img 调用 Stable Diffusion 模型,则必须使用 StableDiffusionImg2ImgPipeline
。您可以将 PIL 对象的图像作为参数传递给管道。您可以在 diffusers
文档中查看可用的管道。
即使有许多不同的管道,您应该会发现它们都工作相似。工作流程与上面的示例代码高度相似。您应该会发现它易于使用,而无需理解背后的详细机制。
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
- Diffusers API 手册
- Stable Diffusion 管道概述
- StableDiffusionPipeline API
- Euler Scheduler API
- DDPM Scheduler API
总结
在这篇文章中,您将发现如何使用 Hugging Face 的 diffusers
库。特别是,您学习了:
- 如何创建管道以根据提示创建图像
- 如何重用本地模型文件,而不是从在线存储库动态下载
- diffusers 库中还有哪些其他管道模型可用
暂无评论。