之前在业务迭代中接入 AIGC 能力时,反复踩到 Stable Diffusion 1.5 的部署坑:模型下载卡住、环境依赖冲突、显存不足、生成出来一片噪点。网上相关教程虽然多,但要么只讲 WebUI 点鼠标,要么只贴代码不讲原理,分散在各个帖子里的经验很难直接串起来用。本文整理了一套从零开始的 Stable Diffusion 1.5 实战教程,覆盖核心概念、环境搭建、模型下载、diffusers 生成图片、WebUI 部署、参数调优和常见问题排查。
这个主题适合两类读者:第一类是刚接触 AIGC、想把 Stable Diffusion 跑起来的初学者;第二类是需要在项目里接入文生图能力、对模型加载和生成稳定性有要求的开发者。学完本文,你可以掌握 Stable Diffusion 1.5 的模型结构,能在本地用 Python 代码完成一次真实出图,也能理解 prompt、采样步数、CFG 这些核心参数对成图效果的影响。
1. Stable Diffusion 1.5 是什么:扩散模型的入门首选
1.1 从“画图”到“文生图”的基本逻辑
Stable Diffusion 是一类基于扩散(Diffusion)思想的生成模型。它的工作方式可以简单理解为:先在纯噪声图像上不断去噪,每一步去除一点噪声,直到最终浮现出符合文字描述的图像。1.5 版本是 Stable Diffusion 系列中非常有代表性的开源版本,社区生态非常完整,大量 LoRA、ControlNet 扩展和微调模型都围绕它展开。
与直接在高分辨率像素空间生成图像不同,Stable Diffusion 在“隐空间”中执行扩散过程。所谓隐空间,就是先用 VAE 模型把图像压缩成低维特征,再在这个低维特征上做去噪,最后把特征解码回像素图。这样做最大的好处是计算量大幅下降,普通消费级显卡就能跑起来。
1.2 Stable Diffusion 1.5 的适用场景
Stable Diffusion 1.5 可以用来做很多事情:
- 根据文字描述生成概念图,比如“一只戴帽子的橘猫,油画风格”。
- 在电商场景中生成商品背景图或素材图。
- 为游戏项目快速生成角色设定、场景概念稿。
- 利用 img2img 功能进行局部重绘、风格迁移。
- 配合 ControlNet 精确控制人物姿态、边缘结构、景深等条件。
在更多时候,Stable Diffusion 1.5 是学习和理解扩散模型的最佳起点。它的模型结构清晰,相关论文、源码和社区经验都非常多,遇到问题很容易检索到答案。
1.3 为什么选择 1.5 而不是 2.x 或 SDXL
Stable Diffusion 后续版本虽然整体能力更强,但 1.5 仍然有不可替代的优势:模型体积适中,硬性要求低,LoRA 和插件资源最多,兼容 Stable Diffusion WebUI。很多第三方的微调模型、动画风格模型都是基于 1.5 训练的。对于需要快速验证“文生图”业务效果的团队来说,1.5 是性价比最高的选择。
2. 环境准备与版本说明
2.1 硬件要求
运行 Stable Diffusion 1.5 最理想的设备是 NVIDIA 显卡。以常见使用场景为例:
- 显存 6GB 以上:可以稳定生成 512×512 图片。
- 显存 8GB 以上:可以尝试更高分辨率,使用更复杂的辅助插件。
- 显存 4GB 及以下:建议开启 CPU offload 或降低分辨率。
- 纯 CPU 运行:理论上可行,但生成一张 512×512 图片可能需要几分钟到十几分钟。
如果只有 Apple Silicon 芯片,可以通过 PyTorch 的 MPS 后端运行,但部分算子兼容性需要额外处理。本文示例以 NVIDIA GPU + CUDA 环境为主。
2.2 软件环境
在开始之前,建议先确认本机已安装 NVIDIA 显卡驱动,并确认 CUDA 可用。打开终端执行:
nvidia-smi输出中如果能看到显卡信息,例如 “NVIDIA GeForce RTX 3060”,说明驱动正常。之后再安装 PyTorch。不同 PyTorch 版本对应不同 CUDA 版本,本文示例以 CUDA 11.8 或 12.x 环境为例,具体版本需要根据你的显卡驱动和安装的 CUDA 工具包来调整。
Python 建议使用 3.8 到 3.10。虽然新版 Python 也能运行,但部分依赖库可能没有对应轮子,会遇到编译问题,所以保守选择更省心。
2.3 创建虚拟环境
为了避免不同项目之间的依赖冲突,强烈建议使用虚拟环境。这里以 conda 为例:
conda create -n sd15 python=3.10 conda activate sd15如果不想使用 conda,也可以用 Python 自带的 venv:
python -m venv sd15-env # Windows sd15-env\Scripts\activate # macOS / Linux source sd15-env/bin/activate2.4 安装依赖库
激活环境后,依次安装核心依赖:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install diffusers transformers accelerate safetensors huggingface_hub pillow安装完成后,检查 PyTorch 能否正确识别 GPU:
import torch print(torch.__version__) print(torch.cuda.is_available())如果输出True,说明 GPU 环境可用。如果输出False,请检查 PyTorch 的 CUDA 版本是否和驱动匹配。
3. 模型下载与本地目录结构
3.1 常见模型文件格式
Stable Diffusion 1.5 模型常见有两种保存格式:
ckpt:早期常见格式,会把整个模型打包在一个文件里,方便 WebUI 直接加载。safetensors:更安全的格式,避免ckpt在反序列化时可能引入的安全风险,加载速度也更快。
在使用 diffusers 库时,一般建议下载 diffusers 格式的模型目录。目录里会包含多个子目录和文件,结构大致如下:
stable-diffusion-v1-5/ ├── model_index.json ├── scheduler/ ├── text_encoder/ ├── tokenizer/ ├── unet/ ├── vae/ └── safety_checker/其中model_index.json是 diffusers 加载模型时的入口,它记录了组件类型、模型类名、格式等信息。unet是负责去噪的骨干网络,text_encoder是负责理解文字的 CLIP 模型,vae负责图像压缩和重建。
3.2 使用 Hugging Face 下载模型
Stable Diffusion 1.5 官方模型仓库在 Hugging Face 上。由于模型许可协议要求,下载前需要先在 Hugging Face 官网登录账号,并阅读、同意模型卡页面的使用协议,然后在代码里配置访问令牌(access token)。
安装 huggingface_hub 后,可以在命令行下载模型:
huggingface-cli login按提示输入你的访问令牌。然后使用如下命令下载指定模型仓库:
huggingface-cli download --resume-download \ runwayml/stable-diffusion-v1-5 \ --local-dir ./stable-diffusion-v1-5需要注意的是,不同时期的模型仓库可能存在改名或下线的情况。如果遇到仓库无法访问,需要以当前 Hugging Face 上的实际情况为准,或者换成社区上同样基于 SD 1.5 重建的 diffusers 格式仓库。
3.3 国内网络环境的下载加速方案
在部分网络环境下,直接访问 Hugging Face 的速度较慢。可以通过国内镜像加速下载。一个常见做法是设置镜像环境变量:
export HF_ENDPOINT=https://hf-mirror.com然后重新执行下载命令。下载完成后,记得检查本地模型目录是否包含model_index.json,以及unet、vae等关键子目录是否完整。
磁盘空间方面,SD 1.5 diffusers 格式模型大约占用 4GB 到 7GB 空间,下载前要预留足够存储空间。
4. 核心原理拆解:从文本到图像的完整链路
4.1 四个核心组件
在 diffusers 中,Stable Diffusion 1.5 由四个核心组件协同工作:
| 组件 | 作用 | 通俗理解 |
|---|---|---|
| Text Encoder | 将文本描述转换为条件向量 | 把“一只猫”变成模型能理解的数字特征 |
| UNet | 逐步预测并去除噪声 | 真正的“画画”主力,每步让图像更清晰 |
| VAE | 图像与隐空间之间的编解码 | 负责压缩和解压图像信息 |
| Scheduler | 控制去噪步长与策略 | 决定每一步去噪的幅度 |
整个生成链路可以概括为:
- 输入一段文字 prompt,Text Encoder 将其转换为文本 embeddings。
- 随机生成一个与输出尺寸匹配的隐空间噪声张量。
- UNet 结合文本条件,在调度器的控制下多步去噪。
- 去噪完成后,VAE 解码隐空间特征为像素级图像。
- 可选的安全检查器会过滤不适合公开的内容。
4.2 关键参数:prompt、采样步数、CFG、seed
在生成图片时,我们最常调整的几个参数:
prompt:正向提示词,描述你希望看到的内容,越具体越好。negative_prompt:负向提示词,描述你不希望出现的内容。num_inference_steps:采样步数。步数越多,去噪过程越长,但并不是越多越好。默认常用 20 到 30 步。guidance_scale:提示词引导强度,也叫 CFG Scale。数值越大,图像越贴近 prompt,但过大会导致颜色过饱和、图像失真。常见范围 7 到 15。height/width:生成图像的尺寸。SD 1.5 原生建议 512×512,直接生成 1024×1024 容易出现构图崩坏。seed:随机种子。固定 seed 后,同一 prompt 和相同参数下可以复现相同结果。
我们来看一个最简单的 diffusers 生成脚本。
5. 完整实战:用 diffusers 生成第一张图
5.1 项目结构准备
建议创建一个独立目录:
sd15-project/ ├── models/ │ └── stable-diffusion-v1-5/ ├── outputs/ └── gen_image.pymodels用来放本地模型,outputs用来放生成的图片,gen_image.py是生成脚本。
创建目录:
mkdir -p sd15-project/models sd15-project/outputs cd sd15-project5.2 编写最小生成脚本
在gen_image.py中输入以下代码:
from diffusers import StableDiffusionPipeline import torch # 如果模型已经下载到本地,使用 local_path;否则可以填写 hugging face 仓库 id model_path = "./models/stable-diffusion-v1-5" pipe = StableDiffusionPipeline.from_pretrained( model_path, torch_dtype=torch.float16, safety_checker=None, requires_safety_checker=False ) pipe = pipe.to("cuda") pipe.enable_attention_slicing() prompt = "a cute orange cat wearing a wizard hat, digital art, high quality" negative_prompt = "blurry, low quality, text, watermark" image = pipe( prompt=prompt, negative_prompt=negative_prompt, num_inference_steps=25, guidance_scale=7.5, height=512, width=512, seed=42, ).images[0] image.save("outputs/cat_wizard.png") print("Saved to outputs/cat_wizard.png")注意,新版 diffusers 中使用seed参数可能不会再生效,因为生成过程已经移交给torch.Generator控制。更标准的方式是用generator参数:
import torch g = torch.Generator(device="cuda").manual_seed(42) image = pipe( prompt=prompt, negative_prompt=negative_prompt, num_inference_steps=25, guidance_scale=7.5, height=512, width=512, generator=g, ).images[0]建议优先使用generator方式,这样随机种子控制更可靠,也方便复现实验。
5.3 运行与验证
运行脚本:
python gen_image.py如果一切正常,程序会输出Saved to outputs/cat_wizard.png。打开图片目录,你应该可以看到一张包含“戴巫师帽的橘猫”的图片。当然,实际效果会随模型版本和参数有所变化。
第一次运行需要把模型从本地磁盘加载到显存,时间可能稍长。之后再次生成就快了。
5.4 批量生成与结果管理
实际项目中往往需要批量测试不同 prompt 和 seed。下面是一个批量生成示例:固定 3 个 prompt 和 2 个 seed,共生成 6 张图。
from diffusers import StableDiffusionPipeline import torch from pathlib import Path model_path = "./models/stable-diffusion-v1-5" output_dir = Path("outputs") output_dir.mkdir(exist_ok=True) pipe = StableDiffusionPipeline.from_pretrained( model_path, torch_dtype=torch.float16, safety_checker=None, requires_safety_checker=False ) pipe = pipe.to("cuda") pipe.enable_attention_slicing() prompts = [ "a castle on a mountain at sunset, fantasy art", "a futuristic city street in rainy night, neon lights", "a small cabin in the snowy forest, winter morning", ] seeds = [100, 200] for prompt in prompts: for seed in seeds: generator = torch.Generator(device="cuda").manual_seed(seed) image = pipe( prompt=prompt, negative_prompt="blurry, low quality, watermark", num_inference_steps=25, guidance_scale=7.5, generator=generator, ).images[0] filename = f"seed_{seed}_{prompt.replace(' ', '_')[:20]}.png" image.save(output_dir / filename) print(f"Generate {filename}")批量生成时要注意显存占用。如果显存不够,可以把pipe.to("cuda")改为使用pipe.enable_model_cpu_offload(),让模型在 CPU 和 GPU 间动态切换,显存开销会小很多。
5.5 使用 Stable Diffusion WebUI 部署
除了用 diffusers 写代码,还有很多开发者使用 Stable Diffusion WebUI 做交互式部署。WebUI 是开源项目,安装方式以官方 README 为准。基础启动流程是:
- 克隆 WebUI 项目代码到本地。
- 安装项目依赖。
- 把
.ckpt或.safetensors模型放入models/Stable-diffusion目录。 - 启动 WebUI 服务,在浏览器中打开页面。
如果显存较小,可以给 WebUI 增加低显存启动参数:
./webui.sh --medvram--medvram选项会优化显存分配,牺牲少量速度换取稳定性。WebUI 适合交互调整 prompt、选择采样器和浏览社区模型,而 diffusers 方式更适合批量生成、后端集成、自动化流程。
6. 常见问题与排查思路
部署和生成过程中,经常会遇到下面几类问题。下面整理了一张排查表,后面再逐一展开。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 下载模型时中断 | 网络不稳定 | 使用镜像环境变量,开启断点续传 |
| 启动时报 CUDA out of memory | 显存不足 | 降低分辨率,使用 CPU offload、attention slicing |
| 生成图片全是噪点 | 步数过少或模型加载失败 | 增加采样步数,检查模型格式 |
| 生成黑白图片 | VAE 半精度导致解码异常 | 用 fp16 生成但 VAE 保持 fp32,或修复 vae |
| 图片出现重复结构 | 分辨率超出模型训练范围 | 回到 512×512,或使用图生图放大方案 |
| 相同 seed 但结果不同 | 计算环境或版本不一致 | 固定依赖版本,使用相同采样器 |
6.1 模型下载失败或中断
如果使用huggingface-cli download时中断,可以加上--resume-download继续下载。对于国内网络,可以设置环境变量HF_ENDPOINT=https://hf-mirror.com。如果仓库需要登录权限,记得先执行huggingface-cli login并配置访问令牌。
6.2 CUDA out of memory
显存不足是新手最常遇到的问题。错误信息通常包含:
torch.OutOfMemoryError: CUDA out of memory.解决思路按优先级排列:
- 把生成尺寸改回
512×512。 - 调用
pipe.enable_attention_slicing()。 - 使用
pipe.enable_model_cpu_offload()替代pipe.to("cuda")。 - 使用
torch_dtype=torch.float16降低显存占用。 - 如果还在崩溃,可以尝试减小 batch size,或者换一张显存更大的显卡。
6.3 生成图片全是噪点或马赛克
如果生成结果完全不像目标图像,原因通常是采样步数太少,或者prompt描述过于简单。可以先把num_inference_steps提高到 30 步,并将guidance_scale设置在 7 到 9 之间,再观察结果。模型文件不完整或格式不匹配也会导致生成结果异常,可以通过重新下载模型解决。
6.4 生成黑白图片
使用torch_dtype=torch.float16加载 VAE 时,某些版本的 VAE 可能出现数值溢出,导致解码结果为黑图或灰图。常见修复方式是让 VAE 保持浮点精度:
from diffusers import AutoencoderKL vae = AutoencoderKL.from_pretrained( model_path, subfolder="vae", torch_dtype=torch.float32 ) pipe = StableDiffusionPipeline.from_pretrained( model_path, vae=vae, torch_dtype=torch.float16, safety_checker=None )多数情况下,使用 diffusers 默认的加载方式不会遇到这个问题。如果遇到,再按上述方式单独处理 VAE。
6.5 Seed 相同但复现不了结果
影响生成结果的因素不止 seed,还包括采样器、步数、CFG、分辨率、依赖库版本。只要其中一个变化,即使 seed 相同,结果也可能不同。要固定复现条件,需要固定torch.manual_seed的同时,记录采样器名称、步数和模型版本。
7. 最佳实践与工程建议
7.1 固定依赖版本
diffusers、transformers、torch 都在快速更新,新版本可能会改变 API 行为或默认调度器。在工程项目中,建议在requirements.txt中锁定版本。例如:
torch==2.1.0 diffusers==0.24.0 transformers==4.35.0 accelerate==0.24.1需要说明,以上版本号只是示例,实际应选择与你的运行环境匹配的版本。锁版本最大的价值在于:团队协作、出图复现、自动化回归测试时,结果不会因依赖漂移而改变。
7.2 优先使用 safetensors 格式
网络上下载的.ckpt文件可能是旧格式,加载时存在反序列化风险。.safetensors格式更安全,加载也更快。尽量选择后缀为.safetensors的模型文件,或者在下载时优先选择 safetensors 版本。
7.3 Prompt 工程与负面提示词
好的 prompt 应该包含三个层次:主体描述、环境与风格、画质修饰词。例如:
a young woman in a red coat walking down an old town street, autumn leaves, golden hour lighting, cinematic composition, highly detailed, 8k负面提示词负责排除常见瑕疵:
blurry, low quality, bad anatomy, disfigured, extra fingers, watermark, text, logo建议整理一份团队共享的负面提示词模板,批量出图时统一使用,减少废图数量。
7.4 显存与性能平衡
在显存有限的机器上,建议使用半精度torch_dtype=torch.float16,并开启enable_attention_slicing()。如果显存只有 6GB 左右,可以做以下配置:
pipe.enable_attention_slicing() pipe.enable_model_cpu_offload()在生成高分辨率图片时,优先使用低分辨率生成一次构图,再用图生图或放大模型处理细节。直接 1024×1024 像素起步,在 SD 1.5 上容易出现构图崩坏。
7.5 生成结果元信息记录
批量生产环境下,建议在保存图片时额外记录 prompt、seed、模型版本、采样参数。可以简单把参数写入图片文件名,或者生成一个 JSON 日志:
{ "prompt": "a cute orange cat wearing a wizard hat", "negative_prompt": "blurry, low quality", "seed": 42, "steps": 25, "guidance_scale": 7.5, "model": "stable-diffusion-v1-5", "scheduler": "PNDM" }这对后期做效果回归非常有价值。出图效果不好的时候,可以快速对比是哪一次参数变化导致的。
7.6 安全与合规边界
在生成和传播图片时,要注意模型许可协议与内容合规问题。Stable Diffusion 1.5 有对应的开源许可协议,商用前必须确认是否符合版权要求。不要使用技术手段绕过模型自带的 safety checker,也不要生成违反法律法规或侵害他人权益的内容。在测试环境中可以关闭 safety_checker,但生产环境务必要有内容审核机制。
8. 总结与学习路线
本文从 Stable Diffusion 1.5 的核心组件讲起,完成了环境搭建、模型下载、diffusers 生成图片、批量出图、WebUI 部署和常见问题排查。最关键的是理解四个组件之间的关系:Text Encoder 负责理解文字,UNet 负责逐步去噪,VAE 负责编解码,Scheduler 控制去噪节奏。实际调试时,优先检查采样步数和 CFG 是否合理,再考虑显存优化和模型格式问题。
下一步如果继续深入,可以从这几个方向继续学习:
- LoRA:低成本扩展 Stable Diffusion 1.5 的某种风格或人物特征。
- ControlNet:在生成时附加姿态、深度、线稿等条件控制。
- img2img:借助扩散模型实现图片重绘、局部修改。
- SDXL:升级到分辨率更高、细节更强的下一代模型。
- ComfyUI:通过节点式工作流实现更复杂的生成链路。
对开发者来说,Stable Diffusion 1.5 并不是终点,而是一个极佳的基础模型。把本地部署、批量生成、参数实验这套基础流程走通之后,你会发现它在创意设计、内容生成、游戏素材、电商场景里都能快速落地。最后提醒一句:尽早建立“模型版本固定 + 随机种子记录 + 参数可复现”的工程习惯,这比追求一时的高分 prompt 更有长期价值。