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

SDXL Diffusers框架基于DevServer适配PyTorch NPU推理指导(6.3.902)

本文档主要介绍如何在ModelArts Lite的DevServer环境中部署Stable Diffusion的Diffusers框架,使用NPU卡进行推理。

方案概览

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

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

资源规格要求

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

获取软件

获取插件代码包ascendcloud-aigc-6.3.902-*.tar.gz文件。获取路径:Support网站

如果没有软件下载权限,请联系您所在企业的华为方技术支持下载获取。

ascendcloud-aigc-6.3.902-*.tar.gz文件名中的*表示具体的时间戳,以包名的实际时间为准。

Step1 准备环境

  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}为:

    西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_7.0.0-py_3.9-hce_2.0.2312-aarch64-snt9b-20240312154948-219655b

    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 ${conta iner_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

Step2 安装依赖和模型包

  1. 安装Diffusers相关依赖。
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple diffusers bottle invisible_watermark transformers accelerate safetensors
  2. 获取SDXL模型包并解压到/home/ma-user目录下。提供2种模型包下载方式。
    • 模型包直接下载(如果不能访问HuggingFace官网,推荐此方式)
      下载到容器/home/ma-user目录下后,解压。
      cd  /home/ma-user/ 
      wget https://llm-mindspore.obs.cn-southwest-2.myhuaweicloud.com/ascend-poc/stable-diffusion-xl-model.tar.gz
      tar -zxvf stable-diffusion-xl-model.tar.gz 
      rm -rf stable-diffusion-xl-model.tar.gz
    • 也可以从HuggingFace官网下载到本地后,通过docker cp命令复制到容器中/home/ma-user目录下,如下图所示。

      在线下载地址:

      https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main

      https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/tree/main

      由于本实例采用的都是FP16的模型,相应模型建议都只下载FP16的,节约下载和传送时间。

      图1 下载SDXL模型包并解压
  3. 获取controlnet模型包并解压到/home/ma-user目录下。提供2种模型包下载方式。
    • 模型包直接下载(如果不能访问HuggingFace官网,推荐此方式)
      下载到容器/home/ma-user目录下后,解压。
      cd  /home/ma-user/ 
      wget https://llm-mindspore.obs.cn-southwest-2.myhuaweicloud.com/ascend-poc/controlnet_canny.zip
      unzip controlnet_canny.zip
    • 也可以从HuggingFace官网下载到本地后,通过docker cp命令复制到容器中/home/ma-user目录下。

      在线下载地址:https://huggingface.co/diffusers/controlnet-canny-sdxl-1.0/tree/main

      图2 下载controlnet模型包并解压
  4. 安装插件代码包。
    1. 将获取到的插件代码包ascendcloud-aigc-6.3.902-*.tar.gz文件上传到容器的/home/ma-user/temp目录下。获取路径:Support网站
    2. 解压插件代码包ascendcloud-aigc-6.3.902-*到/home/ma-user/temp目录下。
      cd /home/ma-user/temp
      tar -zxvf ascendcloud-aigc-6.3.902-20240205145924.tar.gz  #解压
    3. 将获取到的ascendcloud-aigc-extensions-diffusers.tar.gz包复制到/home/ma-user下后解压。
      docker cp ascendcloud-aigc-extensions-diffusers.tar.gz sdxl-diffusers:/home/ma-user/
      tar -zxvf ascendcloud-aigc-extensions-diffusers.tar.gz

Step3 运行并验证SDXL模型

  1. 首先在容器中运行命令。
    source /usr/local/Ascend/ascend-toolkit/set_env.sh
  2. 在/home/ma-user目录下已经存在infer_server.py脚本文件,启动infer_server.py命令如下。
    python infer_server.py
    图3 启动脚本
  3. 在宿主机上另外打开一个终端,使用curl命令发送请求。完整的请求参数请参考表1
    curl -kv -X POST localhost:8443/ -H "Content-Type: application/json" -d '{"prompt":"ultrarealistic shot of a furry blue bird"}'
    服务端打印如下信息,表示发送请求成功。
    图4 发送请求

    客户端返回图像的base64编码。

    图5 图像的base64编码
  4. 将客户端返回的base64编码转换为图片。
    from PIL import Image 
    from io import BytesIO 
    import base64  
    
    def base64_to_image(base64_str):
        image = base64.b64decode(base64_str, altchars=None, validate=False)
        image = BytesIO(image)
        image = Image.open(image)
        image.save(“./out_put_image.png”)

Step4 运行并验证带controlnet的模型

  1. 首先下载一个默认输入文件。

    https://huggingface.co/lllyasviel/sd-controlnet-canny/blob/main/images/bird_canny.png

  2. 文件下载后重命名为canny_input_bird.png,然后复制到容器/home/ma-user目录下,在宿主机上的执行命令如下。
    mv bird_canny.png canny_input_bird.png 
    chmod 777 canny_input_bird.png 
    docker cp canny_input_bird.png sdxl-diffusers:/home/ma-user/
  3. 在/home/ma-user目录下已经存在infer_server_with_controlnet.py脚本文件,运行带controlnet的sdxl,运行命令如下。
    python infer_server_with_controlnet.py
  4. 在宿主机上另外打开一个终端,使用curl命令发送请求。完整的请求参数请参考表1
    curl -kv -X POST localhost:8443/ -H "Content-Type: application/json" -d '{"prompt":"ultrarealistic shot of a furry blue bird"}'

    服务端打印如下信息,表示发送请求成功。

    带controlnet时,可以读取本地图片得到输入参数。

    from diffusers.utils import load_image 
    from io import BytesIO 
    import base64  
    
    def image_to_base64(img_path):
        image = load_image(img_path)
        buffered = BytesIO()
        image.save(buffered, format="PNG")
        return base64.b64encode(buffered.getvalue())

附录1:请求参数表

使用curl命令发送请求的请求参数表如下。

表1 请求参数列表

参数

说明

prompt

正向文本,必选

negative_prompt

负向文本,非必选

height

图像高度,非必选

width

图像宽度,非必选

num_inference_steps

对图片进行噪声优化的次数,非必选

denoising_end

二阶段去噪,非必选

refiner_switch

refiner模型开关,是否开启refiner,非必选

seed

添加噪音的随机数种子,非必选

image_path

带controlnet时需要,此时image_path需要赋值null,传入图片的base64编码值,非必选

image_base64

带controlnet时需要,和image_path二选一,传入图片的base64编码值,非必选

附录2:Dockerfile

基于Dockerfile可以方便的构建完整可运行的自定义镜像,在宿主机创建一个空的目录,然后vi Dockerfile将上面内容复制进去,然后参考4在创建目录中下载华为插件代码包后,执行如下docker构建命令。

docker build -t sdxl-diffusers:0.0.1 .

Dockerfile文件内容如下。

FROM swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_7.0.0-py_3.9-hce_2.0.2312-aarch64-snt9b-20240312154948-219655b
  
RUN wget https://llm-mindspore.obs.cn-southwest-2.myhuaweicloud.com/ascend-poc/stable-diffusion-xl-model.tar.gz && \
tar -zxvf stable-diffusion-xl-model.tar.gz && \
rm -rf stable-diffusion-xl-model.tar.gz
  
RUN wget https://llm-mindspore.obs.cn-southwest-2.myhuaweicloud.com/ascend-poc/controlnet_canny.zip && \
unzip controlnet_canny.zip &&\
rm -rf controlnet_canny.zip
  
RUN mkdir /home/ma-user/temp 
COPY --chown=ma-user:ma-group ascendcloud-aigc-6.3.902-20240205145924.tar.gz /home/ma-user/temp/
  
RUN cd /home/ma-user/temp &&\
tar -zxvf ascendcloud-aigc-6.3.902-20240205145924.tar.gz &&\
cp ascendcloud-aigc-extensions-diffusers.tar.gz /home/ma-user &&\
cd /home/ma-user && tar -zxvf ascendcloud-aigc-extensions-diffusers.tar.gz &&\
rm -rf /home/ma-user/temp && rm -rf ascendcloud-aigc-extensions-diffusers.tar.gz
  
RUN pip install diffusers bottle invisible_watermark transformers accelerate safetensors
  
CMD source /usr/local/Ascend/ascend-toolkit/set_env.sh && python /home/ma-user/infer_server.py

相关文档