实验目的
使用diffuser库生成图像的文章是很多的,使用方法也并不复杂,安装库后调用现成的模型和接口即可,但是因为网络原因,模型下载总会遇到问题,对于使用服务器的研究者来说,挂梯子并不可行,而且现有的文章对这部分也语焉不详。故本文旨在记录一个更详细、完整、对新手友好的生图过程。
基本认识
扩散生成技术
扩散原本是热力学的概念,指分子无规则热运动而形成的物质传递现象,DDPM论文开天辟地地将扩散用于生成技术提高到了实际应用层面,该算法分为前向扩散和逆向生成两个过程:
其前向扩散过程是向图像不断添加高斯噪声,直到原图完全变成噪声图像,将该过程序列与文本提示词一起输入网络进行训练。
逆向生成过程则是由训练好的网络根据噪声和提示词逐步猜测恢复出原图像的过程。
训练与生成算法的数学表示和生成过程如下图:
diffuser库
首先我们要了解一个开源生成模型——Stable Diffusion,该模型可以说是DDPM技术推动的产物,正如蒸汽机和蒸汽火车、发电机和电灯。该模型完全遵循 DDPM 的前向扩散 + 逆向生成框架,但通过潜在空间优化了计算效率。并且在 DDPM 的基础上引入 LDM、文本引导等技术,使其成为更实用、更强大的生成工具。
而diffuser库则是一个通用的扩散模型工具包,支持多种预训练扩散模型(如 Stable Diffusion、DALL-E、Imagen 等),并提供统一的 API 接口。
总的来说,diffuser
库是封装了扩散生成模型,给开发者提供统一接口的生成模型库,相关详细介绍可到镜像网站的文档查看。
该库的大概结构为管道pipe
、噪声调度器Scheduler
、预训练模型model
,示例语句如下:
pipeline = DiffusionPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", use_safetensors=True)
该代码定义DiffusionPipeline
管道,使用预训练模型stable-diffusion-v1-5
进行生成,该过程完全自动,执行时找不到模型会自动下载,但因为我们的特殊网络问题,模型下载是使用diffuser
的主要门槛。
随后传递文本即可获取去噪后的图像image = pipeline("An image of a squirrel in Picasso style").images[0]
。
管道可以认为是一整套标准化配置,管道包含噪声调度器scheduler
缺省为PNDM
,网络结构unet
,该配置不能满足需要时也可以自定义配置,比如切换噪声调度器,可能产生不同的速度与权衡质量,例如,要将默认的PNDMScheduler
替换为 EulerDiscreteScheduler
切换方法为:
pipeline.scheduler = EulerDiscreteScheduler.
from_config(pipeline.scheduler.config)
调度器是用于生成更少噪声图像的模块,调度器无可训练的参数,只有几个关键的超参数,不同的调度器也没有绝对优劣,通常是在不同场景下对速度和质量的平衡,详细比较和使用见官方文档调度器部分。
模型下载
按照官方示例直接跑会报一大串错误:
原因是服务器连接不上,而且模型很大,最好我们手动下载模型,相关文章对这部分只是一句带过:模型很大不太好下
或者用git 手动下载一下
,本文主要对该过程进行补充。
更详细的方法及比较可见快速下载Hugging Face模型,本文参考实现了简单可用的两种方法。
git下载
git
是分布式版本控制系统,可以理解为一个仓库存储了软件不同版本,方便恢复和拉取,在克隆过程中会将仓库的整个历史记录传输到客户端,具体操作可见git菜鸟教程。
Git LFS(Large File Storage)是一个用于Git版本控制系统的扩展,它专门用来管理大型文件,如图像、音频和视频文件。它通过延迟地(lazily)下载大文件的相关版本来减少大文件在仓库中的影响,具体来说,大文件是在checkout
的过程中下载的,而不是 clone
或 fetch
过程中下载的(这意味着你在后台定时 fetch
远端仓库内容到本地时,并不会下载大文件内容,而是在你 checkout
到工作区的时候才会真正去下载大文件的内容)。
对目前来说简单将其理解为git
管理大文件的扩展即可。
安装git
和lfs
的命令及解释如下:
sudo apt-get install git # 安装git
git --version # 查看git版本
mkdir git # 创建文件夹,名称任意
cd git # 进入文件夹
git init # 初始化文件夹为git仓库
git lfs install # 查看lfs是否安装成功
有如下输出说明安装成功
Updated git hooks.
Git LFS initialized.
首先进入Hugging Face官网,推荐使用国内镜像网站,点击model选项卡可见各种模型:
搜索后可见该模型的详细界面,点击红框的三个点,和Clone
即可获得git
命令,然后进入到我们先前初始化的git
仓库即可拉取下载:
但是由于git
的机制,拉取仓库时会拉取所有版本的内容,对网络和磁盘要求很高,详细教程也更推荐下面的方式。
镜像网站工具下载
镜像网站基于aria2
开发了huggingface的专用下载工具,支持多现成下载,不断连,使用方法如下:
wget https://hf-mirror.com/hfd/hfd.sh # 下载hfd
chmod a+x hfd.sh # 授予权限
export HF_ENDPOINT=https://hf-mirror.com # 设置环境变量
./hfd.sh 模型名 # 下载模型
启动下载后如下图所示:
下载完成后可以看到整个模型文件,还是比较大的,有二十多个G:
补充:需授权的模型下载
这步科学上网是免不了的,比如要下载目前最新的stable-diffusion-3.5
,通过镜像网站可以看到该模型下载是需要token
的:
该过程比较简单,镜像站中有教程,只要去huggingface
网站注册账号后生成即可:
然后使用详细方法中的命令./fhd.sh 模型名 --hf_username 用户名 --hf_token Token
即可下载,但直接使用该命令下载会报一串拒绝连接的错:
这步我怀疑是不是获取的token
无效,最后使用终端输入huggingface-cli login
登陆huggingface
账号验证发现token
是有效的:
最后记不清在哪看了个印象,需登陆的模型可能需要验证,到官网看了一下模型,确实需要申请:
填完申请以后再重新下载即可。
生成库的使用
前面下载好的模型放到项目目录下,生成的示例代码如下:
import torch
from diffusers import StableDiffusionPipeline
import time
# 定义管道和预训练模型,未下载的会自动下载, GPU RAM 少于 10GB,
# 加载 StableDiffusionPipeline 时使用 float16 精度,而不是的默认 float32 精度。
model_id = "CompVis/stable-diffusion-v1-4"
# 本地模型路径
model_path="./stable-diffusion-v1-4"
start = time.time()
print("正在加载模型...")
pipe = StableDiffusionPipeline.from_pretrained(model_path,
revision="fp16", torch_dtype=torch.float16)
# 提示词
prompt = "a photograph of an astronaut riding a horse"
# 使用GPU
pipe.to("cuda")
print("正在生成图像...")
image = pipe(prompt).images[0]
end=time.time()
print("消耗时间为:",end-start)
# 保存图像
image.save(f"astronaut_rides_horse.png")
其他详细原理和操作可见官方文档,包括使用自训练模型,更改推理过程等,都可以通过继承不同的模块实现。
对应输出和生成的图像如下:
面部细节有些失真,马蹄也有点不统一,但是整体效果还可以。
总结
本文记录了diffuser
库使用CompVis/stable-diffusion-v1-4
模型生成图像的详细过程:
包括库和扩散生成的基本认识;
CompVis/stable-diffusion-v1-4
模型下载;
diffuser
库的使用和生成图像的示例代码。
这是手动生成图像的第一步,但也是关键一步,后续可以根据继承该模型的不同模块,调整参数和生成手段,达到自己想要的效果。
补充:
另外记录了如何使用镜像网站下载需验证模型的方法,官网登陆注册获取token
以外,还需到模型页面看看是否需要单独填申请,这不说谁能知道,不得不承认这WALL提供了保护的同时对科学研究也确实造成了很大的不方便。