文档首页/ AI开发平台ModelArts/ 最佳实践/ AIGC模型训练推理/ SD1.5&SDXL Diffusers框架基于DevServer适配PyTorch NPU推理指导(6.3.908)
更新时间:2024-11-12 GMT+08:00
分享

SD1.5&SDXL Diffusers框架基于DevServer适配PyTorch NPU推理指导(6.3.908)

本文档主要介绍如何在ModelArts Lite的DevServer环境中部署Stable Diffusion模型对应SD1.5和SDXL的Diffusers框架,使用NPU卡进行推理。

方案概览

本方案介绍了在ModelArts的DevServer上使用昇腾计算资源部署Diffusers框架用于推理的详细过程。完成本方案的部署,需要先联系您所在企业的华为方技术支持购买DevServer资源。

本方案目前仅适用于企业客户。

资源规格要求

推理部署推荐使用“西南-贵阳一”Region上的DevServer资源和Ascend Snt9B单机单卡。

约束与限制

  • 支持Diffusers 0.29.2及以前版本。
  • Cann版本支持cann_8.0.rc3。
  • PyTorch版本支持2.1。

获取软件和镜像

表1 获取软件和镜像

分类

名称

获取路径

插件代码包

AscendCloud-6.3.908软件包中的AscendCloud-AIGC-6.3.908-xxx.zip

文件名中的xxx表示具体的时间戳,以包名发布的实际时间为准。

获取路径:Support-E

说明:

如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。

基础镜像

西南-贵阳一:

swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc3-py_3.9-hce_2.0.2312-aarch64-snt9b-20240824153350-cebb080

从SWR拉取。

步骤一 准备环境

  1. 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。

    购买DevServer资源时如果无可选资源规格,需要联系华为云技术支持申请开通。

    当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据

  2. 检查环境。
    1. SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。
      npu-smi info

      如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。

    2. 检查docker是否安装。
      docker -v   #检查docker是否安装

      如尚未安装,运行以下命令安装docker。

      yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
    3. 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。
      sysctl -p | grep net.ipv4.ip_forward
      如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。
      sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf 
      sysctl -p | grep net.ipv4.ip_forward
  3. 获取基础镜像。建议使用官方提供的镜像部署推理服务。镜像地址{image_url}参见表1
    docker pull {image_url}
  4. 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。
    docker run -itd \
    --name sdxl-diffusers \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    -p 8443:8443 \
    -v /etc/localtime:/etc/localtime \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    --shm-size 60g \
    --device=/dev/davinci_manager \
    --device=/dev/hisi_hdc \
    --device=/dev/devmm_svm \
    --device=/dev/davinci3 \
    --network=bridge \
    ${image_name} bash

    参数说明:

    • --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如sdxl-diffusers。
    • --device=/dev/davinci3:挂载主机的/dev/davinci3到容器的/dev/davinci3。可以使用npu-smi info查看空闲卡号,修改davinci后数字可以更改挂载卡。
    • ${image_name} 代表 ${image_name}。
  5. 进入容器。需要将${container_name}替换为实际的容器名称,例如:sdxl-diffusers。
    docker exec -it ${container_name} bash

步骤二 安装依赖和模型包

  1. 安装Diffusers相关依赖。
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple diffusers bottle invisible_watermark transformers accelerate safetensors
  2. 获取SDXL模型包到/home/ma-user目录下。
    export HF_ENDPOINT=https://hf-mirror.com
    huggingface-cli download --resume-download stabilityai/stable-diffusion-xl-base-1.0 --local-dir stable-diffusion-xl-base-1.0
  3. 安装插件代码包。
    将获取到的插件代码包AscendCloud-AIGC-6.3.908-xxx.zip文件上传到容器的/home/ma-user目录下,并解压。
    cd /home/ma-user
    unzip AscendCloud-AIGC-6.3.908-*.zip #解压

步骤三 运行并验证SDXL模型

  1. 首先在容器中运行命令。
    source /usr/local/Ascend/ascend-toolkit/set_env.sh
  2. 进入/home/ma-user/AscendCloud-AIGC-6.3.908-xxx/aigc_inference/torch_npu/diffusers/0_21_2/ascend_diffusers,查看README.md文件,根据README.md文件里的指引启动单卡推理脚本。
    cd /home/ma-user/AscendCloud-AIGC-6.3.908-xxx/aigc_inference/torch_npu/diffusers/0_21_2/ascend_diffusers
    cat README.md
    python examples/sd_inference_example.py --sdxl --model_id stabilityai/stable-diffusion-xl-base-1.0 --prompt 'a dog' --num_inference_steps 50 --width 512 768 1024 --height 512 768 1024 --dynamo --dynamic

    会首先下载模型文件到/home/ma-user/.cache目录下,然后启动推理步骤。

    图1 启动脚本

    运行结束后,可以看到当前目录下生成了对应尺寸的图像。

    图2 推理生成的图像

步骤四 Diffusers使能多实例共享权重功能

  1. 进入AIGC插件解压路径,安装昇腾云torch插件。
    pip install AscendCloud-Pytorch-Plugin/ascendcloud_torch_plugin-2.1-cp39-cp39-linux_aarch64.whl # 请根据python版本安装对应的whl包
  2. 启动两个终端,并在每个终端均设置下述环境变量。
    export MASTER_ADDR=127.0.0.1
    export MASTER_PORT=29001
    export RANK=x    # x等于终端的编号,如开启2个终端,x在两个终端中依次设置为0,1
    export WORLD_SIZE=2 # WORLD_SIZE大小等于开启的实例个数
    export ENABLE_SHARE_MEMORY=1    # 开启共享显存功能
  3. 在两个终端分别执行以下命令,该脚本可以确保diffusers框架能够按序加载模型。
    cd aigc_inference/torch_npu/diffusers/0_21_2/ascend_diffusers/examples
    python modify_pipeline_to.py
  4. 在两个终端分别执行diffusers推理脚本,可参考如下脚本:
    # sdxl参考脚本
    from diffusers import DiffusionPipeline, AutoencoderKL
    import torch
    import torch_npu
    from torch_npu.contrib import transfer_to_npu
    import torch.distributed as dist
    import ascendcloud_torch_plugin # 昇腾云torch插件,需要放在加载torch_npu后面
    
    vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16) # sdxl场景需要用支持fp16的vae模型,否则可能出现黑图现象
    pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", vae=vae, torch_dtype=torch.float16, use_safetensors=True, variant="fp16")
    pipe.to("cuda")
    
    pipe.vae.config.force_upcast = False # 共享权重不支持在推理过程中改变权重dtype
    
    prompt = "An astronaut riding a green horse"
    
    image = pipe(prompt=prompt).images[0]
    rank = dist.get_rank()
    image.save(f"astronaut_rides_horse_{rank}.png")
  5. 观察两个实例的显存占用情况,若其中一个实例相比另外一个实例占用更少的显存,且少占用的显存大小等于权重的大小,表明多实例共享权重功能成功开启。
  6. 若不需要使用共享显存功能时,请通过以下命令关闭共享显存功能,避免无法正常运行非共享显存的推理场景。
    unset ENABLE_SHARE_MEMORY

相关文档