A simple diffusion framework for comprehensive understanding.
Carry out a series training and record the training results.
Compare the result with papers.
we don’t understand what we can’t create.
Notice: This repo is under heavy development.
-
Implement a DDPM and DDIM
-
Training result On Mnist
- that can generate Celeb64Image 20240509
- Scalable Unet to 128 - 256 - 512; refer to task2
for further details please refer to ./UnoncditionalDiffusion/experiments.pptx
and ./UnoncditionalDiffusion/experiments.md
cd UnconditionalDiffusion
python main.py --train --dataset mnist --batch_size=128 --imsize=32
# modify ckpt path in the ~ line 785
python main.py
cd UnconditionalDiffusion
python main.py --train ---batch_size=128 --imsize=32
本项目在不同的任务中会采用不同的设计方式,由任务复杂度和任务需求决定。 不同的抽象(解耦)程度会影响代码可读性,可维护性,可扩展性,以及工程效率。 我们常常需要再这些方面做权衡(trade-off)。
Unconditional Diffusion
用一个main.py
实现了所有功能,这是最简单,可读性最高的方式,但是可维护性可扩展性最差。大部分的Toturial导向的文件采用这种方式。
Latent Diffusion
中,将DataModule
和Trainer
分离,将model
和loss
分离,使得代码更加可读,可维护,可扩展。具体实现上还是基于Unconditional Diffusion.main.py
,如果对这个文件足够了解,那么理解Latent Diffusion
则不会有很大的困难。
在之后的实现中,会继续增加抽象程度,目前在计划中的抽象是:
1. 增加config.yaml
用来取代命令行传参
2. 利用importlib
+omega_conf
来简化类初始化。 参考VideoCrafter的实现。这样的好处会在实现之后详细说明。
在分析了相对大量的工程文件和Toturial之后,注意到了一个被忽略的问题: 对实验结果的聚合和分析
1. 不同实验的代码的自动保存
2. 不同config
下结果的自动化分析
- 改超参数之前最好进行backup 尤其是进程并行的时候
- 依赖于被良好解耦的config
- 然后设置好不同的config ->自动分配显卡资源等等
- vae for compression
- train on mnist
- large scalable ae module
- attention in ae
- config for training
- lpips and discriminator loss
- diffusion on other latent space: text , audio , mesh , etc.
#step 1
python vae.py -b configs/train_vae.yaml
#step 2
#note: please add the path of pretrained vae to config
#and also specify l
python main.py -b configs/train_ldm.yaml
在VAE和UnconditionalDiffusion的代码中,DataModule
和Trainer
类重复度是非常高的。 在开发的过程中,用工程文件的形式可以保证代码的一致性。 但是会增加代码的复杂度。
基于UnconditionalDiffusion/main.py
采用相同的dataset,类似的Trainer设置。但是将scheduler,models(unet,vit),和vae分开。
Trainer里面要增加encode和decode的部分。 扩散的过程中,只是特征空间变了,其他的不变。
VAE的部分follow其他实现,写成first_stage_condition。
- 这个VAE结果还不够好,对于高频特征的重建比较差,需要加LPIPS和Discrimintor。
- config等配置问题还需要更加规范 代码还需要整理
- classifier guidance and classifier-free guidance
- pretrained text model for condition
- different condition type: vanilla , token , cross attention etc.
- multiple condition : zero-conv(controlnet)
classifier guidance simple tutorial
- mnist的数据集可以做分类标签-扩展数据集部分的代码
- text2image的数据集
- [ ]
- replace Unet with a transformer
- [ ]
- insert temporal layer into diffusion
- temporal and spatial attention
Course Level Diffusion Project: sast2023
- provide a latent diffusion base on Pytorch Lightning
- implement core functions yourself
DiffusionFastForward: Train Diffusion from scratch
- provides some training costs record
- some other resources
- thanks timechess (https://github.com/timechess) for adding nix and poetry environment in this project.