Open-Source Acceleration of Stable-Diffusion.cpp——开源加速Stable-Dif ...

打印 上一主题 下一主题

主题 1750|帖子 1750|积分 5250

这篇文章重要先容了对stable-diffusion.cpp (Sdcpp) 的优化工作,旨在加速稳固扩散模子的推理过程,淘汰内存斲丧。以下是文章的重要内容总结:

  • 背景与问题

    • 稳固扩散模子在生成高质量图像方面体现精彩,但其推理过程耗时且内存麋集。
    • Sdcpp 是一个轻量级的 C/C++ 实现,专为高效推理计划,但其当前的 2D 卷积操作(ggml_conv_2d)服从低下,导致高延长和内存占用。

  • 优化方法

    • 作者采取 Winograd 算法 来优化 2D 卷积操作,显著淘汰了盘算和内存开销。
    • 通过分析盘算图的依赖性和独立性,使用装备的局部性和并行性,进一步提拔了性能。
    • 引入了动态工作负载分配机制,优化了多核装备的盘算服从(如 M1 Pro 的 P 核和 E 核)。

  • 实验效果

    • 优化后的 Sdcpp 支持多种稳固扩散模子(如 SDv1.4、v1.5、v2.1、SDXL 和 SDXL-Turbo),并在 Mac 和 Android 装备上实现了端到端的正确推理。
    • 单个卷积层的推理速度提拔了 2.76 倍,团体图像生成过程的推理速度提拔了 4.79 倍(在 M1 Pro 上测试)。
    • 在更大图像尺寸(如 1024×1024)下,优化效果更为显著。

  • 贡献与未来工作

    • 提供了支持多种装备和模子的优化框架,显著提拔了推理速度和内存服从。
    • 未来将进一步优化算子速度,并扩展对更多模子和装备的支持。

这篇文章通过 Winograd 算法和并行盘算优化,显著提拔了 Sdcpp 的推理性能,使其在生成高质量图像时更加高效。这里是自己的论文阅读记录,感兴趣的话可以参考一下,假如需要阅读原文的话可以看这里,如下所示:

摘要

稳固扩散(Stable Diffusion)在生成高质量图像方面起着至关重要的作用。然而,图像生成过程耗时且内存麋集。为了办理这一问题,stable-diffusion.cpp(Sdcpp)作为一种高效的推理框架应运而生,旨在加速扩散模子。尽管Sdcpp轻量级,但其当前的ggml_conv_2d算子实现服从低下,导致推理延长高且内存占用大。为此,本文提出了一种基于Winograd算法的Sdcpp优化版本,以加速2D卷积操作,这是整个流程中的重要瓶颈。通过分析依赖和独立的盘算图,我们使用装备的局部性和并行性,实现了显著的性能提拔。我们的框架在多种稳固扩散模子(包罗SDv1.4、v1.5、v2.1、SDXL和SDXL-Turbo)上均能提供正确的端到端效果。评估效果表明,与原始Sdcpp相比,单个卷积层的加速比高达2.76倍,团体图像生成过程的推理加速比高达4.79倍(在M1 Pro上测试)。
官方项目地址在这里,如下所示:

ModelStepsImage SizeTypeOur AccelerationSdxl201024×1024F324.79×F163.06×Sd220768×768F322.02×F161.68×Sd1.520512×512F321.84×F161.51× Build操作:
  1. mkdir build
  2. cd build
  3. cmake ..
  4. cmake --build . --config Release
复制代码
Run操作:
  1. usage: ./bin/sd [arguments]
  2. arguments:
  3.   -h, --help                         show this help message and exit
  4.   -M, --mode [MODEL]                 run mode (txt2img or img2img or convert, default: txt2img)
  5.   -t, --threads N                    number of threads to use during computation (default: -1).
  6.                                      If threads <= 0, then threads will be set to the number of CPU physical cores
  7.   -m, --model [MODEL]                path to model
  8.   --vae [VAE]                        path to vae
  9.   --taesd [TAESD_PATH]               path to taesd. Using Tiny AutoEncoder for fast decoding (low quality)
  10.   --control-net [CONTROL_PATH]       path to control net model
  11.   --embd-dir [EMBEDDING_PATH]        path to embeddings.
  12.   --stacked-id-embd-dir [DIR]        path to PHOTOMAKER stacked id embeddings.
  13.   --input-id-images-dir [DIR]        path to PHOTOMAKER input id images dir.
  14.   --normalize-input                  normalize PHOTOMAKER input id images
  15.   --upscale-model [ESRGAN_PATH]      path to esrgan model. Upscale images after generate, just RealESRGAN_x4plus_anime_6B supported by now.
  16.   --upscale-repeats                  Run the ESRGAN upscaler this many times (default 1)
  17.   --type [TYPE]                      weight type (f32, f16, q4_0, q4_1, q5_0, q5_1, q8_0)
  18.                                      If not specified, the default is the type of the weight file.
  19.   --lora-model-dir [DIR]             lora model directory
  20.   -i, --init-img [IMAGE]             path to the input image, required by img2img
  21.   --control-image [IMAGE]            path to image condition, control net
  22.   -o, --output OUTPUT                path to write result image to (default: ./output.png)
  23.   -p, --prompt [PROMPT]              the prompt to render
  24.   -n, --negative-prompt PROMPT       the negative prompt (default: "")
  25.   --cfg-scale SCALE                  unconditional guidance scale: (default: 7.0)
  26.   --strength STRENGTH                strength for noising/unnoising (default: 0.75)
  27.   --style-ratio STYLE-RATIO          strength for keeping input identity (default: 20%)
  28.   --control-strength STRENGTH        strength to apply Control Net (default: 0.9)
  29.                                      1.0 corresponds to full destruction of information in init image
  30.   -H, --height H                     image height, in pixel space (default: 512)
  31.   -W, --width W                      image width, in pixel space (default: 512)
  32.   --sampling-method {euler, euler_a, heun, dpm2, dpm++2s_a, dpm++2m, dpm++2mv2, lcm}
  33.                                      sampling method (default: "euler_a")
  34.   --steps  STEPS                     number of sample steps (default: 20)
  35.   --rng {std_default, cuda}          RNG (default: cuda)
  36.   -s SEED, --seed SEED               RNG seed (default: 42, use random seed for < 0)
  37.   -b, --batch-count COUNT            number of images to generate.
  38.   --schedule {discrete, karras}      Denoiser sigma schedule (default: discrete)
  39.   --clip-skip N                      ignore last layers of CLIP network; 1 ignores none, 2 ignores one layer (default: -1)
  40.                                      <= 0 represents unspecified, will be 1 for SD1.x, 2 for SD2.x
  41.   --vae-tiling                       process vae in tiles to reduce memory usage
  42.   --control-net-cpu                  keep controlnet in cpu (for low vram)
  43.   --canny                            apply canny preprocessor (edge detection)
  44.   -v, --verbose                      print extra info
复制代码
文生图实例:
  1. ./bin/sd -m ../models/sd-v1-4.ckpt -p "a lovely cat"
  2. # ./bin/sd -m ../models/v1-5-pruned-emaonly.safetensors -p "a lovely cat"
  3. # ./bin/sd -m ../models/sd_xl_base_1.0.safetensors --vae ../models/sdxl_vae-fp16-fix.safetensors -H 1024 -W 1024 -p "a lovely cat" -v
复制代码
2. 技术细节

由于Sdcpp中2D卷积算子的当前实现相对较慢且内存占用高,我们应用Winograd算法来优化Sdcpp中的卷积操作,从而加速生成过程并淘汰盘算和内存开销。通过Winograd算法,卷积操作被分为多个步调:(i) 滤波器和激活权重的预处理,(ii) 预处理张量之间的逐元素乘法,以及(iii) 中心效果的后处理。在本工作中,我们分析了依赖和独立的盘算图,使用装备的局部性和并行性,在卷积操作中实现了显著的性能提拔。
为了增强局部性,我们应用了分散存储(scatter-store)和聚集加载(gather-load)优化,确保数据在加载过程中适合L1缓存,从而最小化缓存互换。对于并行性,我们使用Winograd算法中的独立操作,将独立盘算分配到多个线程和核心上,以淘汰图像生成延长。现实上,GGML[3]采取了一种共享状态的方法,为核心分配相同的工作负载。而在我们的优化中,盘算核心在完成当前盘算后,动态接收下一个盘算块。这一操作可以受益于具有P核(性能核)和E核(服从核)的盘算单元,比方M系列Mac。通过根据核心性能动态分配工作负载,该方法确保了各种盘算核心的高效使用和平衡盘算。
3. 评估

算子支持:此前,原始Sdcpp中的很多算子不支持Android,导致某些SD模子(如SDXL)的图像生成效果不正确。目前,在我们的优化中,我们已经支持了多种SD模子中的全部算子,适用于Mac、Android和AMD装备。我们还支持扩散变压器模子中的算子,这些模子广泛用于视频生成模子(如Open-Sora[6])。别的,我们的实现还支持算子的量化。在未来的工作中,我们将进一步优化这些常见算子集中的算子速度。
模子支持:我们基于算子库实现了稳固扩散的端到端加速管道。我们的框架可以在Mac(GPU,Metal[7])和Android(Qualcomm,OpenCL[8])装备上为全部SDv1.4、v1.5、v2.1、SDXL和SDXL-Turbo模子生成正确的端到端效果。它还支持其他变体,如Realistic Vision和用户指定的恣意LoRA[9]模块。
单个卷积层加速性能

我们展示了使用Winograd算法实现的卷积算子在Sdcpp采样过程中多个卷积层的性能,如表1所示。具体来说,我们重点关注在采样过程中使用频率较高的层。如表1所示,我们的优化可以在差别配置下为各种卷积层带来超过2倍的推理加速。

团体图像生成加速性能

我们在M1 Pro和M2 Max上展示了图像生成的推理加速性能,分别如表2和表3所示。可以观察到,与Sdcpp相比,我们的方法在差别图像尺寸和模子配置下实现了更快的推理速度。特别是当图像尺寸较大时(如1024×1024),我们对Sdcpp的改进更为显著(如在M1 Pro上FP32的4.79倍加速),展示了我们杰出的加速性能。


可视化

我们在图1中展示了原始Sdcpp和我们的优化版本在SDXL-Turbo模子和5步生成过程中的一些生成示例。可以观察到,通过我们的改进,生成的图像比原始Sdcpp生成的图像更为逼真。

4. 结论

当前Sdcpp中ggml_conv_2d的实现仍然较慢且内存麋集。我们通过Winograd算法优化了Sdcpp以克服这些限制。我们的增强框架支持全部测试模子的端到端图像生成,包罗SDv1.4、v1.5、v2.1、SDXL和SDXL-Turbo,始终提供正确的效果。在这些模子上的全面测试突显了我们的优化带来的显著加速。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表