MindStudio 模型训练场景精度比对全流程和结果分析
本文分享自华为云社区《MindStudio模型训练场景精度比对全流程和结果分析》,作者:yd_247302088 。
一、基于 MindStudio 模型精度比对介绍
1.1 MindStudio 介绍
MindStudio 是一套基于华为昇腾 AI 处理器开发的 AI 全栈开发平台,包括基于芯片的算子开发、以及自定义算子开发,同时还包括网络层的网络移植、优化和分析,另外在业务引擎层提供了可视化的 AI 引擎拖拽式编程服务,极大的降低了 AI 引擎的开发门槛。MindStudio 工具中的功能框架如图 1 所示:
图 1 MindStudio 功能框架
MindStudio 工具中的主要几个功能特性如下:
工程管理:为开发人员提供创建工程、打开工程、关闭工程、删除工程、新增工程文件目录和属性设置等功能。
SSH 管理:为开发人员提供新增 SSH 连接、删除 SSH 连接、修改 SSH 连接、加密 SSH 密码和修改 SSH 密码保存方式等功能。
应用开发:针对业务流程开发人员,MindStudio 工具提供基于 AscendCL(Ascend Computing Language)和集成 MindX SDK 的应用开发编程方式,编程后的编译、运行、结果显示等一站式服务让流程开发更加智能化,可以让开发者快速上手。
自定义算子开发:提供了基于 TBE 和 AI CPU 的算子编程开发的集成开发环境,让不同平台下的算子移植更加便捷,适配昇腾 AI 处理器的速度更快。
离线模型转换:训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。
日志管理:MindStudio 为昇腾 AI 处理器提供了覆盖全系统的日志收集与日志分析解决方案,提升运行时算法问题的定位效率。提供了统一形式的跨平台日志可视化分析能力及运行时诊断能力,提升日志分析系统的易用性。
性能分析:MindStudio 以图形界面呈现方式,实现针对主机和设备上多节点、多模块异构体系的高效、易用、可灵活扩展的系统化性能分析,以及针对昇腾 AI 处理器的性能和功耗的同步分析,满足算法优化对系统性能分析的需求。
设备管理:MindStudio 提供设备管理工具,实现对连接到主机上的设备的管理功能。
精度比对:可以用来比对自有模型算子的运算结果与 Caffe、TensorFlow、ONNX 标准算子的运算结果,以便用来确认神经网络运算误差发生的原因。
开发工具包的安装与管理:为开发者提供基于昇腾 AI 处理器的相关算法开发套件包 Ascend-cann-toolkit,旨在帮助开发者进行快速、高效的人工智能算法开发。开发者可以将开发套件包安装到 MindStudio 上,使用 MindStudio 进行快速开发。Ascend-cann-toolkit 包含了基于昇腾 AI 处理器开发依赖的头文件和库文件、编译工具链、调优工具等。
1.2 精度比对介绍
自有实现的算子在昇腾 AI 处理器上的运算结果与业界标准算子(如 Caffe、ONNX、TensorFlow、PyTorch)的运算结果可能存在差异:
在模型转换过程中对模型进行了优化,包括算子消除、算子融合、算子拆分,这些动作可能会造成自有实现的算子运算结果与业界标准算子(如 Caffe、TensorFlow、ONNX)运算结果存在偏差。
用户原始网络可以迁移到昇腾 910 AI 处理器上执行训练,网络迁移可能会造成自有实现的算子运算结果与用业界标准算子(如 TensorFlow、PyTorch)运算结果存在偏差。
为了帮助开发人员快速解决算子精度问题,需要提供比对自有实现的算子运算结果与业界标准算子运算结果之间差距的工具。精度比对工具提供 Vector 比对能力,包含余弦相似度、最大绝对误差、累积相对误差、欧氏相对距离、KL 散度、标准差、平均绝对误差、均方根误差、最大相对误差、平均相对误差的算法比对维度。
二、环境准备
在进行实验之前需要配置好远端 Linux 服务器并下载安装 MindStudio。
首先在 Linux 服务器上安装部署好 Ascend-cann-toolkit 开发套件包、Ascend-cann-tfplugin 框架插件包和 TensorFlow 1.15.0 深度学习框架。之后在 Windows 上安装 MindStudio,安装完成后通过配置远程连接的方式建立 MindStudio 所在的 Windows 服务器与 Ascend-cann-toolkit 开发套件包所在的 Linux 服务器的连接,实现全流程开发功能。
接下来配置环境变量,以运行用户登录服务器,在任意目录下执行 vi ~/.bashrc 命令,打开.bashrc 文件,在文件最后一行后面添加以下内容(以非 root 用户的默认安装路径为例)。
然后执行:wq!命令保存文件并退出。
最后执行 source ~/.bashrc 命令使其立即生效。
关于 MindStudio 的具体安装流程可以参考 Windows 安装 MindStudio(点我跳转),MindStudio 环境搭建指导视频(点我跳转)。MindStudio 官方下载地址:点我跳转。
本文教程基于 MindStudio5.0.RC2 x64,CANN 版本 5.1.RC2 实现。
三、准备基于 GPU 运行生成的原始训练网络 npy 数据文件
3.1 获取项目代码
本样例选择 resnet50 模型,利用 git 克隆代码(git clone -b r1.13.0 https://github.com/tensorflow/models.git),下载成功后如下图所示:
3.2 生成数据前处理
数据比对前,需要先检查并去除训练脚本内部使用到的随机处理,避免由于输入数据不一致导致数据比对结果不可用。
编辑 resnet_run_loop.py 文件,修改如下(以下行数仅为示例,请以实际为准):
注释掉第 83、85 行
注释掉第 587~594 行
第 607 行,修改为“return None”
编辑 cifar10_main.py 文件,将 train_epochs 的值改为 1。
3.3 生成 npy 文件
进入训练脚本所在目录(如“~/models/official/resnet”),修改训练脚本,添加 tfdbg 的 hook。编辑 resnet_run_loop.py 文件,添加如下加粗字体的信息。
配置环境变量
执行训练脚本
训练任务停止后,在命令行输入 run,训练会往下执行一个 step。
执行 lt>gpu_dump 命令将所有 tensor 的名称暂存到自定义名称的 gpu_dump 文件里。命令行中会有如下回显。
另外开启一个终端,在 linux 命令行下进入 gpu_dump 文件所在目录,执行下述命令,用以生成在 tfdbg 命令行执行的命令。
timestamp=$[$(date +%s%N)/1000] ; cat gpu_dump | awk '{print "pt",$4,$4}' | awk '{gsub("/", "_", $3);gsub(":", ".", $3);print($1,$2,"-n 0 -w "$3".""'$timestamp'"".npy")}'>dump.txt
将上一步生成的 dump.txt 文件中所有 tensor 存储的命令复制(所有以“pt”开头的命令),然后回到 tfdbg 命令行(刚才执行训练脚本的控制台)粘贴执行,即可存储所有的 npy 文件,存储路径为训练脚本所在目录。
退出 tfdbg 命令行,将生成的 npy 文件保存到 tf_resnet50_gpu_dump_data(用户可自定义)目录下。
四、准备基于 NPU 运行生成的训练网络 dump 数据和计算图文件
4.1 分析迁移
单击菜单栏“File > New > Project...”弹出“New Project”窗口。
在 New Project 窗口中,选择 Ascend Training。输入项目的名称、CANN 远程地址以及本地地址。点击 Change 配置 CANN,如下图所示:
Name:工程名称,可自定义。
Description:工程描述,可按需补充关于工程的详细信息。
CANN Version:CANN 软件包版本,如未识别或想要更换使用的版本,可单击“Change”,在弹出界面中选择 Ascend-cann-toolkit 开发套件包的安装路径(注意需选择到版本号一级)。
Project Location:工程目录,默认在“$HOME/AscendProjects”下创建。
点击右侧 + 进行配置远程服务器,如下图所示:
在出现的信息配置框输入相关配置信息,如下图所示:
输入服务器的 SSH 信息,如果测试连接失败,建议使用 CMD 或 XShell 等工具进行排查。
选择远程 CANN 安装位置,如下图所示:
在 Remote CANN location 中选择 CANN 的路径,需要注意的是必须选择到 CANN 的版本号目录,这里选择的是 5.1.RC2 版本,如下图所示:
点击确定后,需要等待 MindStudio 进行文件同步操作,这个过程会持续数分钟,期间如果遇到 Sync remote CANN files error.错误,考虑是否无服务器 root 权限。
配置完成 CANN 点击下一步
在训练工程选择界面,选择“TensorFlow Project”,单击“Finish”。
进入工程界面,单击工具栏中
按钮( TensorFlow GPU2Ascend 工具)。
进入“TensorFlow GPU2Ascend”参数配置页,配置 command file
Command File:tfplugin 插件包中的工具脚本文件。
Input Path:待转换脚本文件的路径。
Output Path:脚本转换后的输出路径。
根据 tfplugin 文件所在路径选择/Ascend/tfplugin/5.1.RC2/python/site-packages/npu_bridge/convert_tf2npu/main.py,如下图所示
同样的,选择下载的代码路径作为 input path,并选择输出路径,如下图所示:
点击 Transplant 进行转换,如下图所示:
出现“Transplant success!”的回显信息,即转换成功。如下图所示:
4.2 生成 dump 数据和计算图文件
步骤一 dump 前准备。
编辑 resnet_run_loop.py 文件,修改如下(以下行数仅为示例,请以实际为准):
注释掉第 83、85 行
把 max_steps 设置为 1。
注释掉第 575~582 行
注释掉第 595 行,修改为“return None”。
编辑 cifar10_main.py 文件,将 train_epochs 的值改为 1。
步骤二 dump 参数配置。
为了让训练脚本能够 dump 出计算图,我们在训练脚本中的包引用区域引入 os,并在构建模型前设置 DUMP_GE_GRAPH 参数。配置完成后,在训练过程中,计算图文件会保存在训练脚本所在目录中。
编辑 cifar10_main.py,添加如下方框中的信息。
修改训练脚本(resnet_run_loop.py),开启 dump 功能。在相应代码中,增加如下方框中的信息。
步骤三 环境配置。
单击 MindStudio 菜单栏“Run > Edit Configurations...”。
进入运行配置界面,选择迁移后的训练脚本。
配置环境变量,打开下图所示界面,配置训练进程启动依赖的环境变量,参数设置完成后,单击“OK”,环境变量配置说明请参见下表。
环境变量的解释如下表所示:
步骤四 执行训练生成 dump 数据。
点击按钮开始训练
训练时控制台输出如下所示:
resnet 目录下生成的数据文件展示如下:
在所有以“_Build.txt”为结尾的 dump 图文件中,查找“Iterator”这个关键词。记住查找出的计算图文件名称,用于后续精度比对。
如上图所示,“ge_proto_00000343_Build.txt”文件即是我们需要找到的计算图文件。将此文件拷贝至用户家目录下,便于在执行比对操作时选择。
打开上面找到的计算图文件,记录下第一个 graph 中的 name 字段值。如下示例中,记录下“ge_default_20220926160231_NPU_61”。
进入以时间戳命名的 dump 文件存放路径下,找到刚记录的名称为 name 值的文件夹,例如 ge_default_20220926160231_NPU_61,则下图目录下的文件即为需要的 dump 数据文件:
五 比对操作
在 MindStudio 菜单栏选择“Ascend > Model Accuracy Analyzer > New Task”,进入精度比对参数配置界面。
配置 tookit path,点击文件标识,如下图所示:
选择对应的版本,如 5.1.RC2 版本,单击 ok:
单击 next 进入参数配置页面:
接着填写 gpu 和 npu 的数据的相关信息,如下图所示:
参数解释如下所示:
点击 start:
结果展示:
如上图所示将 Vector 比对结果界面分为四个区域分别进行介绍。
表 1 精度比对分析界面字段说明
表 2 散点分布图字段说明
六、常见问题 & 解决方案汇总
Q:tfdbg 复制 pt 命令时执行出错
A:由于 tfdbg 将多行的 pt 命令识别为了单个命令,使得命令执行失败。解决办法如下:
先退出 tfdbg 命令行
安装 pexpect 库,命令为 pip install pexpect --user(--user 只针对普通用户,root 用户是没有的)
进入 resnet 所在的目录,cd ~/models/official/resnet
确保目录下有 dump.txt 文件,即生成的 pt 命令
编写下述代码,vim auto_run.py
import pexpect
import sys
cmd_line = 'python3 -u ./cifar10_main.py'
tfdbg = pexpect.spawn(cmd_line)
tfdbg.logfile = sys.stdout.buffer
tfdbg.expect('tfdbg>')
tfdbg.sendline('run')
pt_list = []
with open('dump.txt', 'r') as f:
for line in f:
pt_list.append(line.strip('\n'))
for pt in pt_list:
tfdbg.expect('tfdbg>')
tfdbg.sendline(pt)
tfdbg.expect('tfdbg>')
tfdbg.sendline('exit')
保存退出 vim,执行 python auto_run.py
七、从昇腾官方体验更多内容
更多的疑问和信息可以在昇腾论坛进行讨论和交流:https://bbs.huaweicloud.com/forum/forum-726-1.html
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/47e48551a54398aefff9be006】。文章转载请联系作者。
评论