MindX SDK提供昇腾AI处理器加速的各类AI软件开发套件(SDK),提供极简易用的API,加速AI应用的开发。
应用开发旨在使用华为提供的SDK和应用案例快速开发并部署人工智能应用,是基于现有模型、使用pyACL提供的Python语言API库开发深度神经网络应用,用于实现目标识别、图像分类等功能。
通过MindStudio实现SDK应用开发分为基础开发与深入开发,通常情况下用户关注基础开发即可,基础开发主要包含如何通过现有的插件构建业务流并实现业务数据对接,采用模块化的设计理念,将业务流程中的各个功能单元封装成独立的插件,通过插件的串接快速构建推理业务。
图1 MindX SDK总体结构
mxManufacture & mxVision关键特性:
• 配置文件快速构建AI推理业务。
• 插件化开发模式,将整个推理流程“插件化”,每个插件提供一种功能,通过组装不同的插件,灵活适配推理业务流程。
• 提供丰富的插件库,用户可根据业务需求组合Jpeg解码、抠图、缩放、模型推理、数据序列化等插件。
• 基于Ascend Computing Language(ACL),提供常用功能的高级API,如模型推理、解码、预处理等,简化Ascend芯片应用开发。
• 支持自定义插件开发,用户可快速地将自己的业务逻辑封装成插件,打造自己的应用插件。
MindStudio可以单独安装在Windows上。在安装MindStudio前需要在Linux服务器上安装部署好Ascend-cann-toolkit开发套件包,之后在Windows上安装MindStudio,安装完成后通过配置远程连接的方式建立MindStudio所在的Windows服务器与Ascend-cann-toolkit开发套件包所在的Linux服务器的连接,实现全流程开发功能。具体安装流程可以参考Windows安装MindStudio ,MindStudio环境搭建指导视频 。
图1 开发运行场景(共部署形态)
步骤1 Windows场景下基于MindStuido的SDK应用开发,请先确保远端环境上MindX SDK软件包已安装完成,安装方式请参见《mxManufacture 用户指南》 和《mxVision 用户指南》 的“使用命令行方式开发”>“安装MindX SDK开发套件”章节。
步骤2 在Windows本地进入工程创建页面,工具栏点击File > Settings > Appearance & Behavior > System Settings > MindX SDK进入MindX SDK管理界面。界面中MindX SDK Location为软件包的默认安装路径,默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。单击Install SDK进入Installation settings界面,如图2。
• Remote Connection:远程连接的用户及IP。
• Remote CANN Location:远端环境上CANN开发套件包的路径,请配置到版本号一级。
• Remote SDK Location:远端环境上SDK的路径,请配置到版本号一级。IDE将同步该层级下的include、opensource、python、samples文件夹到本地Windows环境,层级选择错误将导致安装失败。
• Local SDK Location:同步远端环境上SDK文件夹到本地的路径。默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。
图2 Installation settings
步骤3 单击OK结束,返回SDK管理界面,可查看安装后的SDK的信息,如图3所示,可单击OK结束安装流程。
图3 安装完成后的MindX SDK管理界面
典型推理业务流程如图1所示,先通过目标检测获取目标坐标,然后通过图像分类识别目标属性。流程中有两次图像缩放的操作,两者主要区别在于设置的缩放宽高参数不同。
图1 典型推理业务流程
使用MindStudio开发和运行推理业务步骤如图 2 所示。其中插件开发和后处理模块开发输入为SDK高级特性,用户可以视情况选择。
图2 推理业务开发与运行流程
步骤1 确定业务流程:
根据业务功能如目标检测、图像分类、属性识别等,将业务流程进行模块化。
步骤2 寻找合适插件:
首先根据已有SDK插件的功能描述和规格限制来匹配业务功能,如图3所示。当SDK提供的插件无法满足功能需求时,用户可以开发自定义插件。请参见插件开发 、准备文档 中《mxManufacture 用户指南》 或《mxVision 用户指南》 的“已有插件介绍”与“插件开发介绍”章节。
图3 业务流程匹配插件
步骤3 准备推理模型文件与数据:
详见本文档8、准备输入图片和下载模型 ,9、模型转换功能介绍,相关按钮菜单功能和操作步骤讲解 。
步骤4 流程编排:
详见本文档4、可视化流程编排介绍 。
步骤5 业务集成:
编写C++程序或Python程序,调用业务流管理的API(MxStreamManager),先进行初始化,再加载业务流配置文件(*.pipeline),然后根据stream配置文件中的StreamName往指定Stream获取输出数据,最后销毁Stream。
可用API请参见《mxManufacture 用户指南》 或《mxVision 用户指南》 的“API参考(C++)”章节与“API参考(Python)”章节。
步骤6 编译与运行应用:
详见本文档10、编译基本概念介绍和MindStudio 编译相关按钮菜单功能和操作步骤讲解 ,11、运行基本概念介绍和MindStudio 运行相关按钮菜单功能和操作步骤讲解 。
通过stream(业务流)配置文件,Stream manager(业务流管理模块)可识别需要构建的element(功能元件)以及element之间的连接关系,并启动业务流程。Stream manager对外提供接口,用于向stream发送数据和获取结果,帮助用户实现业务对接。
Plugin(功能插件)表示业务流程中的基础模块,通过element的串接构建成一个stream。Buffer(插件缓存)用于内部挂载解码前后的视频、图像数据,是element之间传递的数据结构,同时也允许用户挂载Metadata(插件元数据),用于存放结构化数据(如目标检测结果)或过程数据(如缩放后的图像)。
图1 SDK业务流程相关基础单元
MindX SDK实现功能的最小粒度是插件,每一个插件实现特定的功能,如图片解码、图片缩放等。流程编排是将这些插件按照合理的顺序编排,实现负责的功能。可视化流程编排是以可视化的方式,开发数据流图,生成pipeline文件供应用框架使用。图 2 为推理业务流Stream配置文件pipeline样例。配置文件以json格式编写,用户必须指定业务流名称、元件名称和插件名称,并根据需要,补充元件属性和下游元件名称信息。
步骤1 进入工程创建页面,用户可通过以下方式开始流程编排。在顶部菜单栏中选择Ascend>MindX SDK Pipeline,打开空白的pipeline绘制界面绘制,也可打开用户自行绘制好的pipeline文件,如图3。
绘制界面分为左侧插件库、中间编辑区、右侧插件属性展示区,具体参考pipeline绘制 。
步骤2 在左侧编辑框选择插件,拖动至中间编辑框,按照用户的业务流程进行连接。如果拖动错误插件或者错误连线,选中错误插件或者错误连线单击键盘Del键删除。用户自定义的流水线绘制完成后,选中流水线中的所有插件,右键选择Set Stream Name设置Stream名称,如果有多条流水线则需要对每一条流水线设置Stream名称。绘制完成单击Save保存。
图2 Detection and Classification配置pipeline样例
图3 pipeline绘制界面
目标检测和分类是推理应用开发中常见的功能,用户通过调用API,向推理业务发送图像或视频,等待推理服务返回目标的坐标(目标检测插件输出)和图像分类结果。用于展示结果的图形界面,需要用户自行开发。
图1 Detection and Classification推理业务
图2 Detection and Classification
步骤1 进入工程创建页面。
首次登录MindStudio:单击New Project。
非首次登录MindStudio:在顶部菜单栏中选择File > New > Project...。
步骤2 在New Project窗口中,选择Ascend App,按图1配置工程。
图1 创建工程配置
点击Install后,远端CANN安装配置如图2所示,
图2 远端CANN配置
SSH连接配置如图3所示,配置好后点击Test Connection,出现 ”Sucessfully connected!“即配置成功。
图3 SSH连接配置
步骤3 单击Next,在New Project窗口中,选择工程类型。单击Finish,完成工程创建。如图4。若工程类型名称显示不全,鼠标悬停于工程类型名称处,则工程类型名称可以完整显示。
首次登录MindStudio:在MindStudio欢迎界面中单击“Open”,选择需要导入的工程,单击“OK”确认导入。
进入工程创建页面,在顶部菜单栏中选择File > Open...,选择现有工程打开。
成功导入工程后,工程目录以树状呈现,请以实际创建结果为准。
图4 基于MindX SDK开发的应用工程
以下两项为MindX SDK空白工程,仅包括开发框架的工程,不含具体的代码逻辑
• MindX SDK Project(C/C++):
├── 工程名
├── build //存放cmake依赖文件
│ └── cmake
├── CMakeLists.txt //编译脚本,调用src目录下的CMakeLists文件
├── config
│ ├── logging.conf //日志配置文件
│ └── sdk.conf
├── out //存放编译出的可执行文件
│ └── config
└── src
├── CMakeLists.txt //编译脚本
└── main.cpp //主函数的实现文件,当前主函数内无代码逻辑
• MindX SDK Project(Python):
├── 工程名
├── models //存放模型相关文件
│ ├── bert
│ ├── fasterrcnn
│ ├── resnet50
│ └── yolov3
├── pipeline //存放pipeline文件
│ ├── BertMultiPorts.pipeline
│ ├── FasterRcnn.pipeline
│ ├── Sample.pipeline
│ ├── SamplePlugin.pipeline
│ ├── SplitterNms.pipeline
│ └── VideoObjectDetection.pipeline
└── python //存放Python脚本文件
├── main.py
├── main_tensorinfer.py
├── README.md
└── run.sh
以下两项为MindX SDK样例工程,基于MindX SDK开发的模板工程
• Detection and Classification(C++):
├── 工程名
├── build //存放cmake依赖文件
├── C++ //存放cmake依赖文件
│ ├── bert_input
│ ├── CMakeLists.txt //实际的编译脚本文件
│ ├── main.cpp //样例入口
│ ├── main_tensorinfer.cpp
│ ├── README.md //样例代码说明
│ └── run.sh
├── models //存放模型相关文件
│ ├── bert //此样例中未用到
│ ├── fasterrcnn //此样例中未用到
│ ├── resnet50
│ └── yolov3
└── pipeline //存放pipeline文件
│ ├── BertMultiPorts.pipeline
│ ├── FasterRcnn.pipeline
│ ├── Sample.pipeline
│ ├── SamplePlugin.pipeline
│ ├── SplitterNms.pipeline
│ └── VideoObjectDetection.pipeline
└── CMakeLists.txt //编译脚本,调用src目录下的CMakeLists文件
• Detection and Classification(Python):
├── 工程名
├── models //存放模型相关文件
│ ├── bert
│ ├── fasterrcnn
│ ├── resnet50
│ └── yolov3
├── pipeline //存放pipeline文件
│ ├── BertMultiPorts.pipeline
│ ├── FasterRcnn.pipeline
│ ├── Sample.pipeline
│ ├── SamplePlugin.pipeline
│ ├── SplitterNms.pipeline
│ └── VideoObjectDetection.pipeline
└── python //存放Python脚本文件
├── main.py //样例入口
├── main_tensorinfer.py
├── README.md //样例代码说明
└── run.sh
根据插件的实际应用场景,添加用于推理的模型文件和数据集。
本文档的输入图片和下载模型以Detection and Classification样例工程所需为例进行操作。
• 准备推理数据
MindX SDK样例工程需要用户下载样例的输入图片(例如一张包含动物的图片),命名为test.jpg。新建Detection and Classification(C++)请上传到工程文件夹的“C++”目录下,新建Detection and Classification(Python)请上传到工程文件夹的“python”目录下,若目录不存在请自行创建。
• 添加模型文件
在ModelZoo上下载YOLOv3模型pb文件 ,下载地址 ;ResNet50模型pb文件,下载地址 。进入模型页面后,关键词搜索:YOLOv3或者ResNet-50,应用级别:Released,框架:TensorFlow选择“历史版本”中版本1.1下载。
用户使用Caffe/TensorFlow等框架训练好的第三方模型,可通过ATC工具将其转换为昇腾AI处理器支持的离线模型(*.om文件),模型转换过程中可以实现算子调度的优化、权重数据重排、内存使用优化等,可以脱离设备完成模型的预处理,详细架构如图1所示。
图1 ATC工具功能架构
Detection and Classification样例工程须在Python 3.9环境下运行,远端环境安装的MindX SDK为2.0.4版本,当前PythonV2接口仅支持在Python3.9的环境中使用。在模型转换和样例编译运行前请先准备环境,本地和服务器环境变量相关配置详见本文档12、FAQ 。
模型转换步骤以Detection and Classification样例工程所需模型为例进行操作,MindStudio模型转换工具的详细使用和参数说明请参考MindStudio用户手册--模型转换 。
可以通过如下两种方式进入模型转换界面:
在菜单栏选择“Ascend > Model Converter”。
在菜单栏选择“View > Appearance > Toolbar”,菜单栏下方会出现一行工具栏,选择转换按钮。
步骤1 打开模型转换页面,在“Model Information”页签中上传模型文件,加载成功后,会自动填充下列参数信息,页面参数配置指导如下:
(Model Name是生成的om模型文件名称,如图是Detection and Classification样例工程代码中设置好的名称,用户可以根据需要自行修改名称。)
• Model File:
获取模型pb文件后,选择上传到环境中的模型pb文件路径。需要选择到pb文件一级。
• Model Name:
转换YOLOv3模型时请以yolov3_tf_bs1_fp16命名。
转换ResNet50模型时请以resnet50_aipp_tf命名。
• Target SoC Version:
模型转换时指定芯片版本。转换YOLOv3模型与转换ResNet50模型无差异,请根据使用 的芯片类型选择。
• Input Format:
输入数据格式。转换YOLOv3模型与转换ResNet50模型无差异,请使用默认设置,不需 要修改。
• input/input_data:
转换YOLOv3模型时,输入Shape请使用1,416,416,3,输入Type请使用FP32。
转换ResNet50模型时,输入Shape请使用1,224,224,3,输入Type请使用FP32。
• Output Nodes:指定输出节点信息。
转换YOLOv3模型时,请选择Conv_22/BiasAdd、Conv_14/BiasAdd、 Conv_6/BiasAdd三项。在搜索出的节点上,右击Select选中,单击“OK” 后,在“Output Nodes”参数下面会看到标记层的算子。
转换ResNet50模型时,无需选择Output Nodes。
图2 YOLOv3模型参数配置
图3 YOLOv3模型图
图4 ResNet50模型参数配置
步骤2 单击Next,进入Data Pre-Processiong页面,参照图5作为示例配置参数。详细请参考配置数据预处理 。
图5 Data Pre-Processiong
步骤3 单击Next,进入Advanced Options Preview页面,参照图6配置参数。
Additional Arguments处请填写模型aipp配置文件的绝对路径,请用户自行替换。Command Preview展示了模型转换使用的atc参数预览。
转换YOLOv3模型时请配置:
--insert_op_conf=${配置文件上传路径}/aipp_yolov3_416_416.aippconfig
转换ResNet50模型时请配置:
--insert_op_conf=${配置文件上传路径}/aipp_resnet50_224_224.aippconfig
图6 Advanced Options Preview
步骤4 单击Finish开始模型转换,在MindStudio界面下方,“Output”窗口会显示模型转换过程中的日志信息,如果提示**“Model converted successfully”**,则表示模型转换成功。“Output”窗口会显示模型转换所用的命令、所设置的环境变量、模型转换的结果、模型输出路径以及模型转换日志路径等信息。
步骤5 转换完成的模型om文件生成在“$HOME/modelzoo”下,请分别移动放置于“工程文件根目录/models/resnet50”和“工程文件根目录/models/yolov3”下。
若新建的工程为Python版本的应用工程,由于不需要执行“编译应用工程”,在MindStudio工程界面中“Build > Edit Build Configuration...”会置灰,不可以使用。
远端编译时,会对工程文件夹进行目录拷贝到远端连接的环境,工程文件夹中dump、model、profiling目录不会被拷贝。
步骤1 在MindStudio工程界面,依次选择“Build > Edit Build Configuration”,进入编译配置页面,配置完成后单击“Save”保存编译配置。
图1 编译配置
步骤2 单击“Build”编译工程。如果在编译过程中无错误提示,且编译进度到“100%”,则表示编译成功,如图。
步骤1 在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面。选择“Ascend App > 工程名”配置应用工程运行参数,图1为配置示例。配置完成后,单击“Apply”保存运行配置,单击“OK”,关闭运行配置窗口。
步骤2 在MindStudio工程界面,依次选择“Run > Run...”。在弹出框中选择已创建好的运行配置信息,运行应用。
图1 运行参数配置
• 如果在运行过程中无错误提示,且提示“Running *** finished”,则表示运行结束,如图1。图2为SDK样例工程运行成功的返回示例。
• 如果运行过程中有错误提示,且需要查看运行环境的详细日志时,请参见《日志参考》 :
可参见“日志文件介绍”查看日志,日志文件路径默认为“$HOME/ascend/log ”。
可参见“设置日志级别”查看或修改日志级别(默认为ERROR)。
表1 运行配置参数说明
图1 运行成功日志
图2 分类检测结果
输入:测试图片test.jpg
输出:图片检测分类结果(className所示为猪在英语中的多种叫法)
解决方案:
步骤1 在顶部菜单栏中选择File > Project Structure,在Project Structure窗口中,点击Platform Settings > SDKs,点击上方的“+”添加Python SDK,从本地环境中导入Python3.9。
步骤2 点击Project Settings > Project,选择上一步添加的Python SDK。
步骤3 点击Project Settings > Modules,选中“MyApp”,点击“+”后选择Python,为Python Interpreter选择上述添加的Python SDK。点击OK完成应用工程Python SDK配置。
• Linux安装python3.9后没有共享库libpython3.9m.so.1.0,执行查找命令find / -name libpython3.9.so.1.0也没有
解决方案:
编译选项中,增加--with-ssl
./configure --prefix=/usr/local/python3.9 --enable-shared --with-ssl
安装python3.9后,将libpython3.9.so.1.0拷贝至/usr/lib64/路径下,没有lib64就放在lib下;
执行以下命令清除历史缓存rm-/.cache/gstreamer-1.0/registry.x86_64.bin(根据具体运行环境选择x86_64.bin或者aarch64.bin)来清除gstreamer的历史缓存,再次运行程序。
解决方案:
在远程环境中使用env指令查看所需环境变量值,请仔细检查自己的环境变量与所给的环境变量是否有差别,若缺少路径,执行vi .bashrc命令,打开.bashrc文件,在.bashrc文件中添加缺少的环境变量。:wq!保存退出后,执行source ~/.bashrc命令使环境变量生效。
# 远端环境上安装的SDK路径。与安装时的选择要一致。譬如安装时选择了远端环境的mxManufacture路径,此处如果配置mxVision路径将会导致失败
MX_SDK_HOME=/usr/local/Ascend/mxVision-2.0.4
LD_LIBRARY_PATH=/usr/local/python3.9/lib:/usr/local/Ascend/ascend-toolkit/5.0.4/x86_64-linux/runtime/lib64:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:/usr/local/Ascend/driver/lib64:${LD_LIBRARY_PATH}
PYTHONPATH=/usr/local/python3.9/lib/python3.9/site-packages:/usr/local/Ascend/ascend-toolkit/5.0.4/x86_64-linux/python/site-packages/acl:${MX_SDK_HOME}/python:$PYTHONPATH
PATH=/usr/local/python3.9/bin:$PATH
# MindX SDK扫描插件程序的路径
GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner
# MindX SDK扫描并加载插件的路径
GST_PLUGIN_PATH=${MX_SDK_HOME}/lib/plugins:${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${GST_PLUGIN_PATH}
Python项目无需在Run > Configurations > Environment Variables
中部署环境变量,在应用开发开始前修改远端环境中的.bashrc文件,添加下述内容:
#如果用户环境存在多个python3版本,则指定使用python3.9版本
export PATH=/usr/local/python3.9/bin:$PATH
#添加python3.9库文件路径
export LD_LIBRARY_PATH=/usr/local/python3.9/lib:$LD_LIBRARY_PATH
export PYTHONPATH=/usr/local/python3.9/lib/python3.9/site-packages:$PYTHONPATH
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/mxVision-2.0.4/set_env.sh
解决方案:
没有模型文件,Detection and Classification样例工程所需resnet50和yolov3的om文件都要分别放到工程根目录中models的resnet50和yolov3目录下。
昇腾官网:昇腾社区-官网丨昇腾万里 让智能无所不及 (hiascend.com)
昇腾论坛:昇腾论坛_开发者论坛-华为云论坛 (huaweicloud.com)