基于MindStudio的Tensorflow 模型Profiling调优命令行实战图文案
--以Vision Transformer为例
对应的视频教程链接:基于MindStudio的Tensorflow模型Profiling调优命令行实战_哔哩哔哩_bilibili
目录
大家好,模型训练时的性能能够在一定程度上衡量芯片设备和底层框架运行状况好坏的标准。华为Ascend 910平台支持使用Tensorflow 和 Pytorch训练。但是这些框架源码都是基于NVidia芯片设计的,而华为Ascend910芯片有自己的一套底层架构方式。
为了更好的挖掘模型的耗时原因,我们需要获取每个算子的运行情况记录。这里的情况记录包含多个方面:1. 算子运行时间,2.算子等待时间。然而获取全图逐算子运算情况是非常复杂的过程.为此本文会向大家介绍MindStudio profiling工具,以及如何使用MindStudio实现结果的可视化呈现。本文主体由基础知识介绍,环境准备,具体实验和总结四部分组成。实验部分是以vision transformer做基础演示。最后本文是本文档的总结,以及根据笔者的开发经验,总结出一些tips,希望能帮助到各位开发者。
提醒:如果对基础知识以及有了较多的了解或者想尽快浏览实验部分的,可以直接跳过第一部分--前置知识和第二部分—环境准备,直接到第三部分的实验和第四部分的总结。
Ascend 910模型迁移训练
Tensorflow或者pytorch脚本无法直接在Ascend 910设备上加速运行,因为两者底层都依赖于cuda算子,需要针对Ascend 910做一定程度的修改,可以通过MindStudio的migration tools实现。910能够运行tensorflow或者pytorch脚本的原理是910对tensorflow和pytorch的底层做了修改,这些脚本所写的运算节点(或者称为网络层)最终会被Ascend 910的算子库对应替换。
Profiling 工具
Profiling实现了Host+Device侧丰富的性能数据采集能力和全景Timeline交互分析能力,展示Host+Device侧各项性能指标,帮助用户快速发现和定位AI应用的性能瓶颈。包括资源瓶颈导致的AI算法短板,指导算法性能提升和系统资源利用率的优化。Profiling支持Host+Device侧的资源利用可视化统计分析,具体包括Host侧CPU、Memory、Disk、Network利用率和Device侧APP工程的硬件和软件性能数据。Profiling提供针对硬件和软件性能数据采集、分析、汇总展示。总体流程如下:Profiling采集性能数据;MindStudio查询并解析数据;MindStudio展示性能数据。
MindStudio软件
MindStudio提供在AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助您在一个工具上就能高效便捷地完成AI应用开发。MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。需要注意的是, MindStudio只有Linux和Windows两个版本,MAC电脑所使用的Unix OS不支持.
MindStudio 类似IDEA 软件,如下图所示,
要说明的是,通常在Windows服务器上安装MindStudio,昇腾AI设备需要安装对应的驱动、固件、Ascend-cann-toolkit和AI框架包。我们在本地写脚本,然后在云端(昇腾AI设备)执行,如下图所示:
如果您是直接在开发板上写脚本,会不同。本文针对的是以上开发场景。
MindStudio解决了两个问题:文件和云端同步以及脚本能够在云端执行。其中针对远程开发,MindStudio提供了Tools工具,该工具下面包含最常用的Deployment和SSH session工具。
其中Deployment 可以实现脚本的自动上传,SSH能够帮助我们随时链接远程服务器。
Ascend工具
MindStudio 还提供了 Ascend工具,其中包含很多我们开发Ascend应用时需要使用的工具, 如迁移工具(migration tools), 模型转换工具(model converter) , 模型可视化工具(model visualizer),模型精度分析工具(model accuracy analyzer),dump工具等.
Ascend 工具同时操纵远程的昇腾AI设备以及本地的开发环境.部分工具对本地环境有限制,如migration tools需要本地安装有pandas等库, profiler工具需要本地的python3环境能够使用sqlite.
本次的实验涉及本地开发环境(window10) 和 远程开发环境(Ascend 910服务器).
本地开发环境需要安装python3 和 MindStudio 软件.远程开发环境需要CANN中Ascend-cann-toolkit(开发套件包)。该开发套件是为开发者提供基于昇腾AI处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的模型、算子和应用的开发。开发套件包只能安装在Linux服务器上,开发者可以在安装开发套件包后,使用MindStudio开发工具进行快速开发.
目前远程开发环境(Ascend 910服务器)一般已经由华为官方配置好了,主要是驱动和CANN包的安装.
MindStudio安装与基本设置
MindStudio软件在本地安装时有环境要求, 为了避免后续出问题,建议遵循先检查环境是否完备,然后再安装软件.
参考链接:
首先检查本地环境
本地是否有python3.7及以上版本?
在cmd中输入python即可查验.
这里可能出现的问题是不少用户使用Conda或者miniconda实现python的环境管理,而跳过安装python的步骤,而使用anaconda或者miniconda所携带的默认python, 根据笔者的实验,发现: miniconda所自带的python版本通常为3.9, 且部分依赖缺失,如sqlite的dll文件.因此,建议安装独立安装python3.7.
Python3.7 的版本可以通过 Welcome to Python.org 获得. 下载安装文件后,注意将python的路径添加到环境变量的path中. 在window10上可以通过win+s键,然后输入编辑环境快速进入环境变量设置界面.
需要安装一下python包, xlrd==1.2.0 absl-py numpy和pandas.
本地是否有MinGW 和 cmake?
由于部分脚本可能依赖c++和cmake环境, 而在window上安装c++编译器需要使用到MinGW. 通过MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 下载MinGW ,下载完安装好后,添加bin目录到path路径中,和上面操作相同.
Cmd启动的terminal中输入 gcc –v可以查验gcc是否安装成功.
输入 cmake –version,出现下图所示则说明安装成功.
需要注意的是: 我们可以完全在远程开发环境上安装MindStudio, 而本地只需要安装MobaXterm即可. 在远程开发环境上启动带有界面的MindStudio, 通过MobaXterm中自带的XServer映射远程软件的GPU, 从而实现单机安装MindStudio进行开发. 然而这种连接对网络和设备要求都较高, 会出现高延迟卡顿等情况, 笔者并不推荐, 然而这似乎也是MAC用户使用MindStduio的唯一解.
软件安装
软件包下载地址: 昇腾社区-官网丨昇腾万里 让智能无所不及
获取[1] 最新的MindStudio exe安装包,含有GUI的集成开发环境。也可以下载zip没安装的软件包, 但是exe能够帮助自动设置路径.可以通过如上的网址校验软件, 确保软件包未被篡改.
双击下载的exe即可实现安装, 可以选择一路next到底.

没有报错就可以看到入口的界面 :
此时完成安装.
和远程开发环境相连
华为的远程环境(除了在华为云ECS上买的Ascend 310推理环境)需要通过secoclient连接昇腾生态众智实验室网络,具体教程链接为:
guide/common/tutorials/昇腾生态众智实验室网络连接指导.md · Ascend/docs-openmind - Gitee.com
在本机中,出现如下所示即可表示连上了华为的昇腾生态众智实验室网络.
我们新建一个项目,测试与服务器的连接.
通过change设置与远程服务器CANN的连接.
点击右侧的进入ssh配置环节, 通过test connect 测试连接是否通达.
出现下图所示表示连接成功.
出现上图表示已经找到了CANN包,如果MindStudio没有自动找到,可以通过如下路径添加 /usr/local/Ascend
脚本获取
本次需要的实验脚本为笔者提交给Ascend gitee仓库ModelZoom的计算机视觉tensorflow项目,脚本的位置在:
Ascend/ModelZoo-TensorFlow - Gitee.com
然而或者整个项目较为麻烦,可以拉取笔者共享的obs文件到本地。
路径如下:
obs://cann-id1217/code/
链接如下,提取码为666666:
另外此项目还需配备数据集和预训练文件,因此还需要下载如下连接的文件:
路径如下:
obs://cann-id1217/dataset/
链接如下,提取码为66666:
注意由于训练集和预训练文件较大,同步往往会找出较长时间的延迟,因此笔者建议直接下载到远程服务器中,并不执行与本地文件的同步。
code 目录如下所示:
dataset 目录如下所示:
启动项目
由于我们本地已经有项目文件,因此我们选择Empty Project
点击finish后便可进入项目。
我们将其转为 Ascend project,以方便使用MindStudio自带的Ascend 工具。 配置如下:
转换后我们可以看到有Ascend工具栏更新了
在这个项目里面,我们会用到System Profiler工具。 由于此项目已经针对Ascend做了迁移,如果是一个全新的tensorflow项目,需要先使用Migration Tools做适配迁移。
查看文件映射关系
通过Tools Deployment configuration 可以看到本地文件与远程服务器的映射关系。
同步本地与云端文件:在code 右键->Deployment->Upload即可实现本地文件上传。
配置profiler运行脚本文件 run.sh
由于profile是需要配置运行脚本文件,为了更方便加入环境设置,这里笔者新建了一个run.sh脚本与 vit_allpipeline_performace.py同级。脚本内容如下:
脚本2到7行用于设定device,第10行用于进入项目目录,第12行用于运行performance 脚本。
需要说明的是:使用MindStudio Ascend工具下面的System Profiler是利用位于远程服务器目录为:
/usr/local/Ascend/ascend-toolkit/latest/tools/profiler/bin
下的msprof实现profiling数据收集分析的。因此需要通过run.sh脚本让其运行时能够进入到脚本目录,以免出现无法找到某个文件的错误。
vit_allpipeline_performace.py 会运行1000个step, 需要指定数据集的路径。
配置profiler运行依赖
profiler可以收集很多运行过程的数据,但是有些类数据的收集和分析依赖一些工具包。如下链接所示,profiler依赖perf、iotop、ltrace工具。
安装perf、iotop、ltrace工具 - CANN 5.0.3 开发辅助工具指南 01 - 华为
安装 perf 工具
910服务器是ubuntu系统,可以通过:
apt install linux-tools-common
apt install linux-tools-4.15.0-156-generic
apt-get install linux-cloud-tools-5.4.0-77-generic
不同服务器可能不同,可以通过执行perf来查看是否缺少其他依赖,如下图所示。
根据要求安装相应的工具包
安装过程中如果出现如下图所示的404 Not Found 可以通过apt update 更新deb包链接。
输入perf出现如下所示,说明perf安装成功
安装ltrace
安装 iotop工具
执行如下命令:
wget http://guichaz.free.fr/iotop/files/iotop-0.6.tar.bz2
tar -xvf iotop-0.6.tar.bz2
cd iotop-0.6
sed -i 's/itervalues/values/g' setup.py
python3 setup.py build
python3 setup.py install
以上安装好iotop后将其链接到sbin下,此时注意iotop的地址,可以查看当前python版本,进而在python目录下面bin文件中查找,本服务器的地址为:
因此通过 ln /usr/local/python3.7.5/bin/iotop /usr/sbin/iotop
在terminal中输入 iotop –-help可以检查是否安装成功:
使用MindStudio profiler
完成前面的脚本run.sh和依赖准备工作后,便到了profiler环节。如下所示,通过单击菜单栏“Ascend > System Profiler > New Project”,弹出Profiling配置窗口。
得到,点击next得到执行的属性配置
右图的属性配置参数解释如下:
- Deployment: 运行配置,必选配置。通过Deployment功能,可以将指定项目中的文件、文件夹同步到远程指定机器的指定目录。一般是默认的参数。
- Project Path:是本地project的路径;
- Executable File:是执行文件,这里我们选择的是run.sh脚本
- Command Arguments和Environment Variable: 是命令行的参数和环境变量, 这里我们已经包含在run.sh脚本中了,不用填写。
- Remote Toolkit PATH:是远程服务器上的toolkit路径,自动填写。
下一步是Profiling Options :
参数解释:
参数 |
说明 |
|
AI Core Profiling |
Task-Based |
AI Core采集开关,以task为粒度进行性能数据采集。
|
Sample-Based |
AI Core采集开关,以固定的时间周期(AI Core-Sampling Interval)进行性能数据采集。
|
|
API Trace |
ACL API |
ACL(Ascend Compute Language)采集开关,采集接口流水信息。默认勾选,不能取消。 |
Runtime API |
Runtime采集开关,采集运行管理器接口流水信息。默认勾选,不能取消。 |
|
OS Runtime API |
系统运行时函数库API和Pthreads API的调用。可选配置,默认勾选。 |
|
Graph Engine (GE) |
Graph Engine采集开关,采集模型图引擎调度流水信息。可选配置。 |
|
Device System Sampling |
DDR |
采集DDR数据。可选配置,默认勾选。 可以更改采样频率Frequency(hz),默认频率为50Hz。 |
Host System Sampling |
CPU |
采集Host侧CPU资源利用率信息。可选配置,默认勾选。 |
Memory |
采集Host侧Memory资源利用率信息。可选配置。 |
|
Disk |
采集Host侧Disk资源利用率信息。可选配置。 |
|
Network |
采集Host侧Network资源利用率信息。可选配置。 |
本次实验主要是查看算子的运算
因此选择的是API Trace: Runtime API, Graph Engine(GE) 和AICPU Operators.
点击start后开始运行,可以得到下图:
System profiler 工具最终调用的是msprof实现profiling记录。
可以看到脚本运行过程如下,其中单步平均时间为0.20s。
profiler之后会弹出profiler界面
2是TimeLine View,其包含左侧导航窗格、右侧图形化窗格和下方数据窗格。导航窗格显示各个Timeline的名称,以及各个Timeline之间的从属关系;图形化窗格对应导航窗格,逐行对Timeline进行图形化展现;3是数据窗格,是以表格的形式呈现Profiling采集之后的各项数据,分为Event View、Statistics和AI Core Metrics。
其中timeline包含:以时序图的呈现方式为用户提供全流程推理过程中的运行情况,按照调度流程OS Runtime、ACL API、Runtime API、Graph Engine(GE)、AICPU task、AI Core task和System task来呈现整体的运行状况。实际展示情况与Profiling采集时的所选项以及设备有关,请以设备实际情况为准。在这里我们没有ACL Runtime和OS Runtime。ACL是在推理时用到的部分,在本实验不涉及,而OS Runtime我们没有采集。
其中参数解释如下:
- Runtime API:展示每个线程调用runtime API的时序信息。
- GE:展示模型的数据输入、推理、数据输出耗时。
- AI Core task:展示每个Stream的AI Core task时序信息。
- System task:展示每个Stream的System task时序信息。
如上图所示,在打开的Project Explorer界面上单击左上角的图标,可以改变timeline 的颜色设置。可以根据API执行时间自定义配置Timeline中的颜色显示比例,显示格式为:绿色 a% ≤ 黄色 < b% ≤ 红色,此设置的数值表示在Profiling采集过程中接口运行时间的耗时占比。
timeline 图 解释
参数解释:
- 将鼠标移动到具体采样点,可以查看对应采样点具体分析数据。
- 在左侧导航窗格中右键标签名,选择“Show in Event View”,可以在Event View界面中看到对应选项Timeline的顺序执行信息。
- 在TimeLine中可以查看对应的API或操作的名称。
- 同一线程中有多个OS Runtime API同时执行时会分行显示。
- 同一Stream中有多个AI Core task同时执行时会分行显示。
- 当选中TimeLine中某个时间点时,按住Ctrl键并向上/下滚动鼠标滑轮或点击视图右上角的/,实现Timeline视图的放大/缩小。点击视图右上角的实现视图复位。
- 当选中TimeLine中某个时间点时,可通过左右拖拉鼠标选择时间长度。以Current Time(us)为界点,鼠标向右拖动时间段显示为正,向左拖动时间段显示为负。
Analysis Summary 表格:在“Analysis Summary”模块中,选择需要查看的Device ID后,可以查看对应device的详细性能分析信息。
字段解释:Profiling Info中Result Size:结果文件大小;Profiling Elapsed Time:信息采集持续的时间。
Host System Info中:Cpu Num:CPU数量。Host Operating System:Host侧操作系统信息。Host Computer Name:Host侧电脑名称。
Host CPU Info中:CPU ID为CPU ID;Name是CPU名称;Type:CPU型号;Frequency:CPU频率。
Device Info中:AI Core Number:AI Core 数量;AI CPU Number是AI CPU数量;Control CPU Number是Control CPU数量;Control CPU Type是Control CPU型号;Device Id是当前页面关联的Device ID;TS CPU Number是TS CPU数量。部分系统由于不存在调用频率的接口,故不展示此参数,本参数展示情况请以实际情况为准。
Baseline Comparison:Profiling报告可以通过对比功能将两份报告的结果数据进行比对,并在Baseline Comparison(基准分析)视图展示。方便在重复执行Profiling之后产生多个报告后,对比相同情况下多次采集的数据之间的变化情况。
Event View:在timeline中的左侧导航窗格中右键标签名,选择“Show in Event View”,可以在下方数据窗格的Event View中看到对应选项Timeline的顺序执行信息,操作如图所示。
会得到Event View的表格,不同的name得到的表格不同。
可以通过此链接查看不同表格的解释:
Statistics视图 :单击下方数据窗格的Statistics,通过左上角下拉框选择不同类别的数据,可以查看ACL API、OS Runtime API、Runtime API、OPs和Op Info调用情况数据。不同表格有不同的表格属性,一一介绍过于累赘,详细见下链接:
AI Core Metrics视图 ,一下截图并不全,这是因为AI Core Metrics有大量属性,这里很难一一介绍,具体的属性解释可以查看如下链接:
AI Core Metrics视图_MindStudio 版本:3.0.4_用户指南_Profiling性能分析_Profiling数据展示_TimeLine View_华为云
分析思路及分析结果
由上介绍控制,这里有很多内容可以去分析。笔者结合自己的经验,提供一个分析思路。
1.确定分析目标。我们是tensorflow在Ascend910上的训练任务,着重关注是否出现算子耗时严重的情况。因此我们关注算子的运行时间。
2.确定分析区域。如前文所述,本次vit_allpipeline_performance会走100个step,因此会有100次迭代。通常第一个step的时间会比较长,这里涉及到tensorflow里面的静态图优化和算子下沉,以及过程中的数据迁移。所以我们跳过第一个step,选择中间step。可以通过如下区域找到中间的step。
拉大可以看到
我们选择第6个iteration即step6. 点击如下区域得到step6的报告,右图表似乎正在抽取。
得到如下图
由此可以看到目前的AICore和AICPU的分析都在step6上。
3.可视化和AI Core Metrics 联合查看耗时的算子。我们拉近可以看到:
有两个在AICPU上的算子耗时较长,为了具体看到其耗时的分析我们可以查看AI Core Metrics视图,以Task Duration排序。
可以发现这两个算子是FrameworkOp,使用的是cpu去算。这里FrameworkOp,笔者的理解是在Ascend910上没有找到适配的算子,从而采用源框架自己的算子。
因此我们找到了影响性能的一个主要原因:没有适配Dropout算子。对应源代码中vit_keras/layers.py:
性能优化
为了能够加速dropout算子的运行,我们需要使用npu自带的dropout算子(npu_ops),参考以下链接:
模型固化 - CANN 5.0.4 TensorFlow网络模型迁移和训练指南 01 - 华为
我们将脚本替换为如下所示的内容,完成dropout算子更改:
如上操作新起一个project进行profiler。
需要说明的是:system profiler启动时会将本地文件上传云端,同时会将profiler的结果存在本地(结果文件很大很多)。因此如果在源工程上实现二次profiler,最好将上次的profiler结果移除。
更换后的profiler运行过程中间结果如下,单个step的耗时优化从0.20s优化到0.09s。本次目的已经达到。
我们可以继续通过这种方法发现更多的优化区域。本文不再做赘述。
到此我们完成了profiler数据采集,分析和算子的优化。
本文以Vision Transformer作为案例,向大家介绍MindStudio profiling工具,以及如何使用MindStudio实现结果的可视化呈现工具。并通过profiling结果的分析,提出模型性能的优化方案--替换dropout算子。实验表示优化前和优化后性能相差一倍。
遇到的问题以及解决方法
- 文件找不到:
通过linux命令查看是否存在文件,如果不存在,则在MindStudio里面执行一下文件上传。
- 提示没有权限:
可能时开启了OS Runtime API或者对其他硬件的相关详细做了收集,需要在profiler option中取消勾线对应的参数。
- MindStudio 本地与远程同步时等待时间较长问题
不要同步较大的文件,不要设置tools工具栏里面的automatic upload.
- profiler时间过长
问题的可能原因时:代码脚本运行的step过多,软件卡住,profiler数据太多。建议减少step次数,减少profiler option的选项,重启任务。
一些开发建议
笔者主要参与Tensorflow模型训练推理场景的迁移和复现,以下时一些性能优化问题的开发建议:
1.检查算子是否运行在AICore上,这是性能出现较大差异的主要原因;
2.检查是否有不支持的算子,最好在适配Ascend910时使用Mindstudio 的Migration Tools 工具,此脚本除了自动适配modelarts外,还能发现不适配的算子,并直接以csv文件的方式给出来。
一些文档
华为文档:
MindStudio profiling 工具使用指南和参数解释:
MindStudio 工具安装使用指南:
华为Ascend实验室网络连接指南:
guide/common/tutorials/昇腾生态众智实验室网络连接指导.md · Ascend/docs-openmind - Gitee.com