敏捷扩散推理 (ADI)
敏捷扩散推理 (ADI) 是一个带有命令行工具的 C++ 库。旨在利用 ONNXRuntime 的加速能力和 .onnx 模型格式的高兼容性,为 Stable Diffusion 的工程部署提供一个便捷的解决方案,具有合适的包大小和高性能。
为什么选择 ONNXRuntime 作为我们的推理引擎?
-
开源: ONNXRuntime 是一个开源项目,允许用户自由使用和修改以适应不同的应用场景。
-
可扩展性: 它支持自定义算子和优化,允许根据特定需求进行扩展和优化。
-
高性能: ONNXRuntime 经过高度优化,可提供快速的推理速度,适用于实时应用。
-
强兼容性: 它支持多个深度学习框架(如 PyTorch、TensorFlow)的模型转换,使集成和部署变得方便。
-
跨平台支持: ONNXRuntime 支持多种硬件平台,包括 CPU、GPU、TPU 等,能够在各种设备上高效执行。
-
社区和企业支持: 由微软开发和维护,拥有活跃的社区和企业支持,提供持续的更新和维护。
如何安装(命令行工具)?
方法 1:使用包管理器安装命令行工具
## macOS (Homebrew):
brew tap windsander/adi-stable-diffusion
brew install adi
## Windows (git-Bash + Chocolatey):
curl -L -o adi.1.0.1.nupkg "https://raw.githubusercontent.com/Windsander/ADI-Stable-Diffusion/deploy/adi.1.0.1.nupkg"
choco install adi.1.0.1.nupkg -y
方法 2:从发布版本下载
你可以从**发布资源**中找到最新可用版本。包的文件树结构如下:
--bin
--adi
--lib
--[对应平台的 ADI 库,如 libadi.a]
--[对应平台的 ORT 库,如 libonnxruntime.dylib]
--include
--adi.h
--CHANGELOG.md
--README.md
--LICENSE
解压后,你可以简单地将 bin
和 lib
目录安装到你的系统中,或者直接进入解压后的 bin
目录,开始使用 adi
。
方法 3:在本地构建 [adi-lib & adi-cli]
- 提供了一个自动化脚本,以更轻松地在你的设备上编译 ADI。
只需执行脚本 auto_build.sh:
# 如果你不传递 BUILD_TYPE 参数,脚本将使用默认的 Debug 构建类型。
# 并且,如果你没有通过 [options] 启用某些 ORTProvider,脚本将根据平台选择默认的 ORTProvider
bash ./auto_build.sh
# 示例-MacOS:
bash ./auto_build.sh --platform macos --build-type debug
# 示例-Windows:
bash ./auto_build.sh --platform windows --build-type debug
# 示例-Linux(Ubuntu):
bash ./auto_build.sh --platform linux --build-type debug
# 示例-Android:
bash ./auto_build.sh --platform android \
--build-type debug \
--android-ndk /Volumes/AL-Data-W04/WorkingEnv/Android/sdk/ndk/26.1.10909125 \
--android-ver 27
# 示例(带额外选项)如下,构建发布版本,启用 CUDA=ON TensorRT=ON,并自定义编译器配置
bash ./auto_build.sh [参数] \
--cmake /opt/homebrew/Cellar/cmake/3.29.5/bin/cmake \
--ninja /usr/local/bin/ninja \
--arch-abi x86_64 \
--jobs 8 \
--options "-DORT_ENABLE_CUDA=ON -DORT_ENABLE_TENSOR_RT=ON"
目前,该项目提供以下[选项]:
# 1. 选项列表
option(ORT_COMPILED_ONLINE "adi: 使用在线onnxruntime(ort),否则本地构建" ${SD_ORT_ONLINE_AVAIL})
option(ORT_COMPILED_HEAVY "adi: 使用重度编译,${Red}仅用于调试,默认关闭${ColourReset}" OFF)
option(ORT_BUILD_COMMAND_LINE "adi: 构建命令行工具" ${CMAKE_STANDALONE})
option(ORT_BUILD_COMBINE_BASE "adi: 将代码合并在一起构建单一输出库" OFF)
option(ORT_BUILD_SHARED_ADI "adi: 构建ADI项目共享库" OFF)
option(ORT_BUILD_SHARED_ORT "adi: 构建ORT为共享库" OFF)
option(ORT_ENABLE_TENSOR_RT "adi: 使用TensorRT提供程序加速推理" ${DEFAULT_TRT_STATE})
option(ORT_ENABLE_CUDA "adi: 使用CUDA提供程序加速推理" ${DEFAULT_CUDA_STATE})
option(ORT_ENABLE_COREML "adi: 使用CoreML提供程序加速推理" ${DEFAULT_COREML_STATE})
option(ORT_ENABLE_NNAPI "adi: 使用NNAPI提供程序加速推理" ${DEFAULT_NNAPI_STATE})
option(ADI_AUTO_INSTALL "adi: 构建完成后自动安装ADI-CLI到当前系统,需要管理员权限" OFF)
如果您确实需要,请启用(仅限真正需要时使用,不推荐)。
如何使用?
示例:1步Euler_A img2img潜在空间可视化
-
以下展示了[示例:1步img2img推理]在潜在空间中实际发生的情况(跳过所有模型):
-
您可以使用CMake生成的命令行工具执行此项目的相关功能
执行1步img2img推理,如:
# 可选(如果使用本地构建且未安装):切换到./[您的adi路径]/bin/,例如:
cd ./cmake-build-debug/bin/
# 以下是使用此工具的示例:
# sd-turbo, img2img, 正面提示词, 推理步数=1, 引导=1.0, euler_a(用于1步目的)
adi \
-p "日落时分水中的一只猫" \
-m img2img \
-i ../../sd/io-test/input-test.png \
-o ../../sd/io-test/output.png \
-w 512 -h 512 -c 3 \
--seed 15.0 \
--dims 1024 \
--clip ../../sd/sd-base-model/onnx-sd-turbo/text_encoder/model.onnx \
--unet ../../sd/sd-base-model/onnx-sd-turbo/unet/model.onnx \
--vae-encoder ../../sd/sd-base-model/onnx-sd-turbo/vae_encoder/model.onnx \
--vae-decoder ../../sd/sd-base-model/onnx-sd-turbo/vae_decoder/model.onnx \
--dict ../../sd/sd-dictionary/vocab.txt \
--beta-start 0.00085 \
--beta-end 0.012 \
--beta scaled_linear \
--alpha cos \
--scheduler euler_a \
--predictor epsilon \
--tokenizer bpe \
--train-steps 1000 \
--token-idx-num 49408 \
--token-length 77 \
--token-border 1.0 \
--gain 1.1 \
--decoding 0.18215 \
--guidance 1.0 \
--steps 1 \
-v
现在,您可以尝试一下了~ (0w0 )
额外信息:
-
手动准备推理引擎,请参阅:引擎的README.md
-
手动准备ONNX格式转换器和SD模型,请参阅:SD_ORT的README.md
开发进度检查表(最新):
基本管道功能(主要)
-
[SD_v1] Stable-Diffusion (v1.0 ~ v1.5, turbo) (2024/06/04后测试)
- v1.0 (HuggingFace):初始版本 ✅
- v1.1 (HuggingFace):提升图像质量和生成速度 ✅
- v1.2 (HuggingFace):进一步优化生成效果 ✅
- v1.3 (HuggingFace):增加更多训练数据 ✅
- v1.4 (HuggingFace):增强图像生成多样性 ✅
- v1.5 (HuggingFace):最终优化版本 ✅
- turbo (HuggingFace):社区驱动的优化版本,更快速高效 ✅
-
[SD_v2] Stable-Diffusion (v2.0, v2.1)
- v2.0 (HuggingFace):图像质量和生成效率显著提升
- v2.1 (HuggingFace):进一步优化模型稳定性和生成效果
-
[SD_v3] Stable-Diffusion (v3.0)
- v3.0 (HuggingFace):预期的下一代版本,带来更多改进和新功能
-
[SDXL] Stable-Diffusion-XL
- SDXL (HuggingFace):用于更大规模模型和高分辨率图像的实验版本
- SDXL-turbo (HuggingFace):社区驱动的优化版本,更快速高效
-
[SVD] Stable-Video-Diffusion
- SVD (HuggingFace):专门用于视频生成和编辑的版本
调度器能力
-
策略
- 离散/方法默认(discrete)(2024/05/22后)
- Karras (karras)
-
采样方法
- Euler (euler) (2024/06/04后 ✅已测试)
- Euler Ancestral (euler_a) (2024/05/24后 ✅已测试)
- 拉普拉斯金字塔采样 (lms) (2024/07/09后 ✅已测试)
- 潜在一致性模型 (lcm) (2024/07/04后 ✅已测试)
- Heun预测-校正器 (heun) (2024/07/08后 ✅已测试)
- 统一预测-校正器 (uni_pc)
- 伪数值扩散模型调度器 (pndm)
- 改进的伪数值扩散模型调度器 (ipndm)
- 扩散指数积分器采样多步 (deis_m)
- 去噪扩散隐式模型 (ddim) (2024/07/12后 ✅已测试)
- 去噪扩散概率模型 (ddpm) (2024/07/09后 ✅已测试)
- 随机微分方程中的扩散概率模型求解器 (dpm_sde)
- 多步中的扩散概率模型求解器 (dpm_m)
- 单步中的扩散概率模型求解器 (dpm_s) 分词器类型
-
字节对编码 (bpe) (2024年7月3日后 ✅已测试)
-
词片编码 (wp) (2024年5月27日后 ✅已测试)
-
句子片段编码 (sp) [如有必要]