10分钟上手diffusers-rs:Rust实现Stable Diffusion 1.5/2.1文生图的完整教程
【免费下载链接】diffusers-rsAn implementation of the diffusers api in Rust项目地址: https://gitcode.com/gh_mirrors/di/diffusers-rs
diffusers-rs 是一个用Rust语言实现的 Stable Diffusion 文生图项目,完整复刻了 Hugging Face 著名 diffusers 库的核心 API,基于 tch(Rust 版 Torch)构建,支持 Stable Diffusionv1.5 和 v2.1两个版本。它不仅能做文本生成图像(text2img),还内置了图生图(img2img)、局部重绘(inpainting)和 ControlNet四条主流 AI 绘图管线。想脱离 Python 环境、用 Rust 做文生图?这篇文章带你 10 分钟跑通全流程 🚀
📦 diffusers-rs 能做什么?
简单说,diffusers-rs 就是"Rust 版的 diffusers"。它把 Stable Diffusion 的三大核心组件都用 Rust 重新实现了一遍:
| 模块 | 作用 |
|---|---|
| CLIP 文本编码器 | 把你的提示词(prompt)转成语义向量 |
| UNet 去噪网络 | 扩散模型的主力,负责一步步"雕刻"出图像 |
| VAE 变分自编码器 | 在潜在空间与像素空间之间互相转换 |
此外还内置了 DDIM、DDPM、Euler、Heun 等10 种采样调度器,供你自行切换速度与画质的平衡。
下图就是用它生成的文生图效果,提示词是 "A rusty robot holding a fire torch."(一个手持火把的生锈机器人):
✅ 环境准备:开始前检查清单
开始之前,请确认你的机器满足以下条件:
- Rust 工具链:安装最新 stable 版本的 Rust(
rustup) - Python 3:仅用于下载和转换模型权重(需要
torch库) - 显卡:NVIDIA GPU,显存8GB 以上(没有 GPU 也能用 CPU 跑,只是慢一些)
- 磁盘:预留约 10GB 空间存放权重文件
📥 第一步:获取 diffusers-rs 项目源码
打开终端,执行以下命令克隆项目并进入目录:
git clone https://gitcode.com/gh_mirrors/di/diffusers-rs cd diffusers-rs项目结构非常清晰,核心代码都在src/下:models/是 UNet 和 VAE 等模型实现,pipelines/是 Stable Diffusion 主管线,schedulers/是各种采样调度器,transformers/是 CLIP 文本编码器。四个可运行的示例程序位于examples/目录,稍后我们会用到。
⬇️ 第二步:下载 Stable Diffusion 模型权重
权重文件需要放到项目根目录的data/文件夹中。项目提供了现成的 Python 脚本,一条命令搞定(下载 + 格式转换自动完成):
# 默认下载 Stable Diffusion 2.1 权重 python3 ./scripts/get_weights.py # 如需下载 1.5 版本权重,加上版本号参数 python3 ./scripts/get_weights.py --sd_version 1.5该脚本(scripts/get_weights.py)会自动下载 CLIP 编码器、UNet、VAE 以及 BPE 词表,并转换为 Rust 可直接加载的.safetensors格式。下载完成后,data/目录里会有 4 个文件,例如 2.1 版本对应的是clip_v2.1.safetensors、unet_v2.1.safetensors、vae_v2.1.safetensors和bpe_simple_vocab_16e6.txt。
🎨 第三步:10分钟跑出第一张 AI 图
这是最激动人心的时刻——执行下面这条命令:
cargo run --example stable-diffusion --features clap -- --prompt "A rusty robot holding a fire torch."首次运行会自动编译依赖(torch-sys 会下载 libtorch,稍需耐心等待)。运行过程中会逐步打印去噪进度:
Timestep 0/30 Timestep 1/30 ... Generating the final image for sample 1/1.默认使用DDIM 调度器、30 步去噪、guidance scale 7.5,最终图像保存为sd_final.png。除了机器人,换个提示词你也能得到完全不同的画面,比如另一只手持火把的复古机器人:
🔧 常用参数速查表
stable-diffusion示例通过命令行参数控制生成过程,常用参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
--prompt | 沙滩上的生锈机器人 | 提示词,英文效果最佳 |
--seed | 32 | 随机种子,固定后可复现结果 |
--n-steps | 30 | 去噪步数,越大越精细越慢 |
--sd-version | v2-1 | 可选v1-5/v2-1 |
--num-samples | 1 | 一次生成多张图 |
--width/--height | 512 / 512 | 输出图像尺寸 |
--cpu | 无 | 指定模块(如unet、vae)跑在 CPU 上 |
--final-image | sd_final.png | 输出文件名 |
🖼️ 图生图(img2img):让 AI 重绘你的画面
除了纯文生图,diffusers-rs 还支持图像到图像的转换:以一张图作为构图参考,用提示词引导重新生成。示例程序是stable-diffusion-img2img:
cargo run --example stable-diffusion-img2img --features clap -- --input-image media/in_img2img.jpg下面对比一下:左边是手绘风格的输入图,右边是 AI 重绘后的结果——构图保留,风格被提示词(默认是 "A fantasy landscape, trending on artstation.")彻底重塑:
🪄 局部重绘(Inpainting):只改图中一部分
想只替换画面中的某个区域而保持其他部分不变?这就是inpainting的强项。使用它需要额外下载一个专门的unet-inpaint.safetensors权重文件放入data/目录,然后:
cargo run --example stable-diffusion-inpaint --features clap \ --input-image sd_input.png --mask-image sd_mask.png其中--input-image是原图,--mask-image是白色遮罩图(白色区域将被重绘)。默认提示词是 "Face of a yellow cat, high resolution, sitting on a park bench.",最终效果如下图——掩膜区域被精准替换成了一只坐在长椅上的橘猫,背景完整保留:
🎯 ControlNet:用边缘线条精确控制生成
diffusers-rs 还集成了ControlNet管线,这是目前最主流的"可控生成"方案之一。它以一张参考图(默认自动做 Canny 边缘检测)作为骨架,生成符合指定构图的图像。需要先下载 SD 1.5 权重和 ControlNet canny 权重(保存为data/controlnet.safetensors),然后:
cargo run --example controlnet --features clap,image,imageproc -- \ --prompt "a rusty robot, lit by a fire torch, hd, very detailed" \ --input-image media/vermeer.jpg以名画《戴珍珠耳环的少女》为输入,AI 先提取出她的边缘轮廓,再据此生成一个"机器人少女"——构图、发带姿态与原作几乎一一对应,这正是 ControlNet 的精髓所在:
❓ 常见问题 FAQ
Q:显存不足 / 报错 CUDA out of memory 怎么办?
Stable Diffusion 完整模型通常需要 8GB 以上显存。两个解决方案:
纯 CPU 模式(慢但能跑):加上
--cpu all参数cargo run --example stable-diffusion --features clap -- --prompt "A very rusty robot holding a fire torch." --cpu all混合模式(8GB 显卡):只把 UNet 放在 GPU 上,CLIP 和 VAE 放 CPU,并可配合 fp16 精度的 UNet 权重进一步省显存:
PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6,max_split_size_mb:128 \ cargo run --example stable-diffusion --features clap -- \ --cpu vae --cpu clip --unet-weights data/unet-fp16.safetensors
Q:1.5 和 2.1 版本怎么选?
两者命令完全相同,只需通过--sd-version v1-5或--sd-version v2-1切换,并保证data/里有对应版本的权重。2.1 版默认开启,画面色彩通常更浓烈;1.5 版生态更成熟,ControlNet 权重也只适配 1.5。
Q:生成的图和 Python 版 diffusers 一样吗?
diffusers-rs 是 Hugging Face diffusers 的 Rust 移植版,相同的提示词、种子和调度器下,两者输出高度一致。Rust 的优势在于零 GC 的内存管理和更好的并发性能,很适合把 AI 绘图能力嵌入 Rust 服务或桌面应用。
📚 总结:从 0 到 AI 绘图只需 10 分钟
回顾一下我们走完的路径:克隆项目 → 下载权重 → 一条命令出图。diffusers-rs 用纯 Rust 实现了 Stable Diffusion 文生图的完整能力栈,包括:
- ✅ 文本生成图像(SD 1.5 / 2.1)
- ✅ 图生图 img2img
- ✅ 局部重绘 inpainting
- ✅ ControlNet 可控生成
- ✅ GPU / CPU 灵活调度
如果你正计划在 Rust 技术栈中集成 AI 绘图能力,或者单纯好奇"不用 Python 能不能跑 Stable Diffusion",diffusers-rs 都是一个值得 Star 的优质参考实现。快去试试吧,你的第一张 AI 图已经在 10 分钟之后了 🎉
【免费下载链接】diffusers-rsAn implementation of the diffusers api in Rust项目地址: https://gitcode.com/gh_mirrors/di/diffusers-rs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考