SDXL代码阅读-概览-1

必要了解

搜索了一圈发现网上对于SDXL的代码讲解很少,因此自己记录一下代码的理解。

在阅读或了解SD、SDXL这之类的生成模型(扩散生成模型)需要基本了解其数学原理,也许不必非常理解或懂得其中的公式推导,但要基本知道最终作者想要表达啥(也就是代码可能会怎么写)。下面是我学习的一些经历,由于我目前也是快速过了一遍大概知识,也是一知半解,所以我会把我觉得有用的论文、参考、学习视频等放在下面。

DDPM论文,经典入门
Score-SDE论文,讲述了生成过程可以看作一个随机微分方程
EDM论文,将生成模型整合到一个框架里
当然还有DDIM、Consistency Model、ODE等,可以等有时间了再详细了解,我认为看完上面三篇论文对目前或者说对SDXL的代码理解基本够了。

对于扩散模型以及SDE的推导非常通俗易懂
虽然up语速非常快,但她是我目前搜到唯一推导EDM论文的大佬,而且推导也很清晰(虽然我还是有看不懂的)
DDPM基本讲解包括简单的代码实现,很详细,入门必看
huggingface自己的扩散模型教程汉化,目前我还没看,但感觉应该不错

SDXL环境安装

SDXL的环境真是一言难尽。。
SDXL的git地址
先正常按照官方的流程来安装环境,至于是用venv还是conda或者docker都可以

然后按照官方的链接下载SDXL-1.0的模型,0.9的模型似乎还要申请权限才能下载,至于别的版本我没有试过。
这样基本的准备工作就已经完成了,后面我们可以参照其tests/inference文件夹下的代码先来测试生成一张图片,然后就会碰到两个巨大的坑:
坑1,源码有点错误
调用sgm/inference/api.py的text_to_image函数时,出现

看了一下,这里是api.py的280行get_guider_config函数初始化guider类的参数的时候会初始化一个dyn_thresh_config的值,但我看了他们的guider.py,没有接收这个参数的类😂,所以报错,这里修改方式有两种,一种是注释掉它初始化的那个的参数:

# "params": {"scale": scale, "dyn_thresh_config": dyn_thresh_config},
"params": {"scale": scale},

第二种是修改58行guider: Guider = Guider.VANILLA改为guider: Guider = Guider.IDENTITY,这样就不会去加载参数来初始化那个不对应的类了。
坑2,clip版本可能有错误
如果出现:RuntimeError: The shape of the 2D attn_mask is torch.Size([77, 77]), but should be (1, 1).
参考https://github.com/TencentARC/MotionCtrl/issues/31,重新安装clip版本即可。
pip install open-clip-torch==2.24.0