高效轻量的Stable Diffusion压缩模 型
BK-SDM是一种压缩版Stable Diffusion模型,通过移除U-Net中的部分模块实现轻量化。该模型采用有限数据进行蒸馏预训练,适用于SD v1和v2各版本,提供基础、小型和微型三种规模。BK-SDM在保持图像质量的同时,显著提高了推理速度,降低了计算资源需求,为高效文本到图像生成提供了新选择。
BK-SDM: 轻量、快速且经济的稳定扩散版本的官方代码库 [ArXiv] [ECCV 2024]。
BK-SDM是轻量级文本到图像(T2I)合成模型:
⚡快速链接:KD预训练 | MS-COCO评估 | DreamBooth微调 | 演示
conda create -n bk-sdm python=3.8 conda activate bk-sdm git clone https://github.com/Nota-NetsPresso/BK-SDM.git cd BK-SDM pip install -r requirements.txt
torch 1.13.1
torch 2.0.1
torch>2.0.0
。使用默认PNDM调度器和50个去噪步骤:
import torch from diffusers import StableDiffusionPipeline pipe = StableDiffusionPipeline.from_pretrained("nota-ai/bk-sdm-small", torch_dtype=torch.float16) pipe = pipe.to("cuda") prompt = "一个装有各种花朵的金色花瓶" image = pipe(prompt).images[0] image.save("example.png")
import torch from diffusers import StableDiffusionPipeline, UNet2DConditionModel pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16) pipe.unet = UNet2DConditionModel.from_pretrained("nota-ai/bk-sdm-small", subfolder="unet", torch_dtype=torch.float16) pipe = pipe.to("cuda") prompt = "一个装有各种花朵的金色花瓶" image = pipe(prompt).images[0] image.save("example.png")
我们的代码基于Diffusers 0.15.0版本的train_text_to_image.py。要访问最新版本,请使用此链接。
bash scripts/get_laion_data.sh preprocessed_11k bash scripts/kd_train_toy.sh
<详细信息> <摘要>注意</摘要>
./data/laion_aes/preprocessed_11k
(tar.gz格式1.7GB; 解压后数据文件夹1.8GB)。8
(=4×2),训练BK-SDM-Base 20次迭代大约需要5分钟,使用22GB的GPU内存。</详细信息>
bash scripts/get_laion_data.sh preprocessed_212k bash scripts/kd_train.sh
<详细信息> <摘要>注意</摘要>
./data/laion_aes/preprocessed_212k
(tar.gz格式18GB; 解压后数据文件夹20GB)。256
(=4×64),训练BK-SDM-Base 50K次迭代大约需要300小时,使用53GB的GPU内存。使用批量大小64
(=4×16),需要60小时,使用28GB的GPU内存。</详细信息>
bash scripts/get_laion_data.sh preprocessed_2256k bash scripts/kd_train_2m.sh
<详细信息> <摘要>注意</摘要>
./data/laion_aes/preprocessed_2256k
(tar.gz格式182GB; 解压后数据文件夹204GB)。kd_train_2m.sh
与kd_train.sh
相同;在相同的迭代次数下,训练计算保持不变。</详细信息>
bash scripts/kd_train_toy_ddp.sh
<详细信息> <摘要>注意</摘要>
</详细信息>
bash scripts/kd_train_v2-base-im512.sh bash scripts/kd_train_v2-im768.sh # 对于推理,请参见:'scripts/generate_with_trained_unet.sh'
<详细信息> <摘要> KD训练的关键部分 </摘要>
</详细信息>
<详细信息> <摘要> 关键学习超参数 </摘要>
--unet_config_name "bk_small" # 选项: ["bk_base", "bk_small", "bk_tiny"] --use_copy_weight_from_teacher # 使用教师权重初始化学生unet --learning_rate 5e-05 --train_batch_size 64 --gradient_accumulation_steps 4 --lambda_sd 1.0 --lambda_kd_output 1.0 --lambda_kd_feat 1.0
</详细信息>
我们使用以下代码获得MS-COCO上的结果。使用PNDM调度器和25步去噪生成512×512图像后,我们将它们下采样到256×256以计算评分。
在单个3090 GPU上,'(2)'每个模型需要约10小时,'(3)'需要几分钟。
(1) 下载 metadata.csv
和 real_im256.npz
:
<details> <summary> 关于 'real_im256.npz' 的说明 </summary> </details>bash scripts/get_mscoco_files.sh # ./data/mscoco_val2014_30k/metadata.csv: MS-COCO验证集中的30K提示(用于'(2)') # ./data/mscoco_val2014_41k_full/real_im256.npz: 41K真实图像的FID统计数据(用于'(3)')
(2) 基于MS-COCO验证集中的30K提示生成512×512图像 → 将它们调整为256×256:
python3 src/generate.py # python3 src/generate.py --model_id nota-ai/bk-sdm-base --save_dir ./results/bk-sdm-base # python3 src/generate.py --model_id nota-ai/bk-sdm-tiny --save_dir ./results/bk-sdm-tiny
[批量生成] 增加 --batch_sz
(默认:1)可以加快推理速度,但会增加显存使用量。感谢 @Godofnothing 提供此功能 :)
设置:BK-SDM-Small 在 MS-COCO 30K 图像生成任务上