一、前言
本来是想要比较STGCN和TGCN两个模型在SZ-Taxi数据集上的精度,但是实际操作下来发现STGCN在该数据集上的精度始终要低于TGCN,并且网上比较过两个模型精度的论文也显示如此(https://arxiv.org/pdf/2103.06126.pdf),因此需求变成了STGCN模型在该数据集上的推理精度尽可能高。我在ModelZoo上和GitHub上分别找到了MindSpore版本和Pytorch版本的STGCN代码,在实际训练中发现Pytorch版本的精度要高于MindSpore版本,所以后面的模型转换和推理都是基于Pytorch版本进行的,但仍保留了使用MindStudio训练MindSpore版本的过程。
视频演示过程:【使用MindStudio进行城市道路交通预测】
https://www.bilibili.com/video/BV1a84y1i79f/?share_source=copy_web&vd_source=f7d24db2228a917114f5f43279c5f171
二、MindStudio介绍和安装
2.1 MindStudio介绍
2.1.1应用场景
MindStudio是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,集成了工程管理、编译器、仿真器以及命令行开发工具包,提供网络模型移植、应用开发、推理运行及自定义算子开发等功能。通过MindStudio能够进行工程管理、编译、调试、运行、性能分析等全流程开发,支持仿真环境及真实芯片运行,提高开发效率。
2.1.2功能框架
2.1.3功能介绍
目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具、开发工具包(Ascend Development Kit,ADK)等多种工具。
功能 | 说明 |
工程管理 | 为开发人员提供创建工程、打开工程、关闭工程、删除工程、新增工程文件目录和属性设置等功能。 |
SSH管理 | 为开发人员提供新增SSH连接、删除SSH连接、修改SSH连接、复制SSH连接、加密SSH密码和修改SSH密码保存方式等功能。 |
编译 | 提供算子、计算引擎和应用的开发编译,满足开发者不同场景的开发编译诉求。 |
运行 | 支持开发的算子、计算引擎在真实昇腾AI处理器中运行,并可以统一在界面中查看运行相关的信息。 |
模型转换 | 训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。 |
应用开发 | 针对业务流程开发人员,MindStudio工具提供基于AscendCL(Ascend Computing Language)的应用开发编程方式,编程后的编译、运行、结果显示等一站式服务让流程开发更加智能化,可以让开发者快速上手。 |
日志管理 | MindStudio为昇腾AI处理器提供了覆盖全系统的日志收集与日志分析解决方案,提升运行时算法问题的定位效率。提供了统一形式的跨平台日志可视化分析能力及运行时诊断能力,提升日志分析系统的易用性。 |
设备管理 | MindStudio提供设备管理工具,实现对连接到主机上的昇腾设备的管理功能。 |
精度比对 | 可以用来比对通过TBE自定义的算子运行结果与Caffe标准算子的运行结果,以便用来确认神经网络运算误差发生的原因。提供Lower Bound和Vector比对方法。其中: Lower Bound比对,华为自主研发的精度比对算法。 Vector比对,包含余弦相似度、最大绝对误差、累积相对误差、欧几里得相对距离的精度比对。 |
自定义算子开发 | 提供了基于TBE的算子编程开发的集成开发环境,让不同平台下的算子移植更加便捷,适配昇腾AI处理器的速度更快。 |
性能分析 | MindStudio以图形界面和命令行两种用户界面呈现方式,实现针对主机和设备上多节点、多模块异构体系的高效、易用、可灵活扩展的系统化性能分析,以及针对昇腾AI处理器的性能和功耗的同步分析,满足算法优化对系统性能分析的需求。 |
开发工具包的安装与管理 | 为开发者提供基于昇腾AI处理器的相关算法开发工具包ADK(Ascend Development Kit),旨在帮助开发者进行快速、高效的人工智能算法开发。开发者可以将ADK包安装到MindStudio上,使用MindStudio开发工具进行算法快速开发,也可以使用独立的ADK包进行算法开发。ADK包内部包含了基于昇腾AI处理器开发依赖的头文件和库文件、编译工具链、调优工具等。 |
设置 | 为开发人员提MindStudio开发平台工具的设置功能,可以设置界面外观、编辑喜好等。 |
2.1.4下载地址和用户手册
下载地址:昇腾社区-官网丨昇腾万里 让智能无所不及
用户手册:昇腾社区-官网丨昇腾万里 让智能无所不及
2.2本机安装配置过程
MindStudio可以单独安装在Windows上。在安装MindStudio前需要在Linux服务器上安装部署好Ascend-cann-toolkit开发套件包,之后在Windows上安装MindStudio,安装完成后通过配置远程连接的方式建立MindStudio所在的Windows服务器与Ascend-cann-toolkit开发套件包所在的Linux服务器的连接,实现全流程开发功能。针对我的需求,我选择的是开发运行场景(共部署形态)的安装。
具体的安装步骤参考如下:
2.2.1检查环境要求
本地环境要求:Windows 10 x86_64操作系统
本地安装依赖:Python(版本要求:3.7~3.9)、MinGW、CMake
2.2.2安装依赖
①Python
官网下载对应版本:Welcome to Python.org
正常安装后配置环境变量
在Windows 10操作系统的“控制面板 > 系统和安全 > 系统”中选择“高级系统设置”
在“环境变量 > 用户变量(U)”弹框中选中Path变量后单击“编辑”
在“编辑环境变量”弹框中单击“新建”,输入Python安装包目录和脚本目录的路径,例如:D:\python和D:\python\Scripts,最后单击“确定”
打开系统命令行,输入python -V命令确认python版本
②MinGW
官网下载对应版本:https://sourceforge.net/projects/mingw-w64/files/
跟安装python一样安装好后配置环境变量,只需在“编辑环境变量”弹框中单击“新建”,输入MinGW安装包解压后bin目录的路径,例如:D:\mingw64\bin,单击“确定”
打开系统命令行,输入gcc -v命令进行确定,只要界面提示“gcc version x.x.x” 信息时,表示安装成功。
③CMake
官网下载对应版本:https://cmake.org/download/
按照流程进行正常安装,记得在进入“Install Options”界面,选择“Add CMake to the system PATH for all users”,单击“Next”。
其他正常安装就可以了。
2.2.3准备软件包安装MindStudio
官网下载对应版本:昇腾社区-官网丨昇腾万里 让智能无所不及
我选择的是MindStudio_5.0.RC1_win.zip版本的免安装压缩包
下载后进行解压,然后进入安装目录打开,如D:\MindStudio\bin
打开后进入导入设置界面
我们首次安装选择Do not import settings:不导入设置,若选择该选项,则创建新的配置文件,默认为该选项。单击“OK”,进入下一步。
如果没有报错信息且能正常进入欢迎界面,则表示MindStudio安装成功
2.1.4说明
安装成功后,Windows本地会出现如下目录:
C:\Users\个人用户\.MindStudio:包括Toolkit安装路径(MindStudio.properties文件)、MindStu 8 dio属性文件以及隐私声明界面用户所做的操作信息。
C:\Users\个人用户\AppData\Local\Huawei\MindStudioMS-{version}:存储MindStudio安装以及启动后的运行日志等信息。
C:\Users\个人用户\AppData\Roaming\Huawei\MindStudioMS-{version}:存储用户配置数据目录,包括工程界面的个性化设置(例如背景色等信息)等信息。
2.3服务器环境配置
2.3.1 CANN安装
输入uname -a查看系统型号
根据型号选择相应的CANN对应版本,如果使用的是ModelZoo上的项目的话,要注意模型适配的CANN版本,不然模型推理时可能会出错。
CANN软件包获取地址:昇腾社区-官网丨昇腾万里 让智能无所不及
也可通过下述指令下载
wget https://ascend-package.obs.cn-north-4.myhuaweicloud.com/22.0.RC1/Ascend-cann-toolkit_5.1.RC1_linux-x86_64.run
下载完成后进行安装
出现Permission denied,需要先对安装包设置可执行权限
chmod +x Ascend-cann-toolkit_5.1.RC1_linux-x86_64.run
然后再进行安装
./Ascend-cann-toolkit_5.1.RC1_linux-x86_64.run --install
安装完成。
2.3.2 安装SDK(要安装在推理服务器上)
官方下载地址:昇腾社区-官网丨昇腾万里 让智能无所不及
下载好后上传到服务器需要安装的目录下
设置可执行权限
chmod +x Ascend-mindxsdk-mxmanufacture_3.0.RC2_linux-x86_64.run
然后进行安装
./ Ascend-mindxsdk-mxmanufacture_3.0.RC2_linux-x86_64.run --install
点击Files ->Settings ->Appearance & Behavior ->System Settings ->MindX SDK,连接远程SDK。
这样我们所需要的环境就全部搭建好了。
三、项目配置
选择项目保存路径打开项目或者新建项目。在“Projects”页签单击“Open”,打开已有的工程,弹窗如图所示表示MindStudio提供的功能可能会执行此工程中的潜在恶意代码,打开工程前需进行确认。选择信任此项目。
打开后先点击Ascend选择Convert To Ascend Project将其转化为昇腾项目,选择框架MindSpore。
接下来需要配置连接MindStudio所在Windows环境与Ascend-cann-toolkit开发套件包所在远程开发环境。
1、点击File->Project Structure
2、点击Project,在Project SDK中选择Add Python SDK
3、选择SSH Interpreter,点击Deploy后面的按钮
4、点击左上角的“➕”进行添加,名字可以写服务器的ID,点击OK
5、点击SSH configuration后面的按钮
6、点击左上角的“➕”,然后填写服务器连接的相关信息,测试成功后点击OK。
7、点击Mappings,点击➕后填写本地项目地址和服务器上项目的保存地址,填好后点击OK。
8、配置好后点击点击Interpreter后的按钮选择python版本(一般系统会自动检索,如果有多个python版本请手动选择正确的)。填好后点击OK。
配置好后即可通过功能栏Tools中的start SSH session功能远程连接服务器。
若想要使用run/debug功能还需要配置Configurations。
点击功能栏中的Run->Edit Configurations。在Run/Debug Configurations窗口中点击添加Ascend Training。
配置好后即可本机调试代码。
四、数据集和模型介绍(以MindSpore版本为例)
4.1 SZ-Taxis数据集
地址:https://github.com/lehaifeng/T-GCN/tree/master/data
为2015年1月1日至1月31日深圳出租车轨迹。选择罗湖区156条主要道路作为研究区域,实验数据主要包括两部分:一个是一个156*156的邻接矩阵,描述了道路之间的空间关系,每一行表示一条道路,矩阵中的值表示道路之间的连接性:另一个是特征矩阵,描述了每条道路上的速度随时间的变化,每一行代表一条路,每一列是不同时段道路上的交通速度。每15min计算一次每条路上的车速。
4.2 STGCN模型
论文地址:https://arxiv.org/pdf/1709.04875.pdf
ModelZoo模型地址:https://www.hiascend.com/zh/software/ModelZoo/models/detail/C/f4ee21725b86491ca61a761bc3646e00
STGCN 开创性地采用 Graph Convolution 和 Gated Causal Convolution 的组合,不依赖 LSTM/GRU 来做预测。原论文的模型架构图,如下所示。
整个架构可以概括为:输入-> ST-Conv Block -> ST-Conv Block-> Output Block->输出。
代码结构:
在config.py中一些参数的含义:
n_his代表过去若干时间片段的交通数据,n_pred表示预测的时间片段的交通数据,Ks和Kt分别表示的是模型中空间和时间卷积核的大小,步长5,学习率0.7.
在utility.py中的calculate_laplacian_matrix()函数解释:
这是在计算标准化图拉普拉斯矩阵,参照的数学公式如下图:
这一步经过查看资料发现实现的就是归一化的步骤
metric.py中LossCellWithNetwork类就是继承了MindSpore中的nn.Cell类自定义了stgcn的损失函数。
layers.py中Align类是用于计算残差连接x,其中前向传播部分解释写在了注释里
原论文中ST-Conv Block 是由两个 Gated Temporal Convolution layer 夹着一个 Graph Convolution layer 组成,layers.py中包含了CausalConv2d、TemporalConvLayer(GLU)、ChebConv、GCNConv、GraphConvLayer、STConvBlock、OutputBlock部分的构建,详细结构如下图所示。这部分模块的名称和下图是基本对应的。
引用自(https://zhuanlan.zhihu.com/p/286445515好想喫火鍋 Spatio-Temporal Graph Convolutional Networks 详解)
dataloader.py中按照70:15:15划分训练集,测试集,验证集,然后用create_dataset函数构建训练集和测试集。
train.py部分中使用MindSpore提供的函数使用自定义衰减学习率函数
使用MindSpore.nn.Cell类中Optimizer优化器
Callback部分
其中summary_collector是使用Mindinsight图像化训练过程时用来收集数据的。
使用ModelCheckpoint来进行模型训练与保存。
训练完之后在test.py中使用MindSpore.train.serialization模块中的load_checkpoint, load_param_into_net进行加载训练结果。
通过evaluate_metric函数计算精度。
其中scaler.inverse_transform将标准化的数据转化为原始数据方便进行比较。
五、开发过程
5.1 训练模型
5.1.1 MindSpore框架
单卡训练指令
python train.py --train_url="" --data_url="" --run_distribute=False --graph_conv_type="chebconv" --n_pred=9
表1 参数说明
参数 | 说明 |
train_url | 代码路径。 |
data_url | 数据集路径。 |
run_distribute | 是否使用多卡训练。 |
graph_conv_type | 图卷积网络类型。 |
n_pred | 预测时段。 |
在MindStudio[1] 中可以点击运行-编辑配置
在形参中输入参数,然后选择前面配置好的远程服务器上的解释器,点击确定。
配置好后点击开始按钮,即可开始训练,过程展示在下方的运行窗口中。
由于经过多次训练,MindSpore[2] 框架的STGCN模型训练精度要低于Pytorch框架下的训练精度,因此根据任务要求,后续都使用Pytorch版本的STGCN模型。
5.1.2 Pytorch框架
代码参考连接:https://github.com/hazdzz/STGCN
打开方式与前文类似,因为我本地之前已经配置过Pytorch[3] 环境,所以我运行时直接选择的本地的解释器。
Pytorch框架的STGCN模型的参数都在default里面设置好了,不需要额外输入参数。
运行训练文件即可。
经过多次调参,最优训练结果和参数如下。
参数 |
'train_split_rate': 0.85 'learning_rate': 0.001, 'epochs': 1000, 'batch_size': 8, 'gamma': 0.95, 'drop_rate': 0.5, 'weight_decay_rate': 0.0005, |
结果 |
MAE:2.81 RMSE:4.29 |
训练好的pth文件连接如下:
https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/STGCN/stgcn_sym_norm_lap_45_mins.pth
5.2 模型转换
5.2.1 Checkpoint->air->om
总体流程:Checkpoint->air->om
MindSpore的export可以将网络模型导出为指定格式的文件,用于其他硬件平台的推理。在export.py中将训练好的模型导出。
选择将模型转化为AIR格式,是华为定义的针对机器学习所设计的开放式的文件格式,能更好地适配Ascend AI处理器。
命令行参数:
python export.py --data_url /home/chongqin1/MindStudioProjects/data/ --graph_conv_type chebconv --n_pred 9 --ckpt_file /home/chongqin1/MindStudioProjects/chebconv_45_mins/STGCN-500_33.ckpt
执行后会在项目所在目录下生成stgcn.air文件。
之后是需要将air模型转化为om模型,方法如下:
ATC工具使用参考:https://support.huawei.com/enterprise/zh/doc/EDOC1100234054/6dfa6beb
在convert_om.sh中编写脚本进行转化
其中变量路径需要根据实际安装路径修改。
参数说明:
参数 | 说明 |
model_path | air文件路径。 |
output_model_name | 生成的om模型文件名,自动添加.om后缀。 |
--framework | 原始框架类型,1代表MindSpore框架。 |
--model | 待转换的air模型路径。 |
--input_shape | 输入数据的shape |
--output | 转换后输出的om模型存放路径以及名称。 |
--enable_small_channel | 是否使能small channel的优化。 |
--log | 日志级别。 |
--soc_version | 模型转换时指定芯片版本。 |
命令示例:
bash convert_om.sh ../data/model/stgcn.air ../data/models/stgcn
执行后会显示run success:
也可以通过MindStudio中的modelcoverter功能进行模型转化。
点击Ascend-ModelConverter
选择Model File(air模型在服务器中的路径),OutputPath(om模型的生成路径),点击Next,最后点击Finish
最后显示Model converted successfully即转化成功。
5.2.2 pth->onnx->om
pth转化为onnx模型调用的是Pytorch中的onnx库
然后可以通过通过MindStudio中的modelcoverter功能进行模型转化,过程同上。
转换好的onnx文件连接如下:
https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/STGCN/stgcn10.onnx
5.3 模型推理
5.3.1 新建SDK项目
新建好后我们根据自己的需要创建文件夹
├── data # 数据目录[4] ,存放测试集或者需预测的数据集
├── models # 模型目录[5] ,存放前面章节转换成的om文件
├── pipeline
│ └── stgcn.pipeline
├── main.py # 展示推理精度
├── predict.py # 根据输入的数据集输出未来一定时段的交通速度
├── README.md
├── convert_om.sh # onnx文件转化为om文件
├── results # 预测结果存放
参照前文的三、打开项目和2.3.2连接好远程服务器并设置好环境(注意是连接推理服务器)
5.3.2 pipeline文件编排
Pipeline文件编排是python版SDK最主要的推理开发步骤,可以通过MindStudio中Ascend-MindX SDK Pipeline功能进行可视化编写各插件的功能说明可以参考官网插件的整体介绍:插件总体介绍 - MindX SDK 2.0.3 mxVision 用户指南 01 - 华为
点击Save As进行保存。
保存之后可以通过代码进行修改
最后流程如下:
appsrc # 输入
mxpi_tensorinfer # 模型推理
mxpi_dataserialize
appsink # 输出
完成之后就可以进行main.py的编写。
5.3.3 main.py文件编写
根据pipeline文件编排中的说明,我们在main.py中需要完成将数据传给推理业务+获取推理结果。
使用send_source_data()函数封装实现数据的传入。用户使用接口SendProtobuf将protobuf数据和key(用于将protobuf数据挂载至元数据中,使用该数据的元件可以通过这个key获取数据)批量或单个发送给appsrc元件,inPluginId指定appsrc的编号,appsrc发送数据给其他元件处理。元件处理完数据后,以元件名为key将处理结果保存至元数据中。
用load_data()函数实现测试集的读取部分。
使用get_infer_data()函数实现数据的读取。通过GetProtobuf接口从元数据中取出想要获取的元件结果,输入一组key,便能获取key对应的protobuf数据。
最后通过test()函数输出测试精度。
在main()函数中则需要完成数据流的初始化和pipeline文件的读取。以及最后stream_manager_api.DestroyAllStreams()。
5.3.4 推理精度[6]
运行main.py可以获得推理精度,指令如下:
python main.py [image_path] [result_dir] [n_pred]
参数说明:
image_path:验证集文件,如“data/sz_speed.csv”
result_dir:推理结果保存路径,如“results/”
n_pred:预测时段,如9
最后推理预测的结果会保存在results/predictions.txt文件中
使用工具中的Start SSH session功能连接上推理服务器,在main.py 所在的目录下输入运行指令
python main.py data/sz_speed.csv results/ 9
然后推理开始
界面会显示插件等信息的成功加载,然后继续运行
因为推理是以过去一组n_his时间长度的交通数据预测一个n_pred时间的交通数据,所以数据是一组一组输入,并且每组会显示sdk运行的时间。数据越多推理时间越长。
最后会显示测试精度 MAE 2.81 | RMSE 4.29
预测的结果和实际的数据会分别存放在predictions.txt和labels.txt中。
并且最后Destroy Devices和streams,完成本次推理。
Q&A
- Ascend插件突然报错停止使用
解决方式:①停用后重新启用②进入C:\Users\用户\AppData\Local\Huawei删去MindStudioMS-{version}文件和C:\Users\个人用户\AppData\Roaming删去MindStudioMS-{version}文件,把之前的一些配置都删掉重新配置。
2. CANN设置失败
原先的CANN安装在root权限的用户下,普通用户不能去同步root用户,我们需要重新下载在普通用户下,然后导入普通用户的路径。
3.想要进行pipeline文件编排的时候出现如下问题
原因是:需要设置服务器中CANN及SDK的环境信息,使用的CANN版本为5.1.RC1,SDK为mxVision 2.0.4,且需要安装python3.9才能正常使用SDK推理功能。
4、服务器上进行推理的时候出现coredump
因为服务器上安装了好几个版本的mxVision,使用RC2版本的时候出现了这个问题,2.0.4版本的时候就可以了,是版本不匹配导[7] 致的。运行前可以先运行一下对应版本的set_env.sh
要是有更多的问题,可以到MindStudio开发者论坛、昇腾社区进行检索。
文档参考连接和资料汇总
- MindStudio开发者论坛:https://forum-gray.huaweicloud.com/forum/forumdisplay-fid-945-orderby-lastpost-thelimit-all-page-25.html
- 昇腾社区:https://www.hiascend.com/
- STGCN模型论文:https://arxiv.org/pdf/1709.04875.pdf
- STGCN模型MindSpore版本:昇腾社区-官网丨昇腾万里 让智能无所不及
- STGCN模型Pytorch版本:https://github.com/hazdzz/STGCN
- SZ-Taxi数据集:T-GCN/data at master · lehaifeng/T-GCN · GitHub
- MindStudio下载地址:昇腾社区-官网丨昇腾万里 让智能无所不及
- 用户手册:昇腾社区-官网丨昇腾万里 让智能无所不及
- CANN软件包获取地址:昇腾社区-官网丨昇腾万里 让智能无所不及
- SDK官方下载地址:昇腾社区-官网丨昇腾万里 让智能无所不及
- Pipeline编排时会用到的官网插件的整体介绍:插件总体介绍 - MindX SDK 2.0.3 mxVision 用户指南 01 - 华为
- 转换好的onnx文件连接如下:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/STGCN/stgcn10.onnx
- 训练好的pth文件连接如下:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/STGCN/stgcn_sym_norm_lap_45_mins.pth
- 视频演示:使用MindStudio进行城市道路交通预测_哔哩哔哩_bilibili
- 项目运行说明:城市道路交通预测_MindX应用使能_昇腾_华为云论坛 (huaweicloud.com)
- 项目代码地址:mindxsdk-referenceapps: MindX SDK Reference Apps - Gitee.com