HuggingFace镜像/stable-diffusion-xl
模型介绍文件和版本分析
下载使用量0

stable-diffusion-xl模型-推理指导

  • 概述

    • 输入输出数据
  • 推理环境准备

  • 快速上手

    • 获取源码
    • 模型推理
  • 推理SDXL-Lighting

概述

SDXL 由一组用于潜在扩散的专家管道组成: 在第一步中,使用基础模型生成(噪声)潜伏, 然后使用专门用于最终降噪步骤的细化模型此处获得

参考实现:

# StableDiffusionxl
https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0

输入输出数据

  • 输入数据

    输入数据大小数据类型数据排布格式
    promptbatch x 77STRINGND
  • 输出数据

    输出数据大小数据类型数据排布格式
    output1batch x 3 x 1024 x 1024FLOAT32NCHW

推理环境准备

  • 该模型需要以下插件与驱动

    表 1 版本配套表

    配套版本环境准备指导
    Python3.10.x-
    torch2.9.0-

注意:

  • 该模型也支持torch 2.1.0等版本
  • 该模型性能受CPU规格影响,建议使用64核CPU(arm)以复现性能

快速上手

获取源码

  1. 下载仓库到本地。

    git clone https://modelers.cn/MindIE/stable-diffusion-xl.git
  2. 安装依赖。

    pip3 install -r requirements.txt
    
    # 若要使用hpsv2验证精度,则还需要按照以下步骤安装hpsv2
    git clone https://github.com/tgxs002/HPSv2.git
    cd HPSv2
    pip3 install -e .
  3. 安装mindie包

    # 安装mindie
    chmod +x ./Ascend-mindie_xxx.run
    ./Ascend-mindie_xxx.run --install
    source /usr/local/Ascend/mindie/set_env.sh
  4. 编译fatik算子plugin 注:只有Duo卡设备下需要执行此步骤

    cd stable-diffusion-xl/pta_plugin
    bash build.sh

    执行成功后会在stable-diffusion-xl/pta_plugin目录下生成一个build目录,其下存放着一个名为libPTAExtensionOPS.so的文件

准备数据集

  1. 获取原始数据集。

    本模型输入文本信息生成图片,无需数据集。

模型推理

  1. 获取权重(可选)

    可提前下载权重,放到代码同级目录下,以避免执行后面步骤时可能会出现下载失败。

    # 需要使用 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
  2. 权重配置文件 修改权重配置文件:

    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"
    ]
    }
  3. 开始推理验证。

    1. 开启cpu高性能模式
    echo performance |tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
    sysctl -w vm.swappiness=0
    sysctl -w kernel.numa_balancing=0
    1. 设置调度流水优化
    export TASK_QUEUE_ENABLE=2
    1. 执行推理脚本。
    # 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"

    参数说明:

    • --path:模型权重路径
    • --prompt: 输入的prompt
    • --device_id:推理设备ID
    • --height: 生成图片的高
    • --width: 生成图片的宽
    • --steps: 迭代步数
    • --batch_size: 模型batch_size
    • --num_images_per_prompt: 单个prompt生成的图片数量
    • --scheduler: 采样器参数
  4. lora热切换 下载lora模型的权重

    1. 开启cpu高性能模式
    echo performance |tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
    sysctl -w vm.swappiness=0
    sysctl -w kernel.numa_balancing=0
    1. 设置调度流水优化
    export TASK_QUEUE_ENABLE=2
    1. 执行推理脚本。
    # 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}

    参数说明:

    • --path:sdxl模型权重路径
    • --prompt: 输入的prompt
    • --device_id:推理设备ID
    • --height: 生成图片的高
    • --width: 生成图片的宽
    • --steps: 迭代步数
    • --batch_size: 模型batch_size
    • --num_images_per_prompt: 单个prompt生成的图片数量
    • --use_lora: 开启lora热切
    • --lora_path:Lora模型权重路径
  5. 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

    参数说明:

    • --path:模型权重路径
    • --device_id:推理设备ID
    • --height: 生成图片的高
    • --width: 生成图片的宽
    • --steps: 迭代步数
    • --batch_size: 模型batch_size
    • --num_images_per_prompt: 单个prompt生成的图片数量
    • --cache_method: cache策略选择,默认为空,代表不开启cache,支持配置"static_cache"和"agb_cache","abg_cache"性能更好,但会引入更大的内存占用,当前"agb_cache"只支持50步迭代场景。
    • --compile: 开启图模式
    • --iterator: 测试循环次数,取从第3次开始后续的推理耗时的均值。

    参考性能结果:

    设备无cachestatic_cacheagb_cache
    Atlas 800I A2(8*32G)7.87s6.25s4.36s
  6. DUO单卡双芯性能验证。

    1. 开启cpu高性能模式
    echo performance |tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
    sysctl -w vm.swappiness=0
    sysctl -w kernel.numa_balancing=0
    1. 设置调度流水优化
    export TASK_QUEUE_ENABLE=2
    1. 绑核 安装绑核工具
     apt-get update
     apt-get install numactl

    查询卡的NUMA node

     lspci -vs bus-id

    bus-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,推荐绑定其中单核以获得更好的性能。

    1. 执行推理脚本。 执行命令
    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
  7. 精度验证

    由于生成的图片存在随机性,提供两种精度验证方法:

    1. CLIP-score(文图匹配度量):评估图片和输入文本的相关性,分数的取值范围为[-1, 1],越高越好。使用Parti数据集进行验证。
    2. HPSv2(图片美学度量):评估生成图片的人类偏好评分,分数的取值范围为[0, 1],越高越好。使用HPSv2数据集进行验证

    注意,由于要生成的图片数量较多,进行完整的精度验证需要耗费很长的时间。

    1. 下载Parti数据集

      wget https://raw.githubusercontent.com/google-research/parti/main/PartiPrompts.tsv --no-check-certificate
    2. 下载模型权重

      # 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权重放到当前路径

    3. 使用推理脚本读取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

      参数说明:

      • --path:模型权重路径。
      • --height: 生成图片的高
      • --width: 生成图片的宽
      • --num_images_per_prompt: 每个prompt生成的图片数量。注意使用hpsv2时,设置num_images_per_prompt=1即可。
      • --device_id:推理设备ID。
      • --cache_method: cache策略选择,默认为空,代表不开启cache,支持配置"static_cache"和"agb_cache","abg_cache"性能更好,但会引入更大的内存占用,当前"agb_cache"只支持50步迭代场景。
      • --prompt_file:提示词文件。
      • --prompt_file_type: prompt文件类型,用于指定读取方式,可选plain,parti,hpsv2

      运行完成后的结果会保存到以运行时间戳命名的文件夹下,文件夹下包含结果'image_info.json'文件以及保存的图片文件夹。

    4. 计算精度指标

      1. 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: 上一步生成的image_info.json文件。
        • --model_name: Clip模型名称。
        • --model_weights_path: Clip模型权重文件路径。

        执行完成后会在屏幕打印出精度计算结果。

      2. 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: 上一步生成的image_info.json文件。
        • --HPSv2_checkpoint: HPSv2模型权重文件路径。
        • --clip_checkpointh: Clip模型权重文件路径。

        执行完成后会在屏幕打印出精度计算结果。

  8. 多实例模型模型推理

    多实例推理主要用于多请求场景,使用多个实例同时推理来提高吞吐。在多实例推理中,可以通过显存共享技术将多个实例间的权重显存共享,从而实现降低显存消耗。

    1. 共享内存安装准备(推荐开启显存共享)
    cd stable_diffusion_xl/share_memory
    cmake .
    make -j
    cd ../../
    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
    
    双实例权重显存共享推理
    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

声明

  • 本代码仓提到的数据集和模型仅作为示例,这些数据集和模型仅供您用于非商业目的,如您使用这些数据集和模型来完成示例,请您特别注意应遵守对应数据集和模型的License,如您因使用数据集或模型而产生侵权纠纷,华为不承担任何责任。
  • 如您在使用本代码仓的过程中,发现任何问题(包括但不限于功能问题、合规问题),请在本代码仓提交issue,我们将及时审视并解答。