本文主要介绍如何在云服务器实例中部署Stable Diffusion XL Turbo模型,并使用CPU加速文生图推理。
本实践使用了火山引擎第3代云服务器通用型g3i,该规格实例采用火山引擎自研最新DPU架构并搭载了第5代英特尔®至强®可扩展处理器(Emerald Rapids,EMR),结合新一代硬件AI加速指令AMX-BF16(Intel Advanced Matrix Extensions)以及基于其上的IPEX框架优化,实现了系统级优化方案来加速SDXL-Turbo模型的文生图推理速度。
Intel® Extension for PyTorch(IPEX)是由Intel开源并维护的一个PyTorch扩展库,大幅度提升了使用PyTorch在Intel处理器上运行AI应用,尤其是深度学习应用的性能。Intel正不断为PyTorch贡献IPEX的优化性能,为PyTorch社区提供最新的Intel硬件和软件改进。更多信息,请参见IPEX。
本实践使用的推理模型为SDXL-Turbo(Stable Diffusion XL Turbo),该模型是Stability AI在Stable Diffusion基于SDXL 1.0的蒸馏(Distillation)版本,专为实时合成的文生图场景服务。该模型能够确保即使在一到两个采样步骤,也能保持高的图片质量。
更多模型相关的信息可参考:SDXL-Turbo。
说明
请确保Docker版本不低于19.03,且DOCKER_BUILDKIT=1
。
下载SDXL-Turbo模型。
mkdir models
cd models/
说明
本文通过huggingface 镜像站下载模型,您也可以前往huggingface 官网进行下载。
pip install -U huggingface_hub hf_transfer HF_ENDPOINT=https://hf-mirror.com HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download --resume-download stabilityai/sdxl-turbo --local-dir sdxl-turbo --local-dir-use-symlinks=False
将如下文件上传至在SDXL-Turbo模型同级目录下。操作详情可查看本地数据上传。
说明
本实践使用Intel提交的diffusers库,详情可查看Stable Diffusion XL on IPEX。
说明
本文件内容参考huggingface的pipeline_stable_diffusion_xl_ipex.py文件编写,您可以参考官方示例自行修改。
完成上传后,文件结构如下如图所示。
在Dockerfile文件同级目录下,执行如下命令,制作Docker镜像。
docker build -t sdxl:v1 .
执行如下命令,运行Docker。
docker run --name sdxl --privileged=true -v /root/models:/models -it sdxl:v1 bash
在容器sdxl
的交互模式中,执行如下命令,进入模型目录。
cd sdxlturbo
执行如下命令,通过脚本进行文生图推理测试。
sh run_local.sh
生成图片示例:
在Docker容器中,推理生成的图片将以saved_pic0ite$Nubmer$.png
格式命名。
后续您可以使用如下命令,继续文生图推理。
numactl --localalloc --physcpubind=48-71 python sd_pipe_sdxl_turbo.py --height 512 --width 512 --repeat 11 --step 4 --bf16 --prompt "A spaceship traveling through the stars. highly detailed, 8k"
参数说明
参数名 | 说明 | 取值样例 |
---|---|---|
--localalloc | 指定使用本地内存分配器,而不是默认的系统内存分配器。 | - |
--physcpubind | 指定物理CPU的绑定范围,以提高程序的运行效率。 | 48-71 |
参数名 | 说明 | 取值样例 |
---|---|---|
--bf16 | 表示是否启用BF16精度模式。 说明
| --bf16 |
--batch | int,表示批处理大小,默认值为1 。 | 1 |
--height | int,表示图像高度,单位像素,默认值为 说明 支持与推荐的高、宽值,可参考width-and-height。 | 512 |
--width | int,表示图像宽度,单位像素,默认值为 说明 支持与推荐的高、宽值,可参考width-and-height。 | 512 |
--step | int,表示旋转循环的步长,默认值为4 。 | 4 |
--repeat | int,表示推断的重复次数,默认值为3 。 | 11 |
--prompt | String,表示生成图片的内容,默认值为beautiful beach with white sands, trophical island, coconat tree, a beautiful boat on the beach, moon night, 8k 。 | A spaceship traveling through the stars. highly detailed, 8k |
本节展示了使用ecs.g3i.8xlarge规格实例,通过Stable Diffusion XL Turbo模型生成不同分辨率与数据精度图片的耗时信息。
说明
下表测试数据仅做参考,实际数据可能会因您的操作环境而发生变化,请以实际情况为准。
实例规格 | 数据精度 | 参数 | 单次平均耗时 | 单次平均耗时 |
---|---|---|---|---|
ecs.g3i.8xlarge | BF16 | batch: 1 | 1.36s | 5.05s |
FP32 | batch: 1 | 4.86s | 17.37s |
在搭载英特尔EMR处理器的ecs.g3i.8xlarge规格实例中,根据本实践调整后的文生图模型,可通过使能高级矩阵扩展加速引擎(AMX指令集)有效加速推理速度,最快可达 0.735 images/s,实现秒级生图性能。与未使用或不支持AMX指令集加速的实例相比,其文生成图性能可提升293% ~ 388%。
因此,在追求性价比、丰富实例资源场景下,您可以使用搭载英特尔EMR处理器的实例规格(例如通用型g3i)代替GPU实例,通过系统级加速方案获取最优性价比的高效文生图服务。