本地部署 Stable Diffusion:6GB 显存 5 分钟跑通 768 出图
【免费下载链接】stablediffusionHigh-Resolution Image Synthesis with Latent Diffusion Models项目地址: https://gitcode.com/GitHub_Trending/st/stablediffusion
手里有一张山脉草图,想变成奇幻风插画,云端工具要排队,本地又不知道从哪下手。Stable Diffusion 是一套可以本地运行的文本生成图像扩散模型,这个仓库里还带着风格转换(img2img)、深度控制、图像修复、4 倍放大这些配套脚本。下面所有命令都以仓库里的真实脚本为准,环境装完 5 分钟能出第一张图。
项目速览:值不值得试
| 项目 | 内容 |
|---|---|
| 项目定位 | Stable Diffusion v2 官方代码:潜在扩散文生图模型 + 全套推理脚本 |
| 核心能力 | 文生图、img2img、深度控制、修复、x4 放大、unCLIP 变体 |
| 最低硬件 | 6GB 显存以上的 GPU;纯 CPU 也能跑(IPEX 优化路径) |
| 上手难度 | 中等:conda 装环境后一条命令出图,权重需手动下载 |
| 许可证 | 代码 MIT;权重 CreativeML Open RAIL++-M |
| 社区活跃度 | StabilityAI 官方维护,模型从 2.0 持续更新到 2.1、unCLIP 2.1 |
6GB 显存为什么跑得动:潜在扩散三句话
768×768 的图为什么敢在 6GB 显存上生成?因为模型去噪的对象不是像素,而是一张压缩过的小图。
三个机制,各一句原理加一句原因:
- 自动编码器先压缩:图像被 8 倍下采样成 64×64×4 的潜在表示,去噪时只处理 4096 个位置而不是 589824 个像素,计算量降一个量级以上——这是显存需求能压到 6GB 的根本原因。实现见 autoencoder.py。
- 文本靠交叉注意力控制方向:提示词嵌入注入 UNet 的每一层注意力,让每一步去噪都被提示词"拽着走"——这就是改一个词画面就变的原因。
- 采样器压缩步数:DDIM 默认 50 步收敛,加
--plms或--dpm还能用更少步数,不需要上千步迭代。采样器见 ddim.py。
⚡️ 5 分钟从零跑通
git clone https://gitcode.com/GitHub_Trending/st/stablediffusion cd stablediffusion conda env create -f environment.yaml conda activate ldm pip install -r requirements.txtenvironment.yaml 固定了 python 3.8.5 / pytorch 1.12.1 / cudatoolkit 11.3;如果已有 latent-diffusion 环境,只需补装 transformers、diffusers、invisible-watermark 再执行pip install -e .。
权重不在仓库里:去 Hugging Face 的 StabilityAI 组织下载 768 模型(v2-1_768-ema-pruned.ckpt),放到checkpoints/下,然后一条命令出图:
python scripts/txt2img.py \ --prompt "a professional photograph of an astronaut riding a horse" \ --ckpt checkpoints/v2-1_768-ema-pruned.ckpt \ --config configs/stable-diffusion/v2-inference-v.yaml \ --H 768 --W 768图片和拼图网格保存在outputs/txt2img-samples/,输出自带隐形水印(验证方式见 test_watermark.py)。
不同硬件的差异:
| 硬件 | 额外步骤 | 配置 |
|---|---|---|
| NVIDIA GPU(CUDA 11.3+) | 装 xformers 提速(推荐) | 默认配置即可 |
| Intel CPU | 安装 jemalloc、intel-openmp、IPEX | intel/v2-inference-v-fp32.yaml+--device cpu --torchscript --ipex |
| 其他 CPU | --device cpu,预期分钟级出图 | fp32 配置 |
🔧 四个高频场景:从自己的图到成品图
场景一:文本生图——出壁纸和素材
什么时候用:只有想法、没有参考图。
python scripts/txt2img.py \ --prompt "a professional photograph of an astronaut riding a horse, cinematic lighting" \ --ckpt checkpoints/v2-1_768-ema-pruned.ckpt \ --config configs/stable-diffusion/v2-inference-v.yaml \ --H 768 --W 768 --n_samples 4 --seed 42| 参数 | 取值范围 | 效果 |
|---|---|---|
--scale | 1–20,默认 9 | 越大越贴提示词,过大颜色过饱和;v 模型可以设得更高 |
--steps | 20–50,默认 50 | 步数越少越快,质量略降 |
--n_samples | 1–4,默认 3 | 一次出几张,直接影响显存 |
预期与偏差:一次得到 4 张候选;手的数量、文字细节不稳定,换--seed重掷即可。
场景二:风格转换——草图变插画(img2img)
什么时候用:已有草稿,想保留构图只换风格。
python scripts/img2img.py \ --prompt "A fantasy landscape, trending on artstation" \ --init-img assets/stable-samples/img2img/sketch-mountains-input.jpg \ --strength 0.8 \ --ckpt checkpoints/v2-1_768-ema-pruned.ckpt| 参数 | 取值范围 | 效果 |
|---|---|---|
--strength | 0.1–1.0,默认 0.8 | 0.2 轻微润色;0.5 结构与新风平衡;0.8 大改;1.0 完全丢弃原图像素 |
--ddim_steps | 20–50,默认 50 | 含义同上 |
注意:输入图会被自动截成 64 的整数倍,比例保持。结果"和原图差太多"就把 strength 降到 0.5;"改动不够"再提到 0.9。
场景三:深度控制——布局不变,其余全换
什么时候用:想保留房间布局、人物姿态,只换风格或场景。流程是 MiDaS 先给图估出单目深度,扩散模型拿"文本 + 深度"共同做条件,代码见 depth2img.py。
前置:下载 depth 模型权重和dpt_hybrid-midas-501f0c75.pt(放入midas_models/目录),然后启动界面:
python scripts/gradio/depth2img.py configs/stable-diffusion/v2-midas-inference.yaml <path-to-ckpt>| 参数 | 取值范围 | 效果 |
|---|---|---|
| strength | 0–1 | 1.0 = 丢弃全部像素信息,只靠文本 + 深度;值越低保留原图越多 |
偏差:深度是单目估计,远景细结构(树枝、栅栏缝隙)边缘可能扭曲;该模型对写实风格效果最好。
场景四:修复与放大——补一处、放 4 倍
什么时候用:照片里删掉一个人,或把低清 AI 图放大。
python scripts/gradio/inpainting.py configs/stable-diffusion/v2-inpainting-inference.yaml <inpainting-ckpt> python scripts/gradio/superresolution.py configs/stable-diffusion/x4-upscaling.yaml <x4-ckpt>| 参数 | 取值范围 | 效果 |
|---|---|---|
| inpainting 笔刷 + 提示词 | — | 涂出要改的区域,提示词描述该处内容,未涂区域基本不动 |
upscalingnoise_level | 0–100+ | 真实照片调低;对 AI 生成的图官方建议设 100 增加细节 |
偏差:x4 放大是文本引导的——换提示词会得到不同材质,比如"fur"会让毛发更细腻。
一张图出三个版本:unCLIP 变体
什么时候用:构图满意,要几个变体挑。Stable unCLIP 接收 CLIP 图像嵌入,用noise_level控制改动幅度,文档见 UNCLIP.MD。先下载sd21-unclip-l.ckpt或sd21-unclip-h.ckpt放进checkpoints/:
streamlit run scripts/streamlit/stableunclip.py| 参数 | 取值范围 | 效果 |
|---|---|---|
noise_level | 0–1000 | 0 = 几乎不变;中等值保留主体、改动周围;1000 = 接近重画 |
显存怎么算:各档位推荐参数
| 档位 | 推荐配置 | 预期体验 |
|---|---|---|
| 6GB | 512×512 base 模型、DDIM 50 步、n_samples=1、装 xformers | 768 分辨率会 OOM,先锁 512 |
| 12GB | 768×768 v 模型、单张、默认 autocast | n_samples可提到 2 |
| 24GB | 768×768、n_samples=4,或--from-file批量提示词 | 批量生成无压力 |
| 纯 CPU | IPEX + TorchScript,CPU 支持 bfloat16 就加--bf16 | 分钟级出图,适合验证和小批量 |
真正有用的调优手段只有三个:
- xformers:内存高效注意力,速度和显存的第一优先级
--plms/--dpm:换更快的采样器,先试 20–30 步--n_samples:显存最大杠杆,OOM 时先砍它
边界与避坑:做不到什么、怎么绕
- 中文提示词效果明显弱于英文——文本编码器是 OpenCLIP ViT-H/14,以英文为主。替代:提示词先翻译成英文再生成。
- 生成可读文字——图里的字基本都会糊。替代:生成时留白,后期在图像软件里排版加字。
- 多主体空间关系——"红方块在蓝球上方"这类指令经常错位。替代:逐个主体生成再合成,或用深度控制锁住布局。
- ⚠️768×768 + 多张会 OOM——6GB 卡在 768 分辨率下
n_samples≥2是最常见的爆点。替代:换 512 base 模型、n_samples=1、或装 xformers。 - ⚠️v2.1 模型 + fp16 可能数值不稳定——README 明确提示 vanilla attention 下 fp16 会出问题。用 xformers 时以
ATTN_PRECISION=fp16启动脚本。 - 偏见与内容风险——权重是研究产物,官方声明不建议直接用于生产服务。替代:对外发布前加内容过滤和人工审核层。
📦 三条进阶路径
- 图像变体(Stable unCLIP)——适合想把一张图做出多个版本的人 →
streamlit run scripts/streamlit/stableunclip.py,用noise_level控制改动幅度 - Karlo 文本先验——适合想直接以 768 分辨率做文生图的人 → Karlo 权重下载到
checkpoints/karlo_models/,界面里选use_karlo,见 UNCLIP.MD - CPU 生产级加速——适合没有 GPU 的服务器部署 → 换
configs/stable-diffusion/intel/配置,加--torchscript --ipex,支持 bf16 的 CPU 再加--bf16
一套权重覆盖文本、图像、深度、修复、放大五个场景。先跑通文本生图,再回来调 strength 和 noise_level。
【免费下载链接】stablediffusionHigh-Resolution Image Synthesis with Latent Diffusion Models项目地址: https://gitcode.com/GitHub_Trending/st/stablediffusion
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考