明敏 发自 凹非寺 量子位 | 公众号 QbitAI
火爆全球的Stable Diffusion,预训练和微调成本,正式被打下来了!
现在,预训练的速度被提升到6.5倍,成本直降85%;
微调只需RTX 2070/3050即可搞定,硬件成本直降近九成。
这就是国产项目Colossal-AI最新开源的加速方案。
开源地址:https://github.com/hpcaitech/ColossalAI
今年,Stable Diffusion可谓火爆圈内圈外,而且最近凭借免费开源还效果好的特点,进一步出圈,让人看到了AIGC的巨大潜力和前景。
艺术圈和AI圈大神都争相拿它创作,GitHub star数已达33.5k,背后公司估值甚至飙升至10亿美金。
Stable Diffusion由此也成为扩散模型中最火出圈的项目。
BUT,它唯一的缺点是,训练成本真的很高!
仅Stable Diffusion v1 版本的模型单次训练便需要150000个A100 GPU Hour;
微调至少需要RTX 3090/4090这类高端消费级显卡。
其背后公司Stability AI为了维护运营和算力需求,拥有一个由4000块A100组成的GPU集群,光成本就超过5000万美元(折合人民币约3.6亿)。
实际上,由于扩散模型本身原理机制特殊,导致它本身对硬件显存、计算速度的要求都很高,而且使用的数据库也是千亿量级的。
所以想要提升训练速度、降低成本,还真不是件容易事。
那么,Colossal-AI到底是如何实现的?
从显存入手
首先来解释,为什么扩散模型对硬件的要求高。
扩散模型主要包括两个过程:前向扩散和反向生成。
前向扩散是对一张图像逐渐添加高斯噪声,直至变成随机噪声。
反向生成是去噪声过程,将一个随机噪声使用多个U-Net进行逐渐去噪,直至生成一张图像,这也是扩散模型的训练过程。
相比于传统端到端深度学习模型,扩散模型的训练过程显然更为复杂。
其中Stable Diffusion除了扩散模型本身,还包含一个Frozen CLIP Textcoder 来输入文本提示词(text prompts)、一个自动编码器(Autoencoder)将高分辨率图像压缩到潜在空间(Latent Space),并且还要在每个time step计算loss。
这样一来,训练方案对显存开销、计算速度都提出了极大挑战。
针对如上问题,Colossal-AI分别从预训练、微调两个步骤上进行了优化。
预训练阶段,主要做的就是降低显存开销。
一般来说batch size越大,训练速度越快,扩散模型亦是如此。
通过ZeRO、Gemini、Chunk-based内存管理等策略以及Flash Attention模块优化Cross-attention计算,Colossal-AI可以让用户在8GB显存的普通消费级显卡(如RTX 2070/3050)上训练扩散模型。
如果在A100上,则能将单卡Batch Size直接扩大到256。
对比Stable-diffusion-v1 FP32的Distributed Data Parallel (DDP) ,训练可以提速6.5倍。
由此可以大幅缩短训练时长,从而降低高达数百万美元的训练成本。
在微调上,对于大多数AIGC玩家而言,都倾向于选择使用开源的预训练模型权重来进行微调个性化下游任务。
一方面是由于扩散模型本身复杂,另一方面是Stable Diffusion预训练采用的是LAION-5B数据集,包含5850亿个图片文本对,需要240TB储存空间。
但现有的很多开源微调方案中,使用的训练并行方式主要为DDP,这导致训练过程中占用的显存很多。
即使微调也至少需要RTX 3090/4090这类最高端的消费级显卡。
加之,现阶段很多开源的训练框架都没有给出完整的训练配置与脚本,还需要自己来做一些补全和调试工作。
基于现状,Colossal-AI提出了首个同时开源完整训练配置参数和训练脚本的方案。
这种方案一方面可以让用户不再局限于现有的权重推理,更加灵活地训练出针对新下游任务的最新版细分模型,扩大应用范围;
另一方面,由于引入了显存优化等技术,方案支持在普通个人电脑的单张显卡(如GeForce RTX 2070/3050 8GB)上快速完成微调任务。
要知道,RTX 2070现在的价格可比3090/4090便宜了将近9成。
此外,对于速度不敏感的任务,还可以进一步使用Colossal-AI NVMe,即利用低成本的硬盘空间降低显存消耗。
优化秘籍是啥?
所以显存开销是通过哪些技术降下去的?
主要基于三个方面:
- ZeRO Gemini
- Flash Attention
- FP16、acitvation checkpoint等常见优化技术
先来看ZeRO Gemini。
ZeRO是零冗余优化器。
这种方法主要通过切分优化器状态、梯度、模型参数,使GPU仅保存当前计算所需的部分,从而来消除数据并行、模型并行中存在的内存冗余。
和经典的数据并行策略相比,它能极大提高内存使用效率,同时不牺牲计算粒度和通信效率。
与此同时,Colossal-AI还引入了Chunk机制进一步提升ZeRO性能。
将运算顺序上连续的一组参数存入一个Chunk中(Chunk即一段连续的内存空间),每个Chunk的大小相同。
Chunk方式组织内存可以保证PCI-e和GPU-GPU之间网络带宽的高效利用,减小了通信次数,同时避免潜在的内存碎片。
△Chunk机制
Gemini是Colossal-AI的异构内存空间管理器。
它支持将优化器从GPU卸载到CPU,以节省GPU内存占用。
打破GPU内存墙的限制,可以实现同时利用GPU内存和CPU内存(由 CPU DRAM 或 NVMe SSD内存组成),从而进一步扩展可训练模型规模。
△通过ZeRO Gemini提升硬件的模型容量
第二方面是Flash Attention机制。
LDM(Latent Diffusion Models)是改善扩散模型效率的一种方法,它通过在模型框架中引入交叉注意力机制(Cross-Attention)来实现多模态训练,使得扩散模型可以更灵活地实现对class-condition, text-to-image, layout-to-image的支持。
但是Cross-Attention层对比原始扩散模型的CNN层增加了额外的计算开销,极大增加了训练成本。
相比之下,Flash Attention是针对长序列Attention的加速版本。
它使用Flatten来减少GPU高带宽内存(HBM)之间的内存读/写次数,Flash Attention同时针对块状稀疏的Attention,设计了一个近似的注意力算法,比现有任何attention方法都要快。
它能将Attention的速度提升104%,将端到端训练的峰值显存减少23%。
△ Flash Attention
除了以上两方面,Colossal-AI还集成了FP16、activation checkpoint等常见优化技术。
例如,activate checkpoint通过用计算换取内存来工作。
它避免存储整个计算图的所有中间激活用于反向计算,在检查点部分不保存中间激活,而是在反向传递中重新计算它们,进一步降低了显存。
而FP16在基本不影响精度前提下,将原本的32位浮点数运算转为16位,降低显存使用,提升计算效率。
上手也超简单
到了实操环节,Colossal-AI只需少量代码,即可快捷启动扩散模型训练。
不同于常见PyTorch开源项目,Stable Diffusion是基于PyTorch Lighting搭建的。
PyTorch Lightning为流行的深度学习框架PyTorch提供了简洁易用、灵活高效的高级接口,为广大AI研究人员提供了简洁易用的高层次抽象,从而使深度学习实验更易于阅读和再现,
受PyTorch Lightning的邀请,Colossal-AI已集成作为PyTorch Lightning的官方大模型解决方案。
以Stable Diffusion为例,启动代码如下:
代码语言:javascript复制from colossalai.nn.optimizer import HybridAdam
from lightning.pytorch import trainer
class MyDiffuser(LightningModule):
...
def configure_sharded_model(self) -> None:
# create your model here
self.model = construct_diffuser_model(...)
...
def configure_optimizers(self):
# use the specified optimizer
optimizer = HybridAdam(self.model.parameters(), self.lr)
...
model = MyDiffuser()
trainer = Trainer(accelerator="gpu", devices=1, precision=16, strategy="colossalai")
trainer.fit(model)
除此之外,Colossal-AI和PyTorch Lightning也对OPT、HuggingFace等热门模型和社区提供了良好支持及优化。
低成本微调
在微调方面,Colossal-AI提供了基于HuggingFace上开源的Stable Diffusion模型权重进行微调的功能。
用户只需简单修改Dataloader载入自己的微调数据集并读取预训练权重,再修改参数配置yaml文件并运行训练脚本,便可在个人电脑微调属于自己的个性化模型。
代码语言:javascript复制model:
target: ldm.models.diffusion.ddpm.LatentDiffusion
params:
your_sub_module_config:
target: your.model.import.path
params:
from_pretrained: 'your_file_path/unet/diffusion_pytorch_model.bin'
...
lightning:
trainer:
strategy:
target: pytorch_lightning.strategies.ColossalAIStrategy
params:
...
python main.py --logdir /your_log_dir -t -b config/train_colossalai.yaml
快速推理
Colossal-AI同时支持原生Stable Diffusion推理管道。
在完成训练或精调后,只需直接调用diffuser库并加载自己保存的模型参数,即可直接进行推理,无需进行其他改动。
这样可以方便新用户熟悉推理流程,并让习惯使用原版框架的用户快速上手。
代码语言:javascript复制from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained(
"your_ColoDiffusion_checkpoint_path"
).to("cuda")
image = pipe('your prompt', num_inference_steps=50)["sample"][0]
image.save('file path')
△上述推理流程生成的作品
One More Thing
实际上,如上提到的Colossal-AI不只能用来加速训练扩散模型,它面向各种大模型。
通过多维自动并行、异构内存管理、大规模优化库、自适应任务调度等方法,Colossal-AI可以高效快速部署AI大模型训练和推理,降低应用成本。
自开源以来,Colossal-AI多次在GitHub及Paper With Code热榜上位列世界第一。
经国际专家的严格评审,Colossal-AI已成功入选为SC、AAAI、PPoPP等国际AI与HPC顶级会议的官方教程。
目前,其相关解决方案已经成功在自动驾驶、云计算、零售、医药、芯片等行业知名厂商落地应用。
例如针对生物医药行业的蛋白质结构预测模型AlphaFold,基于Colossal-AI的优化方案,FastFold成功将单张GPU可推理氨基酸序列长度扩增到一万,覆盖99.9999%的蛋白质。
只用笔记本上的消费级显卡就能解析90%蛋白质。
而且还能对训练、推理进行全流程并行加速,目前已助力多家新型药物研发企业缩短开发流程,降低开发成本。
传送门
开源地址: https://github.com/hpcaitech/ColossalAI
参考链接: [1]https://medium.com/@yangyou_berkeley/diffusion-pretraining-and-hardware-fine-tuning-can-be-almost-7x-cheaper-85e970fe207b [2]https://github.com/CompVis/stable-diffusion [3]https://arxiv.org/abs/2205.14135 [4]https://arxiv.org/abs/2112.10752 [5]https://openai.com/blog/triton/
— 完 —