AI绘画专栏之 SDXL 4G显存就能跑SDXL ?SD1.7或将对F8优化merge(46)

2023-11-26 09:30:12 浏览数 (2)

关于SDXL的生态目前还未完全稳定,但是不得不提到的就是SDXL的在VAE,CLIP,UNET三大组件的巨大提升,其101亿的参数量是原本SD的N倍,那么对于SDXL的生态介绍我们再次重复一遍。4G的显存都能跑SDXL意味着将来大模型Lora将降低其大小,炼丹炉压力更小~

SDXL为什么强?

0.1参数训练量为101亿 其中BASE模型35 亿 加REFINER模型66亿  SD的8倍???

0.2对Stable Diffusion原先的U-Net(XL Base U-Net 一共14个模块),VAE,CLIP Text Encoder三大件都做了改进。可以明显减少显存占用和计算量

0.3增加一个单独的基于Latent(潜在)的Refiner(炼制)模型,来提升图像的精细化程度。【新增:对Base模型生成的图像Latent特征进行精细化,其本质上是在做图生图的工作。】

0.4设计了很多训练Tricks(技巧)(这些Tricks都有很好的通用性和迁移性,能普惠其他的生成式模型),包括图像尺寸条件化策略,图像裁剪参数条件化以及多尺度训练等。

0.5先发布Stable Diffusion XL 0.9测试版本,基于用户使用体验和生成图片的情况,针对性增加数据集和使用RLHF技术优化迭代推出Stable Diffusion XL 1.0正式版。

0.6采样方法禁用DDIM (保留意见、非绝对),不需要开启CN,随着CN的支持,可以开启CN的XL版本。所有的环境需要都是XL的生态

0.7直接出1024分辨率图片   1024 * 1024  起步

    随之而来的就是对大显存的占用,但随着新的PR的提出,或将在4G的测试显存,并在一定的内存占用上解决!!!

代码语言:javascript复制
A big improvement for dtype casting system with fp8 storage type and manual cast

一个很大的提升对于FP8的内存和手动转换

在 pytorch 2.1.0 之后,pytorch 添加了 2 个新的 dtype 作为存储类型:float8_e5m2、float8_e4m3fn。[1][2] 基于讨论使用 fp8 作为训练/使用 NN 模型的参数/梯度的论文。我认为值得对 fp8 格式进行一些优化。[3][4] 此外,一些扩展也已经支持这个功能[5]

速度提升

由于将 FP8 与 FP16 一起使用,因此计算需要一些额外的操作来强制转换 dtype。 它会降低速度(特别是对于较小的批量)

批量大小

768x768 标清1.x fp16

768x768 标清1.x fp8

1024x1024 SDXL fp16

1024x1024 SDXL fp8

1

8.27 秒/秒

7.85 秒/秒

3.84 秒/秒

3.67 秒/秒

4

3.19 秒/秒

3.08 秒/秒

1.51 秒/秒

1.45 秒/秒

会降低质量吗?几乎不会

什么是FP8  FP16?

Fp16:意味模型用16位浮点数存,相对于Fp32更小更快,但是无法用于CPU,因为有的半浮点精度运算在CPU上不支持。通常为了更快的运算,在GPU上我们也会将Fp32转换成Fp16,这个可以在设置里配置。那么随之而来的一个params是8个byte(字节),FP32就是4个byte,FP8就是一个Byte,FP或者BF16相对已经是比较好的出图质量了。

以下测试结果来自原PR作者琥珀青叶,如果你想要尝试,在源码中切换此PR即可

首先SD1的时候FP16存下来是2G,SDXL因为参数变多了FP16也要5G,这样很多显卡就hold不住了。 所以青叶做了个事情,就是load的时候用FP8放在显存里,这样SDXL存在显存是2.5G。但是在每一层运算的时候把对应的FP8转到FP16,所以整个计算流程看起来是是一致的。同时整个流程的显存占用也下来的。

正常启动测试

开启FP8并开启内存缓存优化

XYZ测试关闭前后对比

起初的静态内存占用为5.3

运行后稳定在6.4左右

开启前后对图片直连影响很小,有细微细节差距

搭配LCM测试

当前所有的PR审核已经通过,或将在测试后在1.7进行升级推出正式版本

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞