SD1.5基于DevServer适配MindSpore-Lite NPU推理指导(6.3.T041)
方案概览
本文档的源码是基于Stable Diffusion 1.5图像生成模型的开源仓进行MindSpore-Lite适配,并在ModelArts DevServer上部署,支持文生图的NPU推理场景。本文档从模型部署的环境配置、模型转换、模型推理等方面进行介绍。
本方案目前仅适用于部分企业客户,完成本方案的部署,需要先联系您所在企业的华为方技术支持。
资源规格要求
推理部署推荐使用DevServer资源和Ascend Snt9B单机单卡。
名称 |
版本 |
---|---|
显卡 |
Snt9B |
CANN |
8.0.RC1 |
Python |
3.9 |
MindSpore Lite |
2.3 |
获取软件和镜像
分类 |
名称 |
获取路径 |
---|---|---|
插件代码包 |
ascendcloud-aigc-6.3.T041-*.tar.gz 文件名中的*表示具体的时间戳,以包名的实际时间为准。 |
如果没有软件下载权限,请联系您所在企业的华为方技术支持下载获取。 |
基础镜像Beta包 |
mindspore_2.3.0-cann_8.0.rc1-py_3.9-euler_2.10.7-aarch64-snt9b-20240422202644-39b975b.tar.partxx |
Step1 准备环境
- 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。
购买DevServer资源时如果无可选资源规格,需要联系华为云技术支持申请开通。
当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。
- 检查环境。
- SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。
npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数
如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装NPU设备和驱动,或释放被挂载的NPU。
- 检查docker是否安装。
docker -v #检查docker是否安装
如尚未安装,运行以下命令安装docker。
yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
- 配置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
- SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。
- 获取基础镜像。建议使用官方提供的镜像部署推理服务。获取方式参见获取软件和镜像。
将获取到的基础镜像推到SWR上,再通过docker pull拉到容器中。
- 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。
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,本业务单卡即可运行。
- 进入容器。需要将${container_name}替换为实际的容器名称。
docker exec -it ${container_name} bash
Step2 安装插件代码包
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-*
![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
ascendcloud-aigc-6.3.T041-*.tar.gz后面的*表示时间戳,请按照实际替换。
Step3 下载原始模型包
从HuggingFace官网下载SD1.5模型包到本地,下载地址:https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/onnx。
下载如下图所示4个目录的模型,并将其放在插件的对应目录中。
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000001864828510.png)
模型包目录结构如下,将下载后的模型按照如下目录上传到对应文件夹中。
/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 模型转换
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即为转模型成功。
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000001910821285.png)
此处模型中默认图片大小为512*512,如果需要其他尺寸的图片大小,需要修改run_1_onnx_to_mindspore.sh后重新转换模型,具体请参见附录:模型转换样例参考。
Step5 启动推理
修改run_3_txt2img_ms.py相关配置。
- 35行astronaut_512x512.png为生成图片的名字,可修改。
图3 修改35行生成图片的名字
- 91行为占用卡号,可修改。
- 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目录看到结果图片文件。
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000001864874856.png)
附录:模型转换样例参考
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