SDXL 由一组用于潜在扩散的专家管道组成: 在第一步中,使用基础模型生成(噪声)潜伏, 然后使用专门用于最终降噪步骤的细化模型此处获得
参考实现:
# StableDiffusionxl
https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0输入数据
| 输入数据 | 大小 | 数据类型 | 数据排布格式 |
|---|---|---|---|
| prompt | batch x 77 | STRING | ND |
输出数据
| 输出数据 | 大小 | 数据类型 | 数据排布格式 |
|---|---|---|---|
| output1 | batch x 3 x 1024 x 1024 | FLOAT32 | NCHW |
该模型需要以下插件与驱动
表 1 版本配套表
| 配套 | 版本 | 环境准备指导 |
|---|---|---|
| Python | 3.10.x | - |
| torch | 2.9.0 | - |
注意:
下载仓库到本地。
git clone https://modelers.cn/MindIE/stable-diffusion-xl.git安装依赖。
pip3 install -r requirements.txt
# 若要使用hpsv2验证精度,则还需要按照以下步骤安装hpsv2
git clone https://github.com/tgxs002/HPSv2.git
cd HPSv2
pip3 install -e .安装mindie包
# 安装mindie
chmod +x ./Ascend-mindie_xxx.run
./Ascend-mindie_xxx.run --install
source /usr/local/Ascend/mindie/set_env.sh编译fatik算子plugin 注:只有Duo卡设备下需要执行此步骤
cd stable-diffusion-xl/pta_plugin
bash build.sh执行成功后会在stable-diffusion-xl/pta_plugin目录下生成一个build目录,其下存放着一个名为libPTAExtensionOPS.so的文件
获取原始数据集。
本模型输入文本信息生成图片,无需数据集。
获取权重(可选)
可提前下载权重,放到代码同级目录下,以避免执行后面步骤时可能会出现下载失败。
# 需要使用 git-lfs (https://git-lfs.com)
apt install git-lfs
git lfs install
# xl
git clone https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0权重配置文件 修改权重配置文件:
vi ${model_path}/model_index.json做如下修改:
{
"_class_name": "StableDiffusionXLPipeline",
"_diffusers_version": "0.19.0.dev0",
"force_zeros_for_empty_prompt": true,
"add_watermarker": null,
"scheduler": [
"diffusers",
"EulerDiscreteScheduler"
],
"text_encoder": [
"transformers",
"CLIPTextModel"
],
"text_encoder_2": [
"transformers",
"CLIPTextModelWithProjection"
],
"tokenizer": [
"transformers",
"CLIPTokenizer"
],
"tokenizer_2": [
"transformers",
"CLIPTokenizer"
],
"unet": [
"stable_diffusion_xl",
"UNet2DConditionModel"
],
"vae": [
"diffusers",
"AutoencoderKL"
]
}开始推理验证。
echo performance |tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
sysctl -w vm.swappiness=0
sysctl -w kernel.numa_balancing=0export TASK_QUEUE_ENABLE=2# xl (使用上一步下载的权重)
model_base="./stable-diffusion-xl-base-1.0"执行命令
python3 infer_pipe.py \
--path=${model_base} \
--prompt="A dog" \
--device_id=0 \
--height=1024 \
--width=1024 \
--steps=50 \
--batch_size=1 \
--num_images_per_prompt=1 \
--scheduler="DDIM"参数说明:
lora热切换 下载lora模型的权重
echo performance |tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
sysctl -w vm.swappiness=0
sysctl -w kernel.numa_balancing=0export TASK_QUEUE_ENABLE=2# xl (使用之前下载的sdxl模型权重)
model_base="./stable-diffusion-xl-base-1.0"
# xl_lora(使用上一步下载的lora模型权重)
lora_base="./pytorch_lora_weights.safetensors"执行命令
python3 infer_pipe.py \
--path=${model_base} \
--prompt="A dog" \
--device_id=0 \
--height=1024 \
--width=1024 \
--steps=50 \
--batch_size=1 \
--num_images_per_prompt=1 \
--use_lora \
--lora_path=${lora_base}参数说明:
A2 单卡性能验证。
python3 ./test_performance.py \
--path=${model_base} \
--device_id=0 \
--height=1024 \
--width=1024 \
--steps=50 \
--batch_size=1 \
--num_images_per_prompt=1 \
--cache_method="agb_cache" \
--compile \
--iterator=6参数说明:
参考性能结果:
| 设备 | 无cache | static_cache | agb_cache |
|---|---|---|---|
| Atlas 800I A2(8*32G) | 7.87s | 6.25s | 4.36s |
DUO单卡双芯性能验证。
echo performance |tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
sysctl -w vm.swappiness=0
sysctl -w kernel.numa_balancing=0export TASK_QUEUE_ENABLE=2 apt-get update
apt-get install numactl查询卡的NUMA node
lspci -vs bus-idbus-id可通过npu-smi info获得,查询到NUMA node,在推理命令前加上对应的数字。 可通过lscpu获得NUMA node对应的CPU核数
NUMA node0: 0-23
NUMA node1: 24-47
NUMA node2: 48-71
NUMA node3: 72-95当前查到NUMA node是0,对应0-23,推荐绑定其中单核以获得更好的性能。
numactl -C 0-23
ASCEND_RT_VISIBLE_DEVICES=0,1 torchrun --master_port=20095 --nproc_per_node=2 test_performance.py \
--path=${model_base} \
--device_id=0 \
--height=1024 \
--width=1024 \
--steps=50 \
--batch_size=1 \
--num_images_per_prompt=1 \
--cache_method="agb_cache" \
--iterator=6 \
--parallel精度验证
由于生成的图片存在随机性,提供两种精度验证方法:
注意,由于要生成的图片数量较多,进行完整的精度验证需要耗费很长的时间。
下载Parti数据集
wget https://raw.githubusercontent.com/google-research/parti/main/PartiPrompts.tsv --no-check-certificate下载模型权重
# Clip Score和HPSv2均需要使用的权重
# 安装git-lfs
apt install git-lfs
git lfs install
# Clip Score权重
git clone https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K
# HPSv2权重
wget https://huggingface.co/spaces/xswu/HPSv2/resolve/main/HPS_v2_compressed.pt --no-check-certificate也可手动下载权重
将权重放到CLIP-ViT-H-14-laion2B-s32B-b79K目录下,手动下载HPSv2权重放到当前路径
使用推理脚本读取Parti数据集,生成图片
# 单卡
python3 ./test_precision.py --path=${model_base} --device_id=0 --height=1024 --width=1024 --num_images_per_prompt=4 --cache_method="agb_cache" --prompt_file=./PartiPrompts.tsv --prompt_file_type=parti
# 多卡
ASCEND_RT_VISIBLE_DEVICES=0,1 torchrun --master_port=20095 --nproc_per_node=2 ./test_precision.py --path=${model_base} --device_id=0 --height=1024 --width=1024 --num_images_per_prompt=4 --cache_method="agb_cache" --prompt_file=./PartiPrompts.tsv --prompt_file_type=parti --parallel参数说明:
运行完成后的结果会保存到以运行时间戳命名的文件夹下,文件夹下包含结果'image_info.json'文件以及保存的图片文件夹。
计算精度指标
CLIP-score
python3 clip_score.py \
--image_info="image_info.json" \
--model_name="ViT-H-14" \
--model_weights_path="./CLIP-ViT-H-14-laion2B-s32B-b79K/open_clip_pytorch_model.bin"参数说明:
image_info.json文件。执行完成后会在屏幕打印出精度计算结果。
HPSv2
python3 hpsv2_score.py \
--image_info="image_info.json" \
--HPSv2_checkpoint="./HPS_v2_compressed.pt" \
--clip_checkpoint="./CLIP-ViT-H-14-laion2B-s32B-b79K/open_clip_pytorch_model.bin"参数说明:
image_info.json文件。执行完成后会在屏幕打印出精度计算结果。
多实例模型模型推理
多实例推理主要用于多请求场景,使用多个实例同时推理来提高吞吐。在多实例推理中,可以通过显存共享技术将多个实例间的权重显存共享,从而实现降低显存消耗。
cd stable_diffusion_xl/share_memory
cmake .
make -j
cd ../../双实例推理
torchrun --nproc_per_node=2 infer_pipe.py --path=${model_base} --prompt="A dog" --device_id=0 --height=1024 --width=1024 --num_images_per_prompt=1
双实例权重显存共享推理
torchrun --nproc_per_node=2 infer_pipe.py --path=${model_base} --prompt="A dog" --device_id=0 --height=1024 --width=1024 --num_images_per_prompt=1 --share_memory=true