挖了一下ControlNet的代码,发现了他写了一个ddim_hacked.py和hack.py,对比发现ddim_hacked.py和ddim.py相比,只是把classifier-free guidance sampling中的unconditional和conditional的部分分开做了两次,而不是concat在一起过一次模型,然后chunk开了,刚开始没想明白这么做的意义,后来看到hack.py文件,明白了都是为了省显存。
hack.py中用的了
https://github.com/basujindal/stable-diffusion/blob/main/optimizedSD/splitAttention.py
这个中提到的技巧,在diffusion中的attention模块进行改进,然后作者借助这个思路自己写了一个clip的计算,大概看了一下optimizedSD中还有一些其他的技巧,比如把sd分块之类的,这里暂时用不到,就按需学习了,记下来以后需要再看。
Update:
把sd分块的技巧也在ControlNet中发现了,在low_vram_shift这里,实现比想象的简单好多。。。