基于训练和推理场景下的 MindStudio 高精度对比
本文分享自华为云社区《【MindStudio训练营第一季】MindStudio 高精度对比随笔》,作者:Tianyi_Li。
训练场景下,迁移原始网络 (如 TensorFlow、PyTorch) ,用于 NPU 上执行训练,网络迁移可能会造成自有实现的算子运算结果与用原生标准算子运算结果存在偏差。推理场景下, ATC 模型转换过程对模型进行优化,包括算子消除、算子融合算子拆分,这些优化也可能会造成自有实现的算子运算结果与原生标准算子(如 TensorFlow、ONNX、 Caffe ) 运算结果存在偏差。
为了帮助开发人员快速解决算子精度问题,需要提供自有实现的算子运算结果与业界标准算子运算结果之间进行精度差异对比的工具。
对策
精度比对工具能够帮助开发人员定位本次任务两个网络间的精度差异。准备好具腾 AI 处理器运行生成的 dump 教据与 Ground Truth 数据 (基于 GPU/CPU 运行生成的数据)后,即可进行不同算法评价指标的数据比对。
MindStudio 提供精度比对功能,支持 Vector 比对能力,支持下列算法:
余弦相似度
最大绝对误差
累积相对误差
欧氏相对距离
KL 散度…
精度比对根据推理/训练和不同的框架分为多个比对场景。
原始模型数据即为原始网络在 GPU/CPU 侧生成的数据,主要依赖原始框架中的源生能力,将模型中每一个算子节点的输入输出数据进行保存。
NPU 模型数据即为通过对原始模型的迁移或训练在县腾 A 处理器上得到的数据,主要依赖华为侧提供对应用推理及训练提供的 Dump 能力,将模型中每一个算子节点的输入输出数据进行保存。
由于 MindStudio 精度比对工具的使用约束,数据需要满足以下格式:
原始模型数据准备
以 TensorFlow 为例
在进行 TensorFlow 模型生成 npy 数据前,您需要已经有一套完整的、可执行的、标准的 TensorFlow 模型应用工程。然后利用 TensorFlow 官方提供的 debug 工具 tfdbg 调试程序,从而生成 npy 文件。通常情况下,TensorFlow 的网络实现方式主要分为 Estimator 模式和 session.run 模式,具体操作如下:
修改 tf 训练脚本,添加 debug 选项设置
执行推理或训练脚本,任务运行到前面 debug 配置后暂停
进入调试命令行交互模式后,
3.1 输入 run 命令,训练会往下执行一个 step
3.2 执行lt >tensor name
将所有 tensor 的名称暂存到文件里,在另一个窗口,在 Linux 命令下执行下述命令,用以生成在 tfdbg 命令行执行的命令:
3.3 将上一步生成的 tensor name cmd.txt 文件内容粘贴执行,即可存储所有 npy 文件,实现训练数据的 Dump。
注: 更加详细操作见《CANN 开发辅助工具指南》中“精度比对工具使用指南”章节。
NPU 模型数据准备
以推理场景为例
推理场景数据准备一 NPU 的融合后推理数据 NPU 采用 AscendCL 完成离线推理:
在代码中调用 acllnit(“./acl.json”)
acl.json 的文件内容如下:
运行推理应用,生成 dump 数据
以训练场景为例
训练场景数据准备-NPU 的迁移后网络训练数据
以 TensorFlow 为例,步骤如下:
设置“DUMP GE GRAPH=2”生成计算图文件,同时修改训练脚本,开启 dump 功能
执行训练脚本,生成 dump 数据和计算图文件
计算图文件:“ge”开头的文件,存储在训练脚本所在目录
dump 数据文件: 生成在 dump path 指定的目录下,即(dump path)/time)/(deviceid)/(model name)/(model id)/(data index) 。
选取计算图文件
可使用 grep lterator* Build.txt 命令快速查找出的计算图文件名称,如 ge proto 00005 Build.txt.
选取 dump 数据文件
打开上述计算图文件,找出第一个 graph 中的 name 字段,即为 dump 文件存放目录名称。
精度对比工具使用方法
创建对比任务
将准备好的标准数据文件与待比对数据文性作为输入文件,并配置对应的离线模型文件,通过对文件内所有参与计算的算子输入与输出进行精度比对。
整网比对在 MindStudio 界面菜单栏洗择“Ascend > Model Accuracy Analvzer > New Task 菜单,进入比对界面。
整网对比结果
整网比对结果主要分为四大展示模块:
整网对比结果表;
精度散点图;
模型可视化:
精度专家建议
精度比对工具本身只提供自有实现算子在昇腾 AI 处理器上的运算结果与业界标准算子的运算结果的差异比对功能,而输出的比对结果需要用户自行分析并找出问题。而对结果的分析工作对于用户来说也是一大难点,而专家系统工具为用户提供精度比对结果的结果分析功能,有效减少用户排查问题的时间。只需在比对操作配置任务时勾选“Advisor”选项,系统则会在比对完成后自动进行结果文件的分析,并输出优化建议。
当前支持的分析检测类型有:FP16 溢出检测、输入不一致检测、整网一致性检测(整网一致性检测包括:问题节点检测、单点误差检测和一致性检测三个小点)
这里特别说明下 FP16 溢出检测,针对比对数据中数据类型为 FP16 的数据,进行溢出检测。如果存在溢出数据,输出专家建议,示例图如下所示。
单算子对比
可针对整网任务中的某个算子进行单算子比对,分析某个算子的具体精度差异。
使用约束
精度比对功能不支持打开多个工程同时进行比对,可以先完成一个比对程序后再进行下一个。
精度比对支持的 dump 数据的类型:
特别说明
dump 文件无法通过文本工具直接查看其内容,为了查看 dump 文件内容,需要用脚本将 dump 文件转换为 numpy 格式文件后,再通过 numpy 官方提供的能力转为 txt 文档进行查看。脚本在/home/HwHiAiUser/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare
目录,名为msaccucmp.py
。举例用法如下:
调用 Python,转换 numpy 文件为 txt 文件的完整示例如下:
但转换为.txt 格式文件后,维度信息、Dtype 均不存在。详细的使用方法请参考 numpy 官网介绍。
总结
精度对比总计分为环境准备、数据准备和对比三步。
数据准备要根据推理场景和训练场景分别分析:
推理场景:准备第三方框架原始模型的 npy 数据文件与离线模型的 dump 数据文件。
训练场景:准备基于 GPU 运行生成的第三方框架原始训练网络 npy 数据文件与基于昇腾 AI 处理器运行生成的训练网络 dump 数据和计算图文件。
准备后上述步骤,可进行对比:
执行整网比对操作。
开启 MindStudio 的“Ascend > Model Accuracy Analyzer”功能,将准备好的比对数据文件配置到对应参数下并配置具体比对参数。
MindStudio 执行比对操作并输出比对结果。
比对结果专家建议(可选)。请参见比对结果专家建议。
根据分析结果定位具体问题算子。
执行单算子比对操作。
分析单算子具体问题。
最后说下 Tensor 比对,Tensor 对比提供整网比对和单算子比对两种精度比对方式,需要根据比对场景选择比对方式。其中,整网比对:将准备好的标准数据文件与待比对数据文件作为输入文件,通过对文件内所有参与计算的算子进行精度比对。而单算子比对:在整网比对的基础上指定具体算子名,对单个算子进行详细数据的比对。
个人认为,精度对比这是一个需要时间、精力和经验的操作,要充分利用好 MindStudio 工具,或查文档,或提问,可大大降低我们的工作量,提高效率。但是不得不说,这是需要一定经验的,还是要多看多学习,多试多问啊。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/a99b6e6b462ebbf1b0d0e01ca】。文章转载请联系作者。
评论