卖不甜枣 发表于 2025-4-9 19:07:22

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

这篇文章重要先容了对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 的推理性能,使其在生成高质量图像时更加高效。这里是自己的论文阅读记录,感兴趣的话可以参考一下,假如需要阅读原文的话可以看这里,如下所示:
https://i-blog.csdnimg.cn/direct/fb47d8aaa7fe438ea65505d23593e6fe.png
摘要

稳固扩散(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上测试)。
官方项目地址在这里,如下所示:
https://i-blog.csdnimg.cn/direct/b5b5ce814070454ab88817ce9f406254.png
ModelStepsImage SizeTypeOur AccelerationSdxl201024×1024F324.79×F163.06×Sd220768×768F322.02×F161.68×Sd1.520512×512F321.84×F161.51× Build操作:
mkdir build
cd build
cmake ..
cmake --build . --config Release Run操作:
usage: ./bin/sd

arguments:
-h, --help                         show this help message and exit
-M, --mode                run mode (txt2img or img2img or convert, default: txt2img)
-t, --threads N                  number of threads to use during computation (default: -1).
                                     If threads <= 0, then threads will be set to the number of CPU physical cores
-m, --model                 path to model
--vae                         path to vae
--taesd                path to taesd. Using Tiny AutoEncoder for fast decoding (low quality)
--control-net        path to control net model
--embd-dir       path to embeddings.
--stacked-id-embd-dir       path to PHOTOMAKER stacked id embeddings.
--input-id-images-dir       path to PHOTOMAKER input id images dir.
--normalize-input                  normalize PHOTOMAKER input id images
--upscale-model       path to esrgan model. Upscale images after generate, just RealESRGAN_x4plus_anime_6B supported by now.
--upscale-repeats                  Run the ESRGAN upscaler this many times (default 1)
--type                       weight type (f32, f16, q4_0, q4_1, q5_0, q5_1, q8_0)
                                     If not specified, the default is the type of the weight file.
--lora-model-dir              lora model directory
-i, --init-img              path to the input image, required by img2img
--control-image             path to image condition, control net
-o, --output OUTPUT                path to write result image to (default: ./output.png)
-p, --prompt             the prompt to render
-n, --negative-prompt PROMPT       the negative prompt (default: "")
--cfg-scale SCALE                  unconditional guidance scale: (default: 7.0)
--strength STRENGTH                strength for noising/unnoising (default: 0.75)
--style-ratio STYLE-RATIO          strength for keeping input identity (default: 20%)
--control-strength STRENGTH      strength to apply Control Net (default: 0.9)
                                     1.0 corresponds to full destruction of information in init image
-H, --height H                     image height, in pixel space (default: 512)
-W, --width W                      image width, in pixel space (default: 512)
--sampling-method {euler, euler_a, heun, dpm2, dpm++2s_a, dpm++2m, dpm++2mv2, lcm}
                                     sampling method (default: "euler_a")
--stepsSTEPS                     number of sample steps (default: 20)
--rng {std_default, cuda}          RNG (default: cuda)
-s SEED, --seed SEED               RNG seed (default: 42, use random seed for < 0)
-b, --batch-count COUNT            number of images to generate.
--schedule {discrete, karras}      Denoiser sigma schedule (default: discrete)
--clip-skip N                      ignore last layers of CLIP network; 1 ignores none, 2 ignores one layer (default: -1)
                                     <= 0 represents unspecified, will be 1 for SD1.x, 2 for SD2.x
--vae-tiling                     process vae in tiles to reduce memory usage
--control-net-cpu                  keep controlnet in cpu (for low vram)
--canny                            apply canny preprocessor (edge detection)
-v, --verbose                      print extra info 文生图实例:
./bin/sd -m ../models/sd-v1-4.ckpt -p "a lovely cat"
# ./bin/sd -m ../models/v1-5-pruned-emaonly.safetensors -p "a lovely cat"
# ./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采取了一种共享状态的方法,为核心分配相同的工作负载。而在我们的优化中,盘算核心在完成当前盘算后,动态接收下一个盘算块。这一操作可以受益于具有P核(性能核)和E核(服从核)的盘算单元,比方M系列Mac。通过根据核心性能动态分配工作负载,该方法确保了各种盘算核心的高效使用和平衡盘算。
3. 评估

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

我们展示了使用Winograd算法实现的卷积算子在Sdcpp采样过程中多个卷积层的性能,如表1所示。具体来说,我们重点关注在采样过程中使用频率较高的层。如表1所示,我们的优化可以在差别配置下为各种卷积层带来超过2倍的推理加速。
https://i-blog.csdnimg.cn/direct/a364427d74d14eea83ed0d1caf519d6e.png
团体图像生成加速性能

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

我们在图1中展示了原始Sdcpp和我们的优化版本在SDXL-Turbo模子和5步生成过程中的一些生成示例。可以观察到,通过我们的改进,生成的图像比原始Sdcpp生成的图像更为逼真。
https://i-blog.csdnimg.cn/direct/5b65e4666f9b4a6f8e2fdce02a57ae86.png
4. 结论

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Open-Source Acceleration of Stable-Diffusion.cpp——开源加速Stable-Diffusion.cpp