本地部署 Stable Diffusion
本地部署 Stable Diffusion(以 SD3.5 Medium 为例)并提供 API 服务:实践与避坑手册
一、环境与硬件准备
- GPU:NVIDIA A10(24 GB)一张即可。
- 驱动/CUDA:驱动 550.x,CUDA 12.x(与你的
torch==2.5.x+cu121/+cu124对齐即可)。 - Python & 依赖:建议新建 venv;核心依赖:
torch,diffusers,transformers,fastapi,uvicorn,safetensors。 - Diffusers 的内存优化:强烈建议启用 CPU Offload(
enable_model_cpu_offload())与low_cpu_mem_usage=True,这是官方推荐的节省显存/内存方式。(知乎专栏)
小贴士:Diffusers 官方“Create a server”文档建议每次请求复制 scheduler(防止线程争用);我们下面的服务端代码就按这个来。(Hugging Face)
二、模型获取:Hugging Face 或 ModelScope(魔搭)
1)Hugging Face下载 SD3
- 某些模型(如 SD3 Medium)是 gated repo,需要你在模型页同意许可/通过授权,否则会 401/403(
GatedRepoError)。解决方法:hf auth login+ 在模型页点击“Request access/Agree to license”。(Hugging Face) - 使用大陆镜像(
HF_ENDPOINT=https://hf-mirror.com)可以提速,但 镜像不会绕过授权,仍需登录并具备访问权。(知乎专栏)
2)转用 ModelScope(魔搭)下载 SD3.5 Medium
实测 AI-ModelScope/stable-diffusion-3.5-medium 可直接下载(无需 HF 授权)。推荐用 SDK:
1 | |
MODELSCOPE_CACHE可自定义缓存位置(官方文档说明)。(ModelScope)
备注:ModelScope 历史上
ignore_file_pattern等过滤参数行为经历过调整;若遇到版本差异导致的参数无效,可先去掉该参数再试。(GitHub)
3)环境配置
使用uv创建一个单独的环境
1 | |
三、服务端:FastAPI + Uvicorn(支持 CPU Offload、禁用 T5)
备注:由于内存紧张,所以使用了一些减负策略,若内存显存足够无需配置CPU Offload、禁用 T5
关键思路
- SD3/3.5 的
StableDiffusion3Pipeline默认包含 3 个文本编码器(CLIP-L、CLIP-G、T5-XXL)。推理时可以禁用 T5-XXL 来显著降低内存占用与首帧时间(Diffusers SD3 文档支持text_encoder_3=None, tokenizer_3=None)。(CSDN) - CPU Offload(
enable_model_cpu_offload)在推理阶段分层把权重搬运到 GPU,可在 24 GB 显存跑 1024×1024。(知乎专栏) - 每次请求复制 scheduler,见官方“Create a server”。(Hugging Face)
- 若出现加载期大量 torch.compile 编译进程(
compile_worker)导致请求卡住/内存高,可禁用编译(TORCH_COMPILE_DISABLE=1或torch.compiler.disable())。(知乎专栏) - 本脚本提供与OpenAI文生图API所兼容的API服务,返回 b64_json
代码:
1 | |
启动:
1 | |
1 | |
相关文档:Diffusers 的 SD3/3.5 管线与用法、禁用 T5、第 3 文本编码器、以及 CPU Offload。(CSDN)
四、调用
1)客户端测试脚本(带鉴权)
保存为:/data/sd/test_b64_client_auth.py
1 | |
运行:
1 | |
2)GPU/进程观测
- 实时看 GPU:
watch -n 1 nvidia-smi或nvidia-smi dmon。(掘金) - 看进程/内存:
ps -eo pid,cmd,%mem,rss --sort=-rss | head。 - 服务器日志加
--log-level debug方便定位。
为什么有时显存几乎为 0?
启动阶段开启了 CPU Offload,权重常驻 CPU,仅在推理时分层搬到 GPU;空闲时显存可能接近 0,推理中会看到波动。(知乎专栏)
五、常见问题与快速修复
1)“401/403 Unauthorized/Forbidden” 下载失败
- 这是 未登录或未获授权 访问 gated 模型(如 SD3 Medium)。
解决:hf auth login登录;去模型页 Request access/Accept license;或改走 ModelScope 的 SD3.5。(Hugging Face)
2)“tokenizer 文件缺失/TypeError: expected str, bytes or os.PathLike”
- CLIP Tokenizer 需要
tokenizer.json,或merges.txt+vocab.json的组合;确认模型目录下 3 套 tokenizer(tokenizer/tokenizer_2/tokenizer_3)存在其一。(Hugging Face)
3)“ImportError: requires the protobuf library / SentencePiece not found”
- Transformers 的部分 tokenizer/模型需要
protobuf、T5 常见 **sentencepiece**。
解决:pip install -U protobuf;必要时pip install sentencepiece。(Hugging Face)
4)“请求卡住、CPU 占用高、出现大量 compile_worker 子进程”
- 可能触发了 PyTorch 编译路径(
torch.compile)。
解决:设置TORCH_COMPILE_DISABLE=1或在代码里torch.compiler.disable()。(知乎专栏)
5)“Killed / dmesg 出现 oom-killer / Memory cgroup out of memory”
- 这是**系统内存(不是显存)**被 cgroup **硬限制**(
memory.max或 v1 的memory.limit_in_bytes)顶到而被 OOM 杀掉;日志里常见 *invoked oom-killer*、*Killed process …*。
解决:减并发/降低分辨率/禁用 T5-XXL/启用 CPU Offload;或提升容器/虚机的 **内存上限**(更大memory.max/开启 swap)。cgroup v2 的memory.max是**硬限制**,超过即触发回收/终止。(Linux内核档案馆)
6)“显存为 0,算力不跑”
- 若 请求还没返回 就一直 0,优先检查是否卡在编译(见 #4),或网络代理/镜像导致拉权重超时;否则检查 vGPU 驱动状态。
- 正常情况下启用 CPU Offload 时空闲显存接近 0属预期,推理中会升高。(知乎专栏)
7)“Diffusers 参数名差异:torch_dtype vs dtype”
- 新版本统一使用
dtype;旧示例中torch_dtype依然可用但会提示已弃用。以SD3/3.5 官方文档为准。(CSDN)
本地部署 Stable Diffusion
http://example.com/2025/10/21/本地部署-Stable-Diffusion/