体验Python极简推理Demo

概述

本教程提供了MindSpore Lite执行推理的示例程序,通过文件输入、执行推理、打印推理结果的方式,演示了Python接口进行端侧推理的基本流程,用户能够快速了解MindSpore Lite执行推理相关API的使用。相关代码放置在mindspore/lite/examples/quick_start_python目录。

下面以Ubuntu 18.04为例,介绍了在Linux X86操作系统配合CPU硬件平台下如何使用Python极简推理Demo:

  • 一键安装推理相关模型文件、MindSpore Lite及其所需的依赖,详情参见一键安装小节。

  • 执行Python极简推理Demo,详情参见执行Demo小节。

  • Python极简推理Demo内容说明,详情参见Demo内容说明小节。

一键安装

本环节以全新的Ubuntu 18.04为例,介绍在CPU环境的Linux-x86_64系统上,通过pip安装Python3.7版本的MindSpore Lite。

进入到mindspore/lite/examples/quick_start_python目录下,以安装1.9.0版本的MindSpore Lite为例,执行lite-cpu-pip.sh脚本进行一键式安装。安装脚本会下载推理所需的模型和输入数据文件、安装MindSpore_Lite所需的依赖,以及下载并安装MindSpore Lite。

注:此命令可设置安装的MindSpore Lite版本,由于从MindSpore Lite 1.8.0版本开始支持Python接口,因此版本不能设置低于1.8.0,可设置的版本详情参见下载MindSpore Lite提供的版本。

MINDSPORE_LITE_VERSION=1.9.0 bash ./lite-cpu-pip.sh

若MobileNetV2模型下载失败,请手动下载相关模型文件mobilenetv2.ms,并将其拷贝到mindspore/lite/examples/quick_start_python/model目录。

若input.bin输入数据文件下载失败,请手动下载相关输入数据文件input.bin,并将其拷贝到mindspore/lite/examples/quick_start_python/model目录。

若使用脚本下载MindSpore Lite推理框架失败,请手动下载对应硬件平台为CPU、操作系统为Linux-x86_64或Linux-aarch64的MindSpore Lite 模型推理框架,用户可以使用uname -m命令在终端上查询操作系统,并将其拷贝到mindspore/lite/examples/quick_start_python目录下。

若需要使用Python3.7以上版本对应的MindSpore Lite,请在本地编译,注意Python API模块编译依赖:Python >= 3.7.0、NumPy >= 1.17.0、wheel >= 0.32.0。编译成功后,将output/目录下生成的Whl安装包拷贝到mindspore/lite/examples/quick_start_python目录下。

mindspore/lite/examples/quick_start_python目录下不存在MindSpore Lite安装包,则一键安装脚本将会卸载当前已安装的MindSpore Lite后,从华为镜像下载并安装MindSpore Lite。否则,若目录下存在MindSpore Lite安装包,则会优先安装该安装包。

通过手动下载并且将文件放到指定位置后,需要再次执行lite-cpu-pip.sh脚本才能完成一键安装。

执行成功将会显示如下结果,模型文件和输入数据文件可在mindspore/lite/examples/quick_start_python/model目录下找到。

Successfully installed mindspore-lite-1.9.0

执行Demo

一键安装后,进入mindspore/lite/examples/quick_start_python目录,并执行以下命令,体验MindSpore Lite推理MobileNetV2模型。

python quick_start_python.py

执行完成后将能得到如下结果,打印输出Tensor的名称、输出Tensor的数据大小,输出Tensor的元素数量以及前50个数据。

tensor name is:Softmax-65 tensor size is:4004 tensor elements num is:1001
output data is: 1.02271215e-05 9.92699e-06 1.6968432e-05 6.8573616e-05 9.731416e-05 0.0011149431 0.00020790889 0.0010379024 8.951246e-06 3.5114933e-06 4.233835e-06 2.8036434e-06 2.6037442e-06 1.8385846e-06 1.1539755e-05 8.275104e-05 9.712361e-06 1.1271673e-05 4.0994237e-06 2.0738518e-05 2.3865257e-06 6.13505e-06 2.2388376e-06 3.8502785e-06 6.7741335e-06 8.045284e-06 7.4303607e-06 3.081847e-06 1.6161586e-05 3.8332796e-06 1.6814663e-05 1.7688351e-05 6.5563186e-06 1.2908386e-06 2.292212e-05 0.00028948952 4.608292e-06 7.4074756e-06 5.352228e-06 1.2963507e-06 3.3694944e-06 6.408071e-06 3.6104643e-06 5.094248e-06 3.1630923e-06 6.4333294e-06 3.2282237e-06 2.03353e-05 2.1681694e-06 4.8566693e-05

Demo内容说明

使用MindSpore Lite执行推理主要包括以下步骤:

  1. 创建配置上下文:创建配置上下文Context,保存需要的一些基本配置参数,用于指导模型编译和模型推理。

  2. 模型加载与编译:执行推理之前,需要调用Modelbuild_from_file接口进行模型加载和模型编译,并将上一步得到的Context配置到Model中。模型加载阶段将文件缓存解析成运行时的模型。模型编译阶段主要进行算子选型调度、子图切分等过程,该阶段会耗费较多时间,所以建议Model加载一次,编译一次,多次推理。

  3. 输入数据:模型执行推理之前需要向输入Tensor中填充数据。

  4. 执行推理:使用Modelpredict接口进行模型推理。

  5. 获得输出:模型执行推理结束之后,可以通过输出Tensor得到推理结果。

更多Python接口的高级用法与示例,请参考Python API

img

创建配置上下文

创建配置上下文Context。由于本教程演示的是在CPU设备上执行推理的场景,因此需要将创建的CPU设备硬件信息加入上下文。

import numpy as np
import mindspore_lite as mslite


# init context, and add CPU device info
cpu_device_info = mslite.CPUDeviceInfo(enable_fp16=False)
context = mslite.Context(thread_num=1, thread_affinity_mode=2)
context.append_device_info(cpu_device_info)

如果用户需要在Ascend设备上运行推理时,需要添加Ascend设备硬件信息。

在Ascend设备上运行推理时,在原始模型的输入format与转换生成的模型的输入format不一致的场景时,除了添加Ascend设备硬件信息外,用户可以选择在调用上下文之前添加CPU设备硬件信息。因为在这种情况下,在Ascend设备上转换生成的模型中将包含Transpose算子,该算子目前需要在CPU上执行推理,因此需要切换至带有CPU设备硬件信息的上下文中。

import numpy as np
import mindspore_lite as mslite


# init context, and add Ascend device info and CPU device info
ascend_device_info = mslite.AscendDeviceInfo(device_id=0)
cpu_device_info = mslite.CPUDeviceInfo(enable_fp16=False)
context = mslite.Context(thread_num=1, thread_affinity_mode=2)
context.append_device_info(ascend_device_info)
context.append_device_info(cpu_device_info)

模型加载与编译

模型加载与编译可以调用Modelbuild_from_file接口,直接从文件缓存加载、编译得到运行时的模型。

# build model from file
MODEL_PATH = "./model/mobilenetv2.ms"
IN_DATA_PATH = "./model/input.bin"
model = mslite.Model()
model.build_from_file(MODEL_PATH, mslite.ModelType.MINDIR_LITE, context)

输入数据

本教程设置输入数据的方式是从文件导入。其他设置输入数据的方式,请参考Modelpredict接口。

# set model input
inputs = model.get_inputs()
in_data = np.fromfile(IN_DATA_PATH, dtype=np.float32)
inputs[0].set_data_from_numpy(in_data)

执行推理

调用Modelpredict接口执行推理,推理结果输出给output

# execute inference
outputs = model.get_outputs()
model.predict(inputs, outputs)

获得输出

打印执行推理后的输出结果。遍历outputs列表,打印每个输出Tensor的名字、数据大小、元素数量、以及前50个数据。

# get output
for output in outputs:
  tensor_name = output.get_tensor_name().rstrip()
  data_size = output.get_data_size()
  element_num = output.get_element_num()
  print("tensor name is:%s tensor size is:%s tensor elements num is:%s" % (tensor_name, data_size, element_num))
  data = output.get_data_to_numpy()
  data = data.flatten()
  print("output data is:", end=" ")
  for i in range(50):
    print(data[i], end=" ")
  print("")