这篇文章重要先容了对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操作:
- mkdir build
- cd build
- cmake ..
- cmake --build . --config Release
复制代码 Run操作:
- usage: ./bin/sd [arguments]
- arguments:
- -h, --help show this help message and exit
- -M, --mode [MODEL] 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 [MODEL] path to model
- --vae [VAE] path to vae
- --taesd [TAESD_PATH] path to taesd. Using Tiny AutoEncoder for fast decoding (low quality)
- --control-net [CONTROL_PATH] path to control net model
- --embd-dir [EMBEDDING_PATH] path to embeddings.
- --stacked-id-embd-dir [DIR] path to PHOTOMAKER stacked id embeddings.
- --input-id-images-dir [DIR] path to PHOTOMAKER input id images dir.
- --normalize-input normalize PHOTOMAKER input id images
- --upscale-model [ESRGAN_PATH] 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 [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 [DIR] lora model directory
- -i, --init-img [IMAGE] path to the input image, required by img2img
- --control-image [IMAGE] path to image condition, control net
- -o, --output OUTPUT path to write result image to (default: ./output.png)
- -p, --prompt [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")
- --steps STEPS 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[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企服之家,中国第一个企服评测及商务社交产业平台。 |