文档首页> AI开发平台ModelArts> 最佳实践> AIGC文生图> SD1.5基于DevServer适配MindSpore-Lite NPU推理指导(6.3.T041)
更新时间:2024-06-17 GMT+08:00
分享

SD1.5基于DevServer适配MindSpore-Lite NPU推理指导(6.3.T041)

方案概览

本文档的源码是基于Stable Diffusion 1.5图像生成模型的开源仓进行MindSpore-Lite适配,并在ModelArts DevServer上部署,支持文生图的NPU推理场景。本文档从模型部署的环境配置、模型转换、模型推理等方面进行介绍。

本方案目前仅适用于部分企业客户,完成本方案的部署,需要先联系您所在企业的华为方技术支持。

资源规格要求

推理部署推荐使用DevServer资源和Ascend Snt9B单机单卡。

表1 环境要求

名称

版本

显卡

Snt9B

CANN

8.0.RC1

Python

3.9

MindSpore Lite

2.3

获取软件和镜像

表2 获取软件和镜像

分类

名称

获取路径

插件代码包

ascendcloud-aigc-6.3.T041-*.tar.gz

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

Support网站

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

基础镜像Beta包

mindspore_2.3.0-cann_8.0.rc1-py_3.9-euler_2.10.7-aarch64-snt9b-20240422202644-39b975b.tar.partxx

Step1 准备环境

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

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

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

  2. 检查环境。
    1. SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。
      npu-smi info                    # 在每个实例节点上运行此命令可以看到NPU卡状态
      npu-smi info -l | grep Total    # 在每个实例节点上运行此命令可以看到总卡数

      如出现错误,可能是机器上的NPU设备没有正常安装,或者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. 获取基础镜像。建议使用官方提供的镜像部署推理服务。获取方式参见获取软件和镜像

    将获取到的基础镜像推到SWR上,再通过docker pull拉到容器中。

  4. 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。
    export work_dir="自定义挂载的工作目录"
    export container_work_dir="自定义挂载到容器内的工作目录"
    export container_name="自定义容器名称"
    export image_name="镜像名称或ID"
    // 启动一个容器去运行镜像
    docker run  -itd --net=host \
    --device=/dev/davinci7 \
    --device=/dev/davinci_manager \
    --device=/dev/devmm_svm \
    --device=/dev/hisi_hdc \
    --shm-size=32g \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    -v /var/log/npu/:/usr/slog \
    -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
    -v ${work_dir}:${container_work_dir} \
    --name ${container_name} \
    ${image_name} \
    /bin/bash

    参数说明:

    • -v ${work_dir}:${container_work_dir} 容器挂载宿主机目录,work_dir代表宿主机上的工作目录,container_work_dir代表挂载至容器中的工作目录,将解压后的代码放在宿主机工作目录下并挂载至容器内。
    • --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称。
    • image_name: 容器镜像的名称
    • --device=/dev/davinci7:7为卡号,具体使用哪张卡视情况而定,选择空闲卡号即可。卡是否空闲可在创建容器后进入容器执行npu-smi info命令查看。如果只希望映射单卡,加上--device=/dev/davinci+卡号编码即可,如--device=/dev/davinci0,本业务单卡即可运行。
  5. 进入容器。需要将${container_name}替换为实际的容器名称。
    docker exec -it ${container_name} bash

Step2 安装插件代码包

将获取到的SD1.5模型插件代码包ascendcloud-aigc-6.3.T041-*.tar.gz文件上传到容器的/home/ma-user/目录下并解压。获取路径参见获取软件和镜像
cd /home/ma-user/
tar -zxvf ascendcloud-aigc-6.3.T041-*.tar.gz  #解压
tar -zxvf ascendcloud-aigc-poc-stable-diffusion-v1-5mindspore_lite.tar.gz
rm -rf ascendcloud-aigc-6.3.T041-*

ascendcloud-aigc-6.3.T041-*.tar.gz后面的*表示时间戳,请按照实际替换。

Step3 下载原始模型包

从HuggingFace官网下载SD1.5模型包到本地,下载地址:https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/onnx

下载如下图所示4个目录的模型,并将其放在插件的对应目录中。

图1 下载SDXL模型包并解压

模型包目录结构如下,将下载后的模型按照如下目录上传到对应文件夹中。

/home/ma-user/sdv1-5_ms_code/onnx/   #插件包解压后的目录
|-  || safety_checker                #目录safety_checker需要手动创建
      |-- model.onnx    模型 
|-  || text_encoder                  #目录text_encoder需要手动创建
      |-- model.onnx    模型 
|-  || unet                          
      |-- config.ini    配置文件
      |-- model.onnx    模型
      |-- weights.pb    模型 
|-  || vae_decoder
      |-- config.ini   配置文件
      |-- model.onnx    模型 
|- - ******

unet和vae_decoder目录不需要创建,text_encoder和safety_checker目录需要手动创建,命令如下。

cd /home/ma-user/sdv1-5_ms_code/onnx
mkdir text_encoder safety_checker

Step4 模型转换

执行如下命令进行模型转换。如下脚本执行完后,会将4个模型都转换完成。
cd /home/ma-user/sdv1-5_ms_code
source /usr/local/Ascend/ascend-toolkit/set_env.sh
bash run_1_onnx_to_mindspore.sh

出现CONVERT RESULT SUCCESS:0即为转模型成功。

图2 转换成功

此处模型中默认图片大小为512*512,如果需要其他尺寸的图片大小,需要修改run_1_onnx_to_mindspore.sh后重新转换模型,具体请参见附录:模型转换样例参考

Step5 启动推理

修改run_3_txt2img_ms.py相关配置。

  1. 35行astronaut_512x512.png为生成图片的名字,可修改。
    图3 修改35行生成图片的名字
  2. 91行为占用卡号,可修改。
  3. 93-96行为模型路径,可修改。
    图4 修改占用卡号和模型路径
执行如下命令进行模型推理。
cd /home/ma-user/sdv1-5_ms_code
pip install pytorch_lightning diffusers==0.21.0 transformers
mkdir outputs
python run_3_txt2img_ms.py

也可通过在python run_txt2img_ms.py后加上相应参数进行测试,可选参数:

  • --prompt:"在这里写提示词,请用英文"
  • --num_inference_steps:unet模型执行步数,默认20
  • --height:图片高,默认为512
  • --width:图片宽,默认512

推理结束后,可以在outputs目录看到结果图片文件。

图5 结果图片文件

附录:模型转换样例参考

cd ***/onnx/unet source /usr/local/Ascend/ascend-toolkit/set_env.sh && converter_lite --modelFile=./model.onnx --outputFile=./unet_test --fmk=ONNX --saveType=MINDIR --optimize=ascend_oriented --inputShape="sample:2,4,64,64;timestep:1;encoder_hidden_states:2,77,768"

onnx模型本身是动态的,这里以图片尺寸为512*512时,unet的输入shape为例。

更多模型转换的详细信息可以参考MindSpore Lite的官方文档:https://www.mindspore.cn/lite/docs/zh-CN/r2.3.0rc1/use/cloud_infer/converter_tool.html

分享:

    相关文档

    相关产品