• [问题求助] 请问acl/acl_tdt.h文件位于哪个软件包?
    这几天在构建支持tensorflow 2.6.5版本的镜像,需要编译tf_adapter_2.x,报fatal error: acl/acl_tdt.h: No such file or directory查阅CMakeLists.txt文件发现该文件应该位于/usr/local/Ascend/runtime下面,但是我的环境下(已经安装了nnae和tfplugin)并没有此文件想知道这个文件是哪个软件包里带的?​​​tf_adapter_2.x · Ascend/tensorflow - 码云 - 开源中国 (gitee.com)
  • [问题求助] tensorflow 迁移Ascend910 问题 求助大佬!!
    求教各位大佬 !!!为啥我用自动迁移工具迁移tensorflow的程序 模型训练运行后只有 HBM在使用 为啥没使用到AI core呢??我的是一个LSTM的预测模型 调用不到AI -core 很困惑
  • [问题求助] operator api 中的 tensordesc类中的 GetSize()函数返回的数据大小的单位是什么?
    如题,算子校验中想测试输入数据是否大于4GB,若大于则返回错误,想了解一下 GetSize()函数返回的数据大小的单位是什么
  • [经验分享] 基于MindStudio的PyTorch模型开发 使用Profiling性能调优
    本文的视频讲解可以在以下链接观看:https://www.bilibili.com/video/BV1HP4y1f7ev?spm_id_from=333.999.0.0&vd_source=18d17b9159b860c92bf39cce650c8ae1PyTorch模型开发使用Profiling性能调优Profiling工具的简要介绍MindStudio针对昇腾AI处理器提供高效、易用的系统化性能分析工具Profiling 。该工具实现了Host+Device侧丰富的性能数据采集能力和全景Timeline交互分析能力,展示Host+Device侧各项性能指标,帮助用户快速发现和定位AI应用、芯片及算子的性能瓶颈。包括资源瓶颈导致的AI算法短板,指导算法性能提升和系统资源利用率的优化。Profiling提供针对APP工程的硬件和软件性能数据采集、分析、汇总展示。总体流程如下:运行Profiling采集性能数据。用户在配置界面开启Profiling开关(推理场景需确保APP工程可正常执行;训练场景直接执行采集)。MindStudio编译当前工程生成可执行文件,并将可执行文件拷贝到设备侧,MindStudio向Profiling工具下发数据采集指令,由Profiling工具完成Device侧和Host侧数据采集任务,采集结束后,将生成的数据文件拷贝到MindStudio侧。MindStudio查询并解析数据。Profiling采集结束后,MindStudio调用Profiling工具接口查询数据,并将数据以json格式存储在“.mindstudio/profiler/data/profiling_out/PROF_XXX”目录下。MindStudio展示性能数据。MindStudio通过对json文件做数据处理,生成前端展示视图数据。(源自:cid:link_2 )二、Profiling针对硬件和软件性能数据采集、分析、汇总展示Profiling提供针对硬件和软件性能数据采集、分析、汇总展示。总体流程如下:1 使用前准备首先完成推理场景下工程文件的开发,并通过MindStudio编译、运行,确保工程项目正常运行。开发过程可参考官方应用开发教程:cid:link_32. Profiling数据采集通过以下操作方法启动Profiling:1)在欢迎界面的左侧导航栏单击“Projects”,单击选择并打开已编译完成的工程。图1 选择并打开已编译完成的基于pytorch框架的Ghostnet工程2)单击菜单栏“Ascend > System Profiler > New Project”,弹出Profiling配置窗口。图2 Profiling配置窗口3)进入Profiling配置窗口,如图3。配置“Project Properties”,配置工程名称“Project Name”和选择工程路径“Project Location”。单击“Next”进入下一步。图3 Project Properties配置参数说明Project NameProfiling工程名称,用户自定义。Project LocationAI工程路径。推理场景时,指定推理应用工程路径;训练场景时,指定训练工程路径。4)进入“Executable Properties”配置界面,在Linux环境下可选择Remote Run和Local Run两种模式,但在Windows使用场景下仅支持Remote Run,并根据指定的工程目录(App Projet Path)识别对应的工程类型。Remote Run下的推理算子工程如下图所示。图4 Remote Run(推理算子工程)参数说明Deployment运行配置,选择Remote Run模式时可见,必选配置。通过Deployment功能,可以将指定项目中的文件、文件夹同步到远程指定机器的指定目录。App Project Path执行Profiling目标工程目录,必选配置。可根据指定的目标工程识别工程类型为:Ascend App:表示指定的目标工程为推理应用工程。Ascend Operator:表示指定的目标工程为推理算子工程。Ascend Training:表示指定的目标工程为训练工程,此时可直接单击“start”按钮启动Profiling。Executable File执行Profiling目标工程的可执行文件目录,必选配置。需指定为App Project Path的子目录。支持指定二进制脚本文件、Python脚本文件和Shell脚本文件。指定Python脚本文件时由于msprof工具的限制有如下要求:1)acl工程中的Python脚本中的路径信息必须为绝对路径。2)不支持异步接口(接口名以async结尾)的调用。3)不支持Profiling的Remote Run模式进行采集。指定Shell脚本文件由用户自行提供,且无需指定为App Project Path的子目录。Command Arguments用户APP的执行参数,由用户自行配置,参数之间用空格分隔,默认为空。Environment Variables环境变量配置。可以直接在框中输入也可以单击后在出的弹窗内单击填写。可选配置。Remote Toolkit Path远端运行环境toolkit软件包安装路径,选择Remote Run模式时可见,必选配置。例如配置为/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit。5)进入“Profiling Options”配置界面,其中配置AI Core Profiling时可分别设置为Task-based和Sample-based场景,此处我们选择Task-based场景。如图5所示。图5 Task-based场景参数说明AI Core ProfilingTask-BasedAI Core采集开关,以task为粒度进行性能数据采集。Pipeline Utilization:采集计算单元和搬运单元耗时占比。Arithmetic Utilization:cube和vector的指令类型耗时占比。UB/L1/L2/Main Memory Bandwidth:UB/L1/L2/主存储器采集内存读写带宽速率。L0A/L0B/L0C Memory Bandwidth: L0A/L0B/L0C采集内存读写带宽速率。UB Memory Bandwidth:mte/vector/scalar采集ub读写带宽速率。Sample-BasedAI Core采集开关,以固定的时间周期(AI Core-Sampling Interval)进行性能数据采集。Pipeline Utilization:采集计算单元和搬运单元耗时占比。Arithmetic Utilization:cube和vector的指令类型耗时占比。UB/L1/L2/Main Memory Bandwidth:UB/L1/L2/主存储器采集内存读写带宽速率。L0A/L0B/L0C Memory Bandwidth: L0A/L0B/L0C采集内存读写带宽速率。UB Memory Bandwidth:mte/vector/scalar采集ub读写带宽速率。Frequency(hz):采集频率,默认值为100,单位hz。MsprofTXMsprofTX控制msproftx用户和上层框架程序输出性能数据采集的开关。API TraceAscend APIAscendCL(Ascend Compute Language)采集开关,采集接口流水信息。可选配置,默认勾选。Runtime APIRuntime采集开关,采集运行管理器接口流水信息。可选配置,默认勾选。OS Runtime API系统运行时函数库API和Pthreads API的调用。可选配置,默认勾选。Graph Engine (GE)Graph Engine采集开关,采集模型图引擎调度流水信息。可选配置。AICPU OperatorsAI CPU采集开关,采集aicpu数据增强的Profiling数据。Device System SamplingDDR采集DDR数据。可选配置,默认勾选。可以更改采样频率Frequency(hz),默认频率为50Hz。Host System SamplingCPU采集Host侧CPU资源利用率信息。可选配置,默认勾选。Memory采集Host侧Memory资源利用率信息。可选配置。Disk采集Host侧Disk资源利用率信息。可选配置。Network采集Host侧Network资源利用率信息。可选配置。HCCLHCCL控制HCCL数据采集开关。当前采集完成HCCL数据后默认仅导出最小模型号(Model ID)的第一轮迭代数据。6)完成上述配置后单击窗口右下角的“Start”按钮,启动Profiling。工程执行完成后,MindStudio窗口下方自动展示Profiling结果视图。三、完成服务端Profiling工具的依赖安装iotop、ltrace、perf等依赖非必要安装,如需采集OS Runtime API则要求安装。(OS Runtime API:系统运行时函数库API和Pthreads API的调用。默认勾选。)我们在Ubuntu 18.04操作系统下进行测试,执行以下命令安装。1. iotop工具安装方法:此处以python3为例进行介绍,若用户使用其他版本Python,请自行适配。wget http://guichaz.free.fr/iotop/files/iotop-0.6.tar.bz2tar -xvf iotop-0.6.tar.bz2cd iotop-0.6sed -i 's/itervalues/values/g' setup.pypython3 setup.py buildpython3 setup.py installln -s /usr/local/python3/sbin/iotop /usr/sbin/iotopln -s /usr/local/python3/bin/iotop /usr/bin/iotop配置结果如图6所示:图6 iotop工具安装结果2. perf工具安装方法:apt-get install linux-tools-common安装结果如图7所示:图7 perf工具安装结果安装完成后执行perf命令,根据系统提示继续使用apt-get install安装linux-tools-x和linux-cloud-x执行perf命令结果如图8所示:图8 执行perf命令结果按照提示,使用apt-get install安装linux-tools-4.15.0-156-generic和linux-cloud-4.15.0-156-generic。安装结果如图9和图10所示图9 linux-tools-4.15.0-156-generic安装结果图10 linux-cloud-tools-4.15.0-156-generic安装结果3. ltrace工具安装方法:apt-get install ltrace安装结果如图11所示:图11 ltrace工具安装结果四、以Ghostnet网络模型为例演示Profiling数据采集流程1)启动MindStudio,单击选择并打开已编译完成的工程。如图12所示。图12 打开已编译完成的工程2)单击菜单栏“Ascend > System Profiler > New Project”,弹出Profiling配置窗口。3)进入Profiling配置窗口,配置Profiling的工程名称“Project Name”和选择Profiling工程的结果路径“Project Location”。单击“Next”进入下一步。4)进入“Executable Properties”配置界面。指定执行Profiling目标工程的可执行文件目录。如图13所示。图13 Remote Run5)进入“Profiling Options”配置界面,选择Task-based场景。6)完成上述配置后单击窗口右下角的“Start”按钮,启动Profiling。如图14所示,即为运行成功。五、以Ghostnet网络模型为例演示解析profiling数据的流程工程执行完成后,MindStudio窗口下方自动展示Profiling结果视图。单击Timeline视图下方数据窗格的Statistics视图中aclmdExecute接口体现网络整体运行时间达到了4.02s,单击AI Core Metrics视图查看。图15 ghostnet网络应用推理运行结果_Statistics图16 ghostnet网络应用推理运行结果_AI Core Metrics六、对Merge Reports,TimeLine View, Analysis Summary, Baseline Comparison的作用进行详述1.Merge reports本功能的作用是对于Profiling采集后的性能原始数据通过MindStudio界面进行解析并展示。配置步骤如下:(1)单击菜单栏“Ascend > System Profiler > Merge Reports”,弹出Merge Reports配置窗口 。(2)配置Merge Reports的数据源输入路径、数据输出路径以及输出展示的Json文件名。如图17所示。图17 Merge Reports配置参数说明Input directory数据源输入路径。指定为msprof命令指定的数据输出路径。Output directory数据输出路径。Output Json name输出展示的Json文件名。2.TimeLine Viewa. Timeline颜色配置在MindStudio菜单栏选择“Ascend > System Profiler > Timeline Color”,或者在打开的Project Explorer界面上单击左上角的图标。Timeline颜色配置窗口如图18所示。图18 Timeline颜色配置可以根据API执行时间自定义配置Timeline中的颜色显示比例,显示格式为:绿色 a% ≤ 黄色 < b% ≤ 红色,此设置的数值表示在Profiling采集过程中接口运行时间的耗时占比。耗时占比小于等于5%的时间线显示为绿色,耗时占比在5%~10%的时间线显示为黄色,耗时占比超过10%的时间线显示为红色。(注:配置颜色比例的数值最多可精确到小数点后两位)b. TimeLine视图TimeLine View包含左侧导航窗格、右侧图形化窗格和下方数据窗格。导航窗格显示各个Timeline的名称,以及各个Timeline之间的从属关系;图形化窗格对应导航窗格,逐行对Timeline进行图形化展现;数据窗格以表格的形式呈现Profiling采集之后的各项数据,分为Event View、Statistics和AI Core Metrics。说明Profiling数据中涉及到的时间节点(非Timestamp)为系统单调时间只与系统有关,非真实时间。“Start Time”和“End Time”表示本次性能采集数据的展示时间范围。“Current Time”表示鼠标所在时间块的开始时间。将鼠标移动到具体采样点,可以查看对应采样点具体分析数据。在左侧导航窗格中右键标签名,选择“Show in Event View”,可以在Event View界面中看到对应选项Timeline的顺序执行信息。在TimeLine中可以查看对应的API或操作的名称。同一线程中有多个OS Runtime API同时执行时会分行显示。同一Stream中有多个AI Core task同时执行时会分行显示。当选中TimeLine中某个时间点时,按住Ctrl键并向上/下滚动鼠标滑轮或点击视图右上角的/,实现Timeline视图的放大/缩小。点击视图右上角的实现视图复位。当选中TimeLine中某个时间点时,可通过左右拖拉鼠标选择时间长度。以Current Time(us)为界点,鼠标向右拖动时间段显示为正,向左拖动时间段显示为负。在Profiling运行完成后,以时序图的呈现方式为用户提供全流程推理/训练过程中的运行情况,按照调度流程OS Runtime、ACL API、Runtime API、Graph Engine(GE)、A ICPU task、AI Core task和System task来呈现整体的运行状况。实际展示情况与Profiling采集时的所选项以及设备有关,请以设备实际情况为准。OS Runtime:展示每个线程调用OS Runtime的时序信息。ACL API:展示模型、算子、Runtime API等耗时数据。如果没有某一类数据则不显示。Runtime API:展示每个线程调用runtime API的时序信息。GE:展示模型的数据输入、推理、数据输出耗时。Step Trace:迭代轨迹数据,每轮迭代的耗时。AI Core task:展示每个Stream的AI Core task时序信息。System task:展示每个Stream的System task时序信息。c. Event视图在TimeLine View界面的左侧导航窗格中右键标签名,选择“Show in Event View”,可以在下方数据窗格的Event View中看到对应选项Timeline的顺序执行信息,操作如图19所示。图19 Show in Event View可查看项目包括:Process > Thread > Os RuntimeProcess > Thread > ACL API(model/runtime)Process > Thread > Runtime APINPU 0> Stream > AI Core task图20 ACL API(model/runtime)字段名字段解释IDACL API的ID。NameACL API的名称。Start Time(us)ACL API的开始运行时间,单位为us。End Time(us)ACL API的结束运行时间,单位为us。Duration(us)ACL API的运行耗时,单位为us。Process IDACL API对应进程ID。Thread IDACL API对应线程ID。图21 Runtime API字段名字段解释IDRuntime API的ID。NameRuntime API的名称。Start Time(us)Runtime API的开始运行时间,单位为us。End Time(us)Runtime API的结束运行时间,单位为us。Duration(us)Runtime API的运行耗时,单位为us。Process IDRuntime API对应进程ID。Thread IDRuntime API对应线程ID。图22 Os Runtime字段名字段解释IDOs Runtime的ID。NameOs Runtime的名称。Start Time(us)Os Runtime的开始运行时间,单位为us。End Time(us)Os Runtime的结束运行时间,单位为us。Duration(us)Os Runtime的运行耗时,单位为us。Process IDOs Runtime对应进程ID。Thread IDOs Runtime对应线程ID。图23 AI Core task字段名字段解释IDAI Core task的ID。Device IDAI Core task运行所在设备ID。Op NameAI Core task的算子名称。Start Time(us)AI Core task的开始运行时间,单位为us。End Time(us)AI Core task的结束运行时间,单位为us。Duration(us)AI Core task的运行耗时,单位为us。StatusAI Core task的运行状态。Task TypeAI Core task的任务类型。Stream IDAI Core task的stream ID。Task IDAI Core task的task ID。d. Statistics视图单击下方数据窗格的Statistics,通过左上角下拉框选择不同类别的数据,可以查看ACL API、OS Runtime API、Runtime API、OPs和Op Info调用情况数据。图24 ACL API图25 OS Runtime API字段名字段解释Name对应调用API名称。Type(仅ACL API)调用ACL API的类型。Time(%)对应调用API总时间占比。Time(us)对应调用API时间长度,单位为us。可以点击字段旁边的三角号根据此项进行降序或升序排列。Count对应API调用次数。Avg(us)对应API单次调用平均时间,单位为us。Min(us)对应API单次调用最短时间,单位为us。Max(us)对应API单次调用最长时间,单位为us。Process ID对应调用API所在进程ID。Thread ID对应调用API所在线程ID。图26 Runtime APITime(%)对应调用API总时间占比。Time(ns)对应调用API时间长度,单位为ns。可以点击字段旁边的三角号根据此项进行降序或升序排列。Calls调用Runtime API的呼叫次数。Avg(ns)对应API单次调用平均时间,单位为ns。Min(ns)对应API单次调用最短时间,单位为ns。Max(ns)对应API单次调用最长时间,单位为ns。Process ID对应调用API所在进程ID。Thread ID对应调用API所在线程ID。图27 OPs(昇腾310 AI处理器)字段名字段解释Time(%)对应调用API总时间占比。Time(us)对应调用API时间长度,单位为us。可以点击字段旁边的三角号根据此项进行降序或升序排列。Count对应的Task被执行的次数。Avg(us)对应Task平均执行时间,单位为us。Min(us)对应Task最短执行时间,单位为us。Max(us)对应Task最长执行时间,单位为us。Waiting(us)对应Task总计waiting时间,单位为us。Running Man(us)对应Task总计running时间,单位为us。表示Task的实际运行时间,过长的Task运行时间可能意味着算子实现存在问题。Pending(us)对应Task总计pending时间,单位为us。Type对应Task的类型。API调用的接口。Task IDTask ID,用于识别task。Op Name算子名称。Stream IDStream ID,用于识别stream。图28 Op Info字段名字段解释Model Name模型名称。推理应用中存在离线模型调用时(ACL函数接口:aclModelExecute),本参数展示;不存在离线模型调用时,本参数不展示。Task IDTask ID,用于识别task。Stream IDStream ID,用于识别stream。Op Name算子名称。Op Type算子类型。Task Start TimeTask的开始运行时间。Task Duration(us)Task的运行耗时,单位为us。Task Wait Time(us)上一个Task的结束时间与当前Task的开始时间间隔,单位为us。Block DimTask运行时所在的核。Input Shapes算子的输入维度。Input Data Types算子输入的数据类型。Input Formats算子输入格式。Output Shapes算子的输出维度。Output Data Types算子输出的数据类型。Output Formats算子输出格式。Aicore Time(us)(仅采集方式为Task-Based时展示)AI Core运行时间,单位为us。Total Cycles(仅采集方式为Task-Based时展示)该Task的所有指令的cycle总数。e. AI Core Metrics视图单击下方数据窗格的AI Core Metrics,可以查看AI Core Metrics数据。图29 AI Core MetricsTask Wait Time(us)任务等待时间,单位为us。Aicore Time(us)AI Core运行时间,单位为us。Total Cycles该Task的所有指令的cycle总数。vec_time(us)vec类型指令(向量类运算指令)耗时,单位为us。vec_ratiovector类型指令(向量类运算指令)的cycle数在所有指令的cycle数中的占用比。mac_time(us)cube类型指令(矩阵类运算指令)耗时,单位为us。mac_ratiocube类型指令(矩阵类运算指令)的cycle数在所有指令的cycle数中的占用比。scalar_time(us)scalar类型指令(标量类运算指令)耗时,单位为us。scalar_ratioscalar类型指令(标量类运算指令)的cycle数在所有指令 的cycle数中的占用比。mte1_time(us)mte1类型指令(L1->L0A/L0B搬运类指令)耗时,单位为us。mte1_ratiomte1类型指令(L1->L0A/L0B搬运类指令)的cycle数在所 有指令的cycle数中的占用比。mte2_time(us)mte2类型指令(DDR->AI Core搬运类指令)耗时,单位为us。mte2_ratiomte2类型指令(DDR->AI Core搬运类指令)的cycle数在 所有指令的cycle数中的占用比。mte3_time(us)mte3类型指令(AI Core->DDR搬运类指令)耗时,单位为us。mte3_ratiomte3类型指令(AI Core->DDR搬运类指令)的cycle数在 所有指令的cycle数中的占用比。icache_miss_rateicache缺失率,即未命中icache,数值越小越好。memory_bound用于识别AI Core执行算子计算过程是否存在Memory瓶颈,由Mte2 Ratio/max(Mac Ratio, Vec Ratio)计算得出。计算结果小于1, 表示没有Memory瓶颈;计算结果大于1 则表示有Memory瓶颈,且数值越大越瓶颈严重。3.Analysis Summary在“Analysis Summary”模块中,选择需要查看的Device ID后,可以查看对应device的详细性能分析信息。图30 Analysis Summary视图Profiling InfoResult Size结果文件大小。Profiling Elapsed Time信息采集持续的时间。Host System InfoCpu NumCPU数量。Host Operating SystemHost侧操作系统信息。Host Computer NameHost侧电脑名称。Host CPU InfoCPU IDCPU ID。NameCPU名称。TypeCPU型号。FrequencyCPU频率。部分系统由于不存在调用频率的接口,故不展示此参数,本参数展示情况请以实际情况为准。Logical CPU Count逻辑CPU数量。Device InfoAI Core NumberAI Core 数量。AI CPU NumberAI CPU数量。Control CPU NumberControl CPU数量。Control CPU TypeControl CPU型号。Device Id当前页面关联的Device IDTS CPU NumberTS CPU数量。DDRMetricBandWidth,单位为MB/s。Read(MB/s)读带宽,单位为MB/s。Write(MB/s)写带宽,单位为MB/s。AI Core UtilizationAI Core利用率通过折线图方式呈现(AI Core Utilization参数选择Sample-based才会展示)4.Baseline ComparisonProfiling报告可以通过对比功能将两份报告的结果数据进行比对,并在Baseline Comparison(基准分析)视图展示。方便在重复执行Profiling之后产生多个报告后,对比相同情况下多次采集的数据之间的变化情况。如图31在打开的Profiling报告中选择Baseline Comparison视图,单击Baseline file path右侧文件夹按钮,如图32选择需要与当前报告比对的基线数据报告(.json文件)。图31 Baseline Comparison视图图32 选择基线数据报告两份报告比对结果如图33和图34,以Baseline file path所选报告的数据为基础,比对当前报告的数值以增减相应差值展示。图33 Task-based场景比对结果图34 Sample-based场景比对结果说明Baseline Comparison仅比对OPs和AI Core Metrics的结果数据。Baseline Comparison仅支持相同Device ID的Profiling结果数据对比。结果数据比对的差值保留小数点后两位。Profiling elapsed time表示当前Device下本次Profiling执行采集的时间。一般情况下两份报告之间须在相同设备、模型以及采集参数下的两次Profiling生成的数据,否则结果数据不匹配无法比较,并给出相应告警提示;但如果两个不同设备或模型采集的数据完全相同,也可以进行比较。Sample-based场景展示AI Core Utilization的折线图比对结果。七、以Ghostnet网络模型执行完成后自动展示的Profiling的结果试图为例,分析网络存在的问题并进行相应优化工程执行完成后,MindStudio自动展示Profiling结果视图。如图35所示。图35 Profiling分析结果查看Timeline颜色配置调色板,默认显色比例为5%<=黄色<10%<=红色,如图36所示。通过视图我们可以直观的看到任务耗时均为绿色片段,即不存在耗时远超其他的时间片段。我们接着在ACL API字段上右键点击Show in Event View并将Duration列按从大到小排序。如图37所示。图37 Event View可以看到耗时最高的ACL接口为aclmdlExcute。我们继续查看ACL API的Statistics视图并按接口调用耗时占比从高到底排序。如图38所示。图38 Statistics视图到这里我们可以断定执行应用推理过程中耗时最高的接口就是aclmdlExcute。参见《应用软件开发指南(C&C++)》中的“AscendCL API参考”章节查找aclmdlExecute接口的作用为“执行应用推理,直到返回推理结果,同步接口”。我们可以发现该接口是执行接口,也就是说应用在执行推理的过程中确实存在耗时长的问题。而模型中所有算子执行的时间总和就是执行耗时。那么我们查看Profiling结果的AI Core Metrics中的算子执行耗时并按Task Duration算子执行任务的时间从高到低排列。如图39所示。图39 AI Core Metrics可以看到每个算子的执行时间与同进程下其他算子的执行时间都相差不大。到此Profiling性能分析工具的任务已经完成。结论通过上述分析可以发现,该版本的基于pytorch框架的Ghostnet网络模型中并不存在耗时远超同进程下其他的算子,各算子执行时间比较均衡,我们认为可优化空间较小。
  • [经验分享] 基于MindStudio的TensorFlow模型开发 使用Profiling进行性能调优
    本文的视频讲解可在以下链接观看:cid:link_0TensorFlow模型开发使用Profiling进行性能调优一、Profiling工具的简要介绍MindStudio针对昇腾AI处理器提供的高效、易用的系统化性能分析工具Profiling,便于快速识别产品的关键性能瓶颈并提出针对性能优化的建议,显著提升AI任务调优效率,最终实现产品的极致性能。Profiling提供针对APP工程的硬件和软件性能数据采集、分析、汇总展示。总体流程如下:1. 运行Profiling采集。确保APP工程可正常执行的条件下,用户在配置界面开启Profiling开关。2. Profiling采集性能数据。MindStudio编译当前工程生成可执行文件,并将可执行文件拷贝到设备侧,MindStudio向Profiling工具下发数据采集指令,由Profiling工具完成设备侧数据采集任务,采集结束后,将生成的数据文件拷贝到MindStudio侧。3. MindStudio查询并解析数据。Profiling采集结束后,MindStudio调用Profiling工具接口查询数据,并将数据以json格式存储在“工程目录~/profiling ”目录下。4. MindStudio展示性能数据。MindStudio通过对json文件做数据处理,生成前端展示视图数据,此时用户可通过右键单击工程文件名并选择“View Profiling Result”菜单进行数据图形化展示。(来源cid:link_2)二、Profiling针对硬件和软件性能数据采集、分析、汇总展示Profiling提供针对硬件和软件性能数据采集、分析、汇总展示。总体流程如下:1. 使用前准备首先完成推理场景下工程文件的开发,并通过MindStudio编译、运行,确保工程项目正常运行。开发过程可参考官方应用开发教程:cid:link_12. Profiling数据采集通过以下操作方法启动Profiling:1)在欢迎界面的左侧导航栏单击“Projects”,单击选择并打开已编译完成的工程。图1 选择并打开已编译完成的工程2)单击菜单栏“Ascend > System Profiler > New Project”,弹出Profiling配置窗口。图2 Profiling配置窗口3)进入Profiling配置窗口,如图3。配置“Project Properties”,配置工程名称“Project Name”和选择工程路径“Project Location”。单击“Next”进入下一步。图3 Project Properties配置参数说明Project NameProfiling工程名称,用户自定义。Project LocationAI工程路径。推理场景时,指定推理应用工程路径;训练场景时,指定训练工程路径。4)进入“Executable Properties”配置界面,在Linux环境下可选择Remote Run和Local Run两种模式,但在Windows使用场景下仅支持Remote Run,并根据指定的工程目录(App Projet Path)识别对应的工程类型。Remote Run下的推理算子工程如下图所示。图4 Remote Run(推理算子工程)表1 Executable Properties参数说明参数说明Deployment运行配置,选择Remote Run模式时可见,必选配置。通过Deployment功能,可以将指定项目中的文件、文件夹同步到远程指定机器的指定目录。App Project Path执行Profiling目标工程目录,必选配置。可根据指定的目标工程识别工程类型为:Ascend App:表示指定的目标工程为推理应用工程。Ascend Operator:表示指定的目标工程为推理算子工程。Ascend Training:表示指定的目标工程为训练工程,此时可直接单击“start”按钮启动Profiling。Executable File执行Profiling目标工程的可执行文件目录,必选配置。需指定为App Project Path的子目录。支持指定二进制脚本文件、Python脚本文件和Shell脚本文件。指定Python脚本文件时由于msprof工具的限制有如下要求:1)acl工程中的Python脚本中的路径信息必须为绝对路径。2)不支持异步接口(接口名以async结尾)的调用。3)不支持Profiling的Remote Run模式进行采集。指定Shell脚本文件由用户自行提供,且无需指定为App Project Path的子目录。Command Arguments用户APP的执行参数,由用户自行配置,参数之间用空格分隔,默认为空。Environment Variables环境变量配置。可以直接在框中输入也可以单击后在出的弹窗内单击填写。可选配置。Remote Toolkit Path远端运行环境toolkit软件包安装路径,选择Remote Run模式时可见,必选配置。例如配置为/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit。5)进入“Profiling Options”配置界面,其中配置AI Core Profiling时可分别设置为Task-based和Sample-based场景,此处我们选择Task-based场景。如图5所示。图5 Task-based场景表2 Profiling Options参数说明参数说明Device System SamplingDDR采集DDR数据。可选配置,默认勾选。可以更改采样频率Frequency(hz),默认频率为50Hz。Host System SamplingCPU采集Host侧CPU资源利用率信息。可选配置,默认勾选。Memory采集Host侧Memory资源利用率信息。可选配置。Disk采集Host侧Disk资源利用率信息。可选配置。Network采集Host侧Network资源利用率信息。可选配置。HCCLHCCL控制HCCL数据采集开关。当前采集完成HCCL数据后默认仅导出最小模型号(Model ID)的第一轮迭代数据。6)完成上述配置后单击窗口右下角的“Start”按钮,启动Profiling。工程执行完成后,MindStudio窗口下方自动展示Profiling结果视图。3. Profiling工程管理此处我们来介绍一下如何展示创建的Profiling工程和生成的Profiling报告。1)创建新Profiling工程a.单击选择并打开已编译完成的工程。b.单击菜单栏“Ascend > System Profiler > New Project”或者在Profiling报告界面左上角单击图标。c.参见数据采集中的3)到6)完成创建。2)打开未展示的Profiling报告a.单击选择并打开已编译完成的工程。b.单击菜单栏“Ascend > System Profiler > Open”或在Profiling报告展示界面左上角的图标找到并打开未展示的Profiling报告。3) 另存报告a.报告界面左侧导航栏对应报告文件右键弹出菜单。b.单击“Save As”。c.选择目标路径,单击“Save”保存报告。4)删除报告a.报告界面左侧导航栏对应报告文件右键弹出菜单。b.单击“ Delete Report”。c.在弹出的对话框中单击“Yes”。5)刷新导航栏单击报告界面左上角的图标。刷新后可以将导航栏状态刷新到最新状态,所有已经展开的工程目录会收起。4. Profiling数据展示Profiling执行成功后,自动展示Profiling数据结果,如图6所示。图6 Profiling视图窗口(推理)Profiling视图窗口分为如下四个区域:1区域:菜单栏。从从左到右分别为Open…(打开未展示的Profiling报告)、New Project(创建新Profiling工程)、TimeLine Color(打开Timeline颜色配置)、Refresh(刷新导航栏)四项功能。详细介绍请参见Profiling工程管理和Timeline颜色配置。图6 1区域2区域:展示打开的.json文件页签,单击对应页签则显示对应文件的结果。图7 2区域3区域:以视图方式展示Profiling采集结果,包括:TimeLine View、Analysis Summary、Memory Chart(仅推理)、Baseline Comparison。图8 3区域4区域:导航栏。显示用户指定的.json文件。提供历史数据管理功能,包括:Open Report(打开报告)、Save As(另存为)、Delete Report(删除报告)等;支持在空白处右键Open…(打开未展示的Profiling报告)、New Project(创建新Profiling工程)、Refresh(刷新导航栏)。详细介绍请参见Profiling工程管理。图9 4区域Profiling支持Task-Based和Sample-Based两种不同方式的AI Core采集方式,因此会出现Profiling各页签展示结果不同。三、完成服务端Profiling工具的依赖安装(注:此依赖仅需要采集disk或OS runtime API的用户需要安装,disk与OS runtime API 作用如下)OS Runtime API: 系统运行时函数库API和Pthreads API的调用。可选配置,默认勾选。勾选位置如下图所示Disk :采集Host侧Disk资源利用率信息。可选配置。勾选位置如下图所示我们在Ubuntu 18.04操作系统下进行测试,执行以下命令安装。iotop工具安装方法:注:此依赖仅需要采集disk的用户需要安装此处以python3为例进行介绍,若用户使用其他版本Python,请自行适配。wget http://guichaz.free.fr/iotop/files/iotop-0.6.tar.bz2tar -xvf iotop-0.6.tar.bz2cd iotop-0.6sed -i 's/itervalues/values/g' setup.pypython3 setup.py buildpython3 setup.py installln -s /usr/local/python3/sbin/iotop /usr/sbin/iotopln -s /usr/local/python3/bin/iotop /usr/bin/iotop配置结果如图10所示:图10 iotop工具安装结果perf工具安装方法:注:此依赖仅调用OS runtime API的用户需要安装apt-get install linux-tools-common安装结果如图11所示:图11 perf工具安装结果安装完成后执行perf命令,根据系统提示继续使用apt-get install安装linux-tools-x和linux-cloud-x执行perf命令结果如图12所示:图12 执行perf命令结果按照提示,使用apt-get install安装linux-tools-4.15.0-156-generic和linux-cloud-4.15.0-156-generic。安装结果如图13和图14所示图13 linux-tools-4.15.0-156-generic安装结果图14 linux-cloud-tools-4.15.0-156-generic安装结果ltrace工具安装方法:注:此依赖仅调用OS runtime API的用户需要安装apt-get install ltrace安装结果如图15所示:图15 ltrace工具安装结果四、msprof.py脚本工具的功能及使用方法msprof.py工具是由Python编写的Profiling命令行工具。功能:1)解析采集的Profiling性能原始数据。2)查询Profiling数据信息。3)导出采集的Profiling性能数据文件。安装路径:常用的安装路径如下/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/msprof(注:以下命令在Profiling过程中都可自动完成,无需手动输入)1. 解析Profiling数据解析Profiling数据。支持monitor和import两种解析方式。命令行格式如下:# 监控并解析Profiling数据python3 msprof.py monitor [-h] -dir参数说明参见表3表3 解析命令参数说明参数名描述monitor监控并解析Profiling数据。monitor为多进程方式解析,建议数据量大时使用。monitor解析方式在脚本执行时是不退出的,当有新的Profiling数据拷贝进当前正在解析的文件夹-dir时,会继续进行解析;import方式只针对当前已有文件进行解析。-h,--help显示帮助信息,仅在获取使用方式时使用。-dir, --collection-dir收集到的Profiling数据目录。须指定为PROF_XXX目录(仅生成汇总Timeline目录数据)或PROF_XXX目录下的host或device目录(生成具体设备数据),例如:/home/HwHiAiUser/profiler_data/PROF_XXX或/home/HwHiAiUser/profiler_data/PROF_XXX/device1。执行完上述命令,解析完成后对应的PROFXXX的device和host目录下会生成sqlite目录,sqlite目录下会有.db文件生成。图 16 sqlite目录在profiling过程中,将自动调用msprof.py脚本工具,如图17所示图 17 解析Profiling数据所以不需要额外调用命令。2. 查询Profiling数据信息。命令行格式如下,参数说明参见表4python3 msprof.py query [-h] -dir <dir>表4 查询Profiling数据信息命令参数说明参数名描述-h,--help显示帮助信息,仅在获取使用方式时使用。-dir, --collection-dir收集到的Profiling数据目录。须指定为PROF_XXX目录(仅生成汇总Timeline目录数据)或PROF_XXX目录下的host或device目录(生成具体设备数据),例如:/home/HwHiAiUser/profiler_data/PROF_XXX或/home/HwHiAiUser/profiler_data/PROF_XXX/device1。Profiling过程中也将自动执行此命令如图18所示。图 18 查询Profiling数据信息3. 导出采集的Profiling性能数据文件。命令行格式如下:# 导出timeline数据python3 msprof.py export timeline [-h] -dir <dir> [--iteration-id ] [--model-id id>]表5 导出Profiling数据命令参数说明参数名描述-h,--help显示帮助信息,仅在获取使用方式时使用。-dir, --collection-dir收集到的Profiling数据目录。须指定为PROF_XXX目录(仅生成汇总Timeline目录数据)或PROF_XXX目录下的host或device目录(生成具体设备数据),例如:/home/HwHiAiUser/profiler_data/PROF_XXX或/home/HwHiAiUser/profiler_data/PROF_XXX/device1。--iteration-id某轮迭代的ID号,默认值为1。--model-id模型ID。单算子场景和仅执行采集昇腾AI处理器系统数据场景,不支持--model-id参数。--formatsummary数据文件的导出格式,支持csv和json两种格式,默认值为csv。仅配置summary参数时支持。本文中summary文件介绍均以csv文件为例。Profiling过程中也将自动执行此命令如图19、20所示。图 19 导出采集的Profiling summary数据文件图 20 导出采集的Profiling timeline数据文件执行完上述命令后,会在collection-dir目录下的PROF_XXX目录的device或host目录下生成timeline和summary目录。如图21所示图 21 host目录五、以VGG网络模型为例演示Profiling数据采集流程1)启动MindStudio,单击选择并打开已编译完成的工程。如图21所示。图21 打开已编译完成的工程2)单击菜单栏“Ascend > System Profiler > New Project”,弹出Profiling配置窗口。3)进入Profiling配置窗口,配置Profiling的工程名称“Project Name”和选择Profiling工程的结果路径“Project Location”。单击“Next”进入下一步。4)进入“Executable Properties”配置界面。指定执行Profiling目标工程的可执行文件目录。如图22所示。图22 Remote Run5)进入“Profiling Options”配置界面,选择Task-based场景。6)完成上述配置后单击窗口右下角的“Start”按钮,启动Profiling。六、以VGG网络模型为例演示解析profiling数据的流程工程执行完成后,MindStudio窗口下方自动展示Profiling结果视图。单击Timeline视图下方数据窗格的Statistics视图中aclmdExecute接口体现网络整体运行时间达到了6.16s,单击AI Core Metrics视图,查看AI Core Metrics数据中VGG16图23 VGG16网络应用推理运行结果_Statistics图24 VGG16网络应用推理运行结果_AI Core Metrics可以通过选择关注的变量来更改排序,我们查看ACL API的Statistics视图并按接口调用耗时占比从高到底排序。如图25所示。图25 ACL API Statistics同样的我们也可以查看Profiling结果的AI Core Metrics视图中的算子执行耗时并按Task Duration算子执行任务的时间从高到低排列。如图26所示。图26 AI Core Metrics
  • [经验分享] 基于MindStudio的TensorFlow模型开发精度调优(session.run模式)
    本文的视频讲解可以在以下链接中观看:cid:link_0一、关于dump数据与npy数据的简要介绍:1、dump数据简要介绍:Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用WinDbg打开。在本文中,非量化离线模型在昇腾AI处理器上运行生成的代对比数据可以被MindStudio以dump数据格式存储。npy数据简要介绍:npy文件是一种存放数据的文件格式,在电脑上是无法直接用软件打开的,因为npy格式是用python程序生成的,所以只能用python程序读取和显示。在本文中,使用npy格式存储非量化原始模型的文件的标准数据(Ground Truth)。二、dump、npy对比数据格式命名要求介绍:表1 数据文件命名规则数据类型数据命名格式备注非量化离线模型在昇腾AI处理器上运行生成的dump数据{op_type}.{op_name}.{task_id}.{stream_id}.{timestamp}命名格式说明:op_type、op_name对应的名称需满足“A-Za-z0-9_-”正则表达式规则,timestamp为16位时间戳,output_index、task_id、stream_id为0~9数字组成。量化离线模型在昇腾AI处理器上运行生成的dump数据npy数据(Caffe、TensorFlow或ONNX){op_name}.{output_index}.{timestamp}.npy三、通过MindStudio提供的dump功能,生成离线模型的dump数据:打开MindStudio,选择“Ascend > Dump Configuration”菜单,弹出“Select Offline Model”窗口,如图1所示。1、选择“Ascend图12、Dump Configuration图23、选择服务器上的上传的model,这里以ResNet50为例,选择.om模型文件,单击“OK”,展示模型文件结构,设置dump开关:图34、通过窗口右侧配置项,设置.om模型文件的dump配置项。Dump Option:配置dump范围。ALL:所有算子开启dump。Several:自定义部分算子开启dump。选择该项后,需要右键单击待dump数据的算子并选择“Enable Dump”。None:所有算子不开启dumpDump Mode:dump数据模式。Input:dump算子的输入数据。Output:dump算子的输出数据。All:同时dump算子的输入、输出数据。Dump Path:配置保存dump数据文件的路径,默认为:{project_path}/dump。如果Dump Path设置为其他路径,需要确保MindStudio安装用户对该路径具有读写权限。AclConfig File:Acl配置文件,在dump操作中该文件保存算子的dump配置信息。一般路径为{project_path}/src/acl.json,实际路径可以在{project_path}/.project文件中查找。格式如下图4图5所示。当选择整个模型dump时,不含layer字段。图4图5设置dump完成后,分别单击MindStudio界面“Build”和“Run”菜单,重新编译和运行应用工程,当我们设置完成后,运行后,我们可以在{project_path}/dump路径下查看到生成的dump数据文件。生成的路径及格式说明:ime:dump数据回传落盘时间。格式为:YYYYMMDDhhmmss。device_id: Device设备ID号。model_name:模型名称。model_id:模型ID号。data_index:针对每个Task ID执行的次数维护一个序号,从0开始计数,该Task每dump一次数据,序号递增如何查看dump数据文件使用安装用户登录开发环境。进入Ascend-cann-toolkit安装目录/usr/local/Ascend/ascend-toolkit/5.1.RC1/tools/operator_cmp/compare目录。执行dump_data_conversion.pyc脚本,转换dump文件为numpy文件。举例dump_data_conversion.pyc脚本存放位置:Ascend-cann-toolkit安装目录/usr/local/Ascend/ascend-toolkit/5.1.RC1/tools/operator_cmp/comparedump_data_conversion.pyc脚本,实现dump数据文件与numpy文件格式互转功能,具体命令行格式如下:python dump_data_conversion.py -type TYPE -target TARGET -i输入路径 -o 输出路径说明上述参数类型:type:数据类型,必选参数 。参数值选项:quant:量化Caffe模型数据。tf:非量化TensorFlow模型数据。caffe:非量化Caffe模型数据。offline:离线模型数据。-target:数据转换目标格式,参考值选项:numpy和dump。必选参数 :numpy:Dump文件转换为numpy文件。dump:numpy文件转换为Dump文件-i:源数据文件路径(可以是文件夹或者文件),必选参数 。-o:转换后输出文件路径。必选参数。如下图所示:具体脚本所在位置图63、调用Python,转换numpy文件为txt文件,代码如下、写入mindstudio如下图所示,import numpy as npa=np.load("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.npy")b = a.flatten()np.savetxt("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.txt", b)四、介绍session.run模式4.1 session.run模式:from tensorflow.python import debug as tf_debugsess = tf_debug.LocalCLIDebugWrapperSession(sess, ui_type="readline")Session.run模式,如下图所示示例,在run之前设置tfdbg装饰器图7用tf_debug.LocalCLIDebugWrapperSession重新包装一下sess,这个包装器提供如下特性;(1) 在Session.run()之前引进CLI命令行调试接口,能够让你控制程序的执行和监视图的内部状态。(2) 允许你自己定义特殊的filters 来监视某个tensor(张量)的值,可以帮助诊断bug。(比如用来监视某个tensor的值是否有无穷值的情况)4.2 执行运行脚本。进入调试命令行交互模式后,输入run命令4.3 收集npy文件。执行run命令完成后,在命令行交互界面,可以通过lt查询已存储的张量,通过pt可以查看已存储的张量内容,可以保存数据为numpy格式文件。因为tfdbg一次命令只能dump一个tensor,为了自动生成收集所有数据,可以按以下几个步骤操作:执行lt > tensor_name将所有tensor的名称暂存到文件里。退出tfdbg命令行,在linux命令行下执行下述命令,用以生成在tfdbg命令行执行的命令。timestamp=$[$(date +%s%N)/1000] ;cat tensor_name | awk '{print "pt",$4,$4}' | awk '{gsub("/", "_", $3);gsub(":", ".", $3);print($1,$2,"-n 0 -w "$3".""'$timestamp'"".npy")}'五、简要介绍CosineSimilarity,MaxAbsoluteError,AccumulateRelativeError等算法。5.1 CosineSimilarity算法:进行余弦相似度算法比对出来的结果,范围是[-1,1],比对的结果如果越接近1,表示两者的值越相近,越接近-1意味着两者的值越相反。余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。定义:两个向量间的余弦值可以通过使用欧几里得点积公式求出:即给定两个属性向量,A和B,其余弦相似性θ由点积和向量长度给出,如下所示:5.2 MaxAbsoluteError算法:进行最大绝对误差算法比对出来的结果,取值范围是 0 到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。5.3 AccumulateRelativeError算法:进行累积相对误差算法比对出来的结果,取值范围是 0 到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。六、基于六中的三个算法进行比对结果进行分析。Vector比对操作步骤:图11 New Task(Remote Run)图11图12 New Task(Local Run)图12Vector比对结果及说明,如图13图13CosineSimilarity:进行余弦相似度算法比对出来的结果。取值范围为[-1,1],比对的结果如果越接近1,表示两者的值越相近,越接近-1意味着两者的值越相反。MaxAbsoluteError:进行最大绝对误差算法比对出来的结果。取值范围为0到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。AccumulatedRelativeError:进行累积相对误差算法比对出来的结果。取值范围为0到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。Absolute Error:绝对误差,NPU Dump侧算子的dump值减Ground Truth侧算子的dump值取绝对值比对出来的结果。小数点后最多6位。Relative Error:相对误差,Absolute Error值除以Ground Truth侧算子的dump值比对出来的结果。当Ground Truth侧算子的dump值为0时,该处显示为“-”。小数点后最多6位。6.1 讲解Tensorflow 推理应用场景精度问题分析基本思路:确认第一层data输入数据是否正确,找一张有精度的图片,编译,指令仿真、Pytorch都用这张图片。比较仿真和Pytorch、Tensorflow每层的相似度。第一步、如果第一层,即data层的相似度不是0.99,就进行第二步。第二步、确认data层输入一致,检查一些缩放。预处理是否和Tensorflow一致。第三步、如果第一层相似度是0.99+,后面逐层下降,最后一层小于0.95,进行第四步。第四步、确认是否量化误差导致。修改配置项,设置dump_data为1,输出校准数据到mapper_quant目录。比较mapper_quant和Tensorflow的相似度,如果相似度不达标,说明是全重量化误差导致。如果相似度不达标,说明数据量化误差导致。如果最后一层的相似度为0.99,中间某些层的相似度在0.9以下,进行第五步。第五步、确认层是否匹配,ATC网络结构,来适应硬件执行,所以相似度比较时有可能和Tensorflow不匹配。如果相似度均为0.99+且误差也很小,则可能是后处理问题,进行第六步。第六步确认后处理是否正确,观察Tensorflow是否正常画框或者分类。,如果正常则说明是后处理代码问题,如果不正常,而数据相似度为0.99且绝对误差很小,则说明Tensorflow后处理代码敏感,检查Tensorflow代码。6.2 讲解Tensorflow原始网络模型的子模型导出原理,以及子模型导出与对比的意义:子模型导出原理:开始->模型转换->模型推理->推理结果有差异->精度对比。如图14所示:图14在MindStudio界面菜单栏选择“Ascend > Dump Network”进入子模型导出界面如图15所示:图15如果模型转换后导出的.om模型文件中的原模型“Model Name”取值与Caffe原始网络模型文件(*.prototxt)或者TensorFlow原始网络模型文件(*.pb)中的“Model Name”取值不同时,解析网络模型时会弹出如17所示界面。单击“Yes”继续解析,进入图16。单击“No”,返回子模型导出界面。图16在使用昇腾AI处理器的推理功能时,可能存在推理结果和原始模型推理结果不一致的情况,使用精度比对工具可以定位到某个或者某些非用户自定义层出现精度下降的问题,此时需要用户将怀疑有问题的局部网络的相关数据截取出来进行局部结构精度比对,将问题模型最小化后提供给华为工程师定位,在该背景下,MindStudio提供Caffe和TensorFlow原始网络模型的子模型导出功能方便用户获取数据。
  • [经验分享] 基于MindStudio的TensorFlow模型开发精度调优(estimator模式)
    本文的视频讲解可以在以下链接观看:https://www.bilibili.com/video/BV1qP4y1f7H9?spm_id_from=333.999.0.0&vd_source=18d17b9159b860c92bf39cce650c8ae1一、关于dump数据与npy数据的简要介绍:1、dump数据简要介绍:在计算机领域,dump一般翻译为转储。程序在计算机中运行时,在内存、CPU、I/O等设备上的数据都是动态的(或者说是易失的),也就是说数据使用完或者发生异常就会丢掉。如果我想得到某些时刻的数据(有可能是调试程序Bug或者收集某些信息),就要把他转储(dump)为静态(如文件)的形式。否则,这些数据你永远都拿不到。2、Npy数据简要介绍:在训练模型前,最重要的部分就是制作好数据集,有些情况下,由于图片数据过多,然后存储很不方便,我们就需要将数据制作成npy类型的数据格式。npy数据格式是一个四维的数组[N,H,W, C],其中N代表数据集的总数,H, W,C分别代表每一张图片对应的长、宽、以及通道数。二、通过MindStudio提供的dump功能,生成离线模型的dump数据:打开MindStudio,选择“Ascend > Dump Configuration”菜单,弹出“Select Offline Model”窗口,如图1所示。1、选择“Ascend图12、Dump Configuration图23、选择服务器上的上传的model,这里以ResNet50为例,选择.om模型文件,单击“OK”,展示模型文件结构,设置dump开关:图34、通过窗口右侧配置项,设置.om模型文件的dump配置项。Dump Option:配置dump范围。ALL:所有算子开启dump。Several:自定义部分算子开启dump。选择该项后,需要右键单击待dump数据的算子并选择“Enable Dump”。None:所有算子不开启dumpDump Mode:dump数据模式。Input:dump算子的输入数据。Output:dump算子的输出数据。All:同时dump算子的输入、输出数据。Dump Path:配置保存dump数据文件的路径,默认为:{project_path}/dump。如果Dump Path设置为其他路径,需要确保MindStudio安装用户对该路径具有读写权限。AclConfig File:Acl配置文件,在dump操作中该文件保存算子的dump配置信息。一般路径为{project_path}/src/acl.json,实际路径可以在{project_path}/.project文件中查找。格式如下图4图5所示。当选择整个模型dump时,不含layer字段。图4图5设置dump完成后,分别单击MindStudio界面“Build”和“Run”菜单,重新编译和运行应用工程,当我们设置完成后,运行后,我们可以在{project_path}/dump路径下查看到生成的dump数据文件。生成的路径及格式说明:ime:dump数据回传落盘时间。格式为:YYYYMMDDhhmmss。device_id: Device设备ID号。model_name:模型名称。model_id:模型ID号。data_index:针对每个Task ID执行的次数维护一个序号,从0开始计数,该Task每dump一次数据,序号递增如何查看dump数据文件使用安装用户登录开发环境。进入Ascend-cann-toolkit安装目录/usr/local/Ascend/ascend-toolkit/5.1.RC1/tools/operator_cmp/compare目录。执行dump_data_conversion.pyc脚本,转换dump文件为numpy文件。举例dump_data_conversion.pyc脚本存放位置:Ascend-cann-toolkit安装目录/usr/local/Ascend/ascend-toolkit/5.1.RC1/tools/operator_cmp/comparedump_data_conversion.pyc脚本,实现dump数据文件与numpy文件格式互转功能,具体命令行格式如下:python dump_data_conversion.py -type TYPE -target TARGET -i输入路径 -o 输出路径说明上述参数类型:type:数据类型,必选参数 。参数值选项:quant:量化Caffe模型数据。tf:非量化TensorFlow模型数据。caffe:非量化Caffe模型数据。offline:离线模型数据。-target:数据转换目标格式,参考值选项:numpy和dump。必选参数 :numpy:Dump文件转换为numpy文件。dump:numpy文件转换为Dump文件-i:源数据文件路径(可以是文件夹或者文件),必选参数 。-o:转换后输出文件路径。必选参数。如下图所示:具体脚本所在位置图63、调用Python,转换numpy文件为txt文件,代码如下、写入mindstudio如下图所示,import numpy as npa=np.load("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.npy")b = a.flatten()np.savetxt("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.txt", b)三、介绍estimator模式修改TF应用工程脚本,添加debug选项设置。代码中增加如下代码:3.1 estimator模式:from tensorflow.python import debug as tf_debugtraining_hooks = [train_helper.PrefillStagingAreaHook(), tf_debug.LocalCLIDebugHook()]使用钩子 hooks。可以在定义tf.contrib.learn.Experiment的时候通过train_monitors参数指定,也可以在定义tf.estimator.EstimatorSpec 的时候通过training_chief_hooks参数指定。Estimator模式,如图下图所示示例,添加tfdbg的hook。图73.2 执行运行脚本。进入调试命令行交互模式后,输入run命令3.3 收集npy文件。执行run命令完成后,在命令行交互界面,可以通过lt查询已存储的张量,通过pt可以查看已存储的张量内容,可以保存数据为numpy格式文件。因为tfdbg一次命令只能dump一个tensor,为了自动生成收集所有数据,可以按以下几个步骤操作:执行lt > tensor_name将所有tensor的名称暂存到文件里。退出tfdbg命令行,在linux命令行下执行下述命令,用以生成在tfdbg命令行执行的命令。timestamp=$[$(date +%s%N)/1000] ;cat tensor_name | awk '{print "pt",$4,$4}' | awk '{gsub("/", "_", $3);gsub(":", ".", $3);print($1,$2,"-n 0 -w "$3".""'$timestamp'"".npy")}'四、结合可执行的推理应用工程 ATC ResNext50(FP16)展示比对操作的完整流程。4.1首先下载模型去model_zoo里面,下载训练脚本,如下图所示图84.2上传模型到服务器上,如下图所示:图94.3上传数据并且配置数据路径:下载ImageNet2012, CIFAR10 or Flower数据集用于训练和验证。训练模型中对与数据设定的参数:训练过程中数据设定:- Resize to (224, 224)- Normalize, mean=(121, 115, 100), std=(70, 68, 71)推理过程中数据设定:Resize to (224, 224)CenterCrop, ratio=0.8Normalize, mean=(121, 115, 100), std=(70, 68, 71)上传的数据路径,然后在ResNext50,在src/configs/res50_256bs_1p.py中修改数据路径。图104.4开始执行训练:python /自己下载的resnext的路径/src/mains/res50.py --config_file=res50_256bs_1p --max_train_steps=1000 --iterations_per_loop=100 --debug=True --eval=False --model_dir=d_solution/ckpt${DEVICE_ID}5.4.1查看模型cd d_solutionls –alt五、基于六中的三个算法进行比对结果进行分析。Vector比对操作步骤:图11 New Task(Remote Run)图11图12 New Task(Local Run)图12Vector比对结果及说明,如图13图13CosineSimilarity:进行余弦相似度算法比对出来的结果。取值范围为[-1,1],比对的结果如果越接近1,表示两者的值越相近,越接近-1意味着两者的值越相反。MaxAbsoluteError:进行最大绝对误差算法比对出来的结果。取值范围为0到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。AccumulatedRelativeError:进行累积相对误差算法比对出来的结果。取值范围为0到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。Absolute Error:绝对误差,NPU Dump侧算子的dump值减Ground Truth侧算子的dump值取绝对值比对出来的结果。小数点后最多6位。Relative Error:相对误差,Absolute Error值除以Ground Truth侧算子的dump值比对出来的结果。当Ground Truth侧算子的dump值为0时,该处显示为“-”。小数点后最多6位。5.1 讲解Tensorflow 推理应用场景精度问题分析基本思路:确认第一层data输入数据是否正确,找一张有精度的图片,编译,指令仿真、Pytorch都用这张图片。比较仿真和Pytorch、Tensorflow每层的相似度。第一步、如果第一层,即data层的相似度不是0.99,就进行第二步。第二步、确认data层输入一致,检查一些缩放。预处理是否和Tensorflow一致。第三步、如果第一层相似度是0.99+,后面逐层下降,最后一层小于0.95,进行第四步。第四步、确认是否量化误差导致。修改配置项,设置dump_data为1,输出校准数据到mapper_quant目录。比较mapper_quant和Tensorflow的相似度,如果相似度不达标,说明是全重量化误差导致。如果相似度不达标,说明数据量化误差导致。如果最后一层的相似度为0.99,中间某些层的相似度在0.9以下,进行第五步。第五步、确认层是否匹配,ATC网络结构,来适应硬件执行,所以相似度比较时有可能和Tensorflow不匹配。如果相似度均为0.99+且误差也很小,则可能是后处理问题,进行第六步。第六步确认后处理是否正确,观察Tensorflow是否正常画框或者分类。,如果正常则说明是后处理代码问题,如果不正常,而数据相似度为0.99且绝对误差很小,则说明Tensorflow后处理代码敏感,检查Tensorflow代码。5.2 讲解Tensorflow原始网络模型的子模型导出原理,以及子模型导出与对比的意义:子模型导出原理:开始->模型转换->模型推理->推理结果有差异->精度对比。如图14所示:图14在MindStudio界面菜单栏选择“Ascend > Dump Network”进入子模型导出界面如图16所示:图15如果模型转换后导出的.om模型文件中的原模型“Model Name”取值与Caffe原始网络模型文件(*.prototxt)或者TensorFlow原始网络模型文件(*.pb)中的“Model Name”取值不同时,解析网络模型时会弹出如16所示界面。单击“Yes”继续解析,进入图16。单击“No”,返回子模型导出界面。图16在使用昇腾AI处理器的推理功能时,可能存在推理结果和原始模型推理结果不一致的情况,使用精度比对工具可以定位到某个或者某些非用户自定义层出现精度下降的问题,此时需要用户将怀疑有问题的局部网络的相关数据截取出来进行局部结构精度比对,将问题模型最小化后提供给华为工程师定位,在该背景下,MindStudio提供Caffe和TensorFlow原始网络模型的子模型导出功能方便用户获取数据。
  • [经验分享] 基于MindStudio的TensorFlow模型开发 使用TensorFlow GPU2Ascend
    TensorFlow模型开发使用TensorFlow GPU2Ascend本文的视频讲解可以在以下链接观看:cid:link_0一.进行模型转换的原因NPU(Neural-network Processing Unit)是一种嵌入式神经网络处理器,它采用“数据驱动并行计算”的架构,特别擅长处理人工智能任务。它的指令集直接包括了一些在深度学习中常用的运算,如乘加、激活函数、二维数据运算、解压缩等。这就让用NPU进行的预测和推理更快,在自动驾驶等应用中具有重大意义。同时,解压缩模块可以对神经网络中的权重进行压缩,解决了物联网设备中内存带宽小的问题,使深度神经网络部署到物联网中的一些小型终端成为可能。MindStudio为我们提供了可以很方便使用华为昇腾系列(HUAWEI Ascend)AI处理器的接口。目前训练和在线推理脚本大多还是基于GPU,而 AI处理器本质上是嵌入式神经网络处理器(NPU)。由于NPU和GPU之间存在架构上的差异。基于GPU的训练和在线推理脚本不能直接在NPU上使用。因此,想要利用NPU进行训练和推理,就需要将基于GPU的脚本转换为支持NPU的脚本后才能使用。MindStudio同样也提供了可以简单地将基于GPU的脚本转化为支持NPU的脚本的方法。最新版MindStudio获取方式:cid:link_2MindStudio的安装和使用教程:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/progressiveknowledge/index.htmlMindStudio昇腾论坛:cid:link_3二.模型转换测试案例:ResNet50(cid:link_4)MindStudio版本:MindStudio 5.0.RC1 (Release)Build #MS-211.6693.111.5, built on April 14, 2022Runtime version: 11.0.13+7-b1751.19 amd64VM: Dynamic Code Evolution 64-Bit Server VM by JetBrains s.r.o.Windows 10 10.0GC: G1 Young Generation, G1 Old GenerationMemory: 1774MCores: 16获取项目代码从gitee下载代码或用将项目代码用git拉取到本地下载代码方法:打开目标项目库。点击克隆/下载后,出现点击下载ZIP,将项目下载到指定位置。用git拉取代码方法:同上打开网页,点击克隆/复制后,点击出现的复制按钮,复制内容:在git中进入你需要放置项目的文件夹,输入命令git clone ,粘贴复制的内容,按下回车执行命令。成功后看到如下所示:打开项目在MindStudio中打开下载的项目的文件夹点击Open,选择项目所在路径,打开项目。前提条件使用转换功能需已安装好CANN深度学习框架TensorFlow插件包Ascend-cann-tfplugin_{version}_linux-{arch}.run。如未安装,请参见以下步骤安装此插件包。下载框架适配插件Plugin,用于昇腾软件与Tensorflow框架对接。请参见TensorFlow Adapter商用版,下载并安装插件框架包Ascend-cann-tfplugin_{version}_linux-{arch}.run。安装依赖。pip3 install pandaspip3 install xlrd==1.2.0pip3 install openpyxlpip3 install tkintertablepip3 install google_pasta安装tfplugin插件包。./Ascend-cann-tfplugin_{version}_linux-{arch}.run --install执行脚本转化启动脚本转化。有三种方式可以发起脚本转化任务:首次执行转化任务前,需要先点击任务栏中Ascend下的Convert To Ascend Project。方法一:在工具栏选择“Ascend > Framework Trans > Tensorflow GPU2Ascend”。方法二:右键单击训练工程,然后选择“Tensorflow GPU2Ascend”。方法三:单击工具栏中图标。参数配置:执行上述三种方法中任意一种方法,进入参数配置窗口。Tensorflow GPU2Ascend参数说明如下表所示:参数参数说明CANN Machine自动填充。远程连接CANN所在环境的SSH地址,表现格式为@localhost:端口号。仅Windows系统支持此参数。Command FileLinux环境上的CANN深度学习框架TensorFlow插件包中的工具脚本文件,为main.py文件。示例路径:tfplugin安装目录/tfplugin/latest/tfplugin/python/site-packages/npu_bridge/convert_tf2npu/main.pyInput Path本地待转换脚本文件的路径。Output Path本地脚本转换后的输出路径。Main FilePython执行入口文件的路径。如果原始脚本使用了tf.keras/hvd接口,且脚本中没有main函数,由于迁移工具无法识别入口函数,因此无法进行NPU资源初始化,以及NPU训练相关配置。针对该场景,需要通过配置“Main File”参数指定Python执行的入口文件,以便工具可以将用户脚本进行彻底迁移,保证后续训练的顺利执行。Distributed Strategy分布式策略。如果原始脚本支持分布式训练,需要指定原始脚本使用的分布式策略,便于工具对分布式脚本进行自动迁移。打开此开关,在下方出现的下拉框中选择原始脚本中使用的分布式策略。tf.distributed.Strategyhorovod单击“Transplant”生成结果报告。可在下方“Output”窗口查看运行过程。如图:查看迁移报告:步骤1:了解报告目录结构在目标文件路径中,会有一个以msft结尾的文件,打开文件夹。其中,以report_npu开头文件夹中保存迁移报告。打开report_npu文件夹,查看报告五份报告。各报告的具体内容在下一步骤中可以看到。步骤2:查看报告api_analysis_report.xlsx:为API支持度分析报告,用户可以筛选“不支持(无迁移方案,建议不使用)”和“废弃类”API单独分析,并根据修改建议修改训练脚本。如图:工具迁移 API 支持度说明如下表所示:工具迁移API支持度说明支持(无需迁移)此类API在昇腾AI处理器上绝对支持,无需适配修改。例如"tf.abs"等接口,在昇腾AI处理器上能够完全支持,不需要迁移。工具迁移后API功能支持工具迁移后,该API在昇腾AI处理器上可以支持。例如"tf.data.Dataset.batch(xxx)"接口,由于当前仅支持固定shape下的训练,也就是在进行图编译时shape的值必须是已知的。当原始网络脚本中使用dataset.batch(batch_size)返回动态形状时,由于数据流中剩余的样本数可能小于batch大小。因此,迁移工具必须将drop_remainder设置为True,丢弃文件中的最后几个样本,以确保每个批量都具有静态形状 (batch_size):"tf.data.Dataset.batch(xxx)" --> "tf.data.Dataset.batch(xxx, drop_remainder=True)"工具迁移后训练功能打通工具迁移后,能够保证在昇腾AI处理器训练执行成功,但原有API功能可能不完全支持。例如"tf.config.experimental.set_memory_growth"接口,它的作用一般是将所有GPU设置为仅在需要时申请显存空间,在昇腾AI处理器上训练时,该接口实际并不生效。因此,迁移工具会直接return返回None,从而保证在昇腾AI处理器上训练正常执行。"tf.config.experimental.set_memory_growth" --> 直接return返回None不支持(不影响迁移,无需干预)此类API在昇腾AI处理器上不支持,但不影响脚本执行,无需用户干预。例如"tf.config.experimental.get_memory_growth"接口,由于工具会将"tf.config.experimental.set_memory_growth"直接return返回None,因此对应的get接口也不会影响脚本在昇腾AI处理器上的执行,即便出现这个接口,用户也无需干预。不支持(无迁移方案,建议不使用)此类API在昇腾AI处理器上不支持,且当前暂无具体迁移方案,建议您不要使用,否则会引起训练失败。例如"tf.distribute.experimental.TPUStrategy"等TPU相关接口,需通过Google TPU设备执行,昇腾AI处理器上不支持,建议用户不要使用。另外,"tf.enable_eager_execution"等eager功能相关接口,在当前版本也不支持,建议用户不要使用。废弃类此类API在TensorFlow 1.15版本已经废弃,建议用户使用TensorFlow官网推荐的API,否则可能会引起训练失败。例如"tf.colocate_with"等接口。兼容类此类API主要作为TensorFlow 2.X版本中支持TensorFlow 1.X功能所使用,在TensorFlow 1.X脚本中不会使用到。例如"tf.compat.v1.abs"和"tf.compat.v2.abs"等接口。api_brief_report.txt:汇总脚本中API支持度统计结果,例如:failed_report.txt:脚本中API不支持度统计结果,可能为空白文档。need_migration_doc.txt:脚本中仍需要做迁移统计报告,可能为空白文档。success_report.txt:汇总脚本中API支持度统计结果,例如:三. 将转换后的模型在NPU上进行训练1. 进入运行配置界面用快捷键进入运行配置界面。2. 训练参数说明及配置进入运行配置界面,有如下所示窗口:若Run Mode选择Remote Run:若Run Mode选择Local Run:在右侧配置训练工程运行信息,配置示例如下表所示。参数参数说明示例Name工程名称,用户自行配置。名称必须以字母开头,数字或字母结尾,只能包含字母、数字、中划线和下划线,且长度不能超过64个字符。MyTrainingExecutable训练工程中的执行入口文件。/home/xxx/AscendProjects/MyTraining5/data/download_cifar10.shRun Mode运行环境选择。选择“Remote Run”或“Local Run”,默认为“Remote Run”。“Remote Run”Deployment运行配置。通过Deployment功能,详细请参见Deployment,可以将指定项目中的文件、文件夹同步到远程指定机器的指定目录。选择Remote Run模式时可见,必选配置。Command Arguments训练工程执行参数。可选配置。Environment Variables训练工程环境变量。可选配置。配置完成后,点击“OK”完成训练工程信息的创建。3. 执行训练Tensorflow版本要求:我是用的是tensorflow-1.5.0,可以进行训练,但是跟warning来看,用高一点版本的tensorflow可能会更好。训练集组织要求:本例中使用的是kaggle猫狗大战训练集,在网上进行下载后,按照项目readme中所述放在项目中相应的位置,运行dataset_clusterer.py文件对数据集进行预处理。单击应用工程界面“Run >Run”或单击如图所示菜单,执行训练。训练执行过程:连接远端训练机器 -> 打包训练工程发布到远端训练机器 -> 启动训练工程执行。如果进行的是训练,入口文件设置成train.py文件。执行训练后,在应用工程界面底部“Run”窗口显示运行实时信息,如下图:四.将训练结束的模型导出为pb文件1. 代码展示与讲解代码展示与讲解(以注释形式)如下:def main():args = parse_args() #调用函数tf.reset_default_graph()# set inputs nodeinputs = tf.placeholder(tf.float32, shape=[None, 224, 224, 3], na me="input")# create inference graphwith res50_helper.custom_getter_with_fp16_and_weight_decay(dtype= tf.float32, weight_decay=0.0001):builder = resnet.LayerBuilder(tf.nn.relu, 'channels_last', False, use_batch_norm=True,conv_initializer=tf.variance_scaling_initializer(), bn_init_m ode='adv_bn_init', bn_gamma_initial_value=1.0)logits = resnet.inference_resnet_v1_impl(builder, inputs, [3, 4, 6, 3], 'original', 'v1.5')with tf.Session() as sess:#save unfrozen graphtf.train.write_graph(sess.graph_def, './', 'model.pb')freeze_graph.freeze_graph(input_graph='./model.pb',input_saver='',input_binary=False,input_checkpoint=args.ckpt_path,output_node_names='fp32_vars/final_dense',# graph outputs noderestore_op_name='save/restore_all',filename_tensor_name='save/Const:0',output_graph='./resnet50_910.pb',# output pb nameclear_devices=False,initializer_nodes='')print("done")parse_args()函数获得一个解析后的'--ckpt_path'参数,作为后续输入的checkpoint的路径。清除默认图形堆栈并重置全局默认图形。用placeholder()函数分配保存模型需要的内存空间。根据网络创建推理图。最后保存图,用freeze_graph()函数固化tf.train.write_graph()生成的pb文件。2. 简析pb文件和checkpoint文件区别与联系pb文件:谷歌推荐的保存模型的方式是保存模型为 pb 文件,它具有语言独立性,可独立运行,封闭的序列化格式,任何语言都可以解析它,它允许其他语言和深度学习框架读取、继续训练和迁移 TensorFlow 的模型;保存为 pb 文件时候,模型的变量都会变成固定的,导致模型的大小会大大减小,适合在手机端运行。checkpoint文件:这种模型文件是依赖 TensorFlow 的,只能在其框架下使用,难以做迁移。在恢复模型之前需要再定义一遍网络结构,然后才能把变量的值恢复到网络中。五.个人的一些体会和FAQ1. 个人体会MindStudio作为华为自研的IDE,功能十分完善。我在使用过程中,觉得它作为IDE来使用的话,整体感受和功能上并不比pycharm逊色多少。但是MindStudio提供给我们一个可以很方便实现用远端华为服务器的NPU进行训练和推理的接口,这对于个人开发者来说是很大的便利,将我们从没有足够的GPU进行训练的困扰中解放出来。就我个人的体验来说,第一次将模型进行转换,再将模型上传到远端的过程中,还是出现了不少小错误,比如服务器连接有时不够稳定、找不到转换的文件、不确定各种参数该如何配置等。但是跑通了这整个过程后,能感受到配置的过程并不复杂,可以很便捷的将模型上传并训练。能够进行远端训练的好处当然远远大于这一点点小麻烦的。2. FAQ问:为什么GPU2Ascend转换后生成的迁移报告是空的?答:在转化参数配置页面,Input Path处不能直接选择项目文件夹,我的建议是再单独新建一个文件夹,把项目放进去。然后Input Path选择这个新建的文件夹!问:为什么我的工作台面板上找不到 ?答:如果是别的工程导入进来的,需要将该工程先转化为Ascend Project。具体就是点击任务栏中Ascend下的Convert To Ascend Project。问:项目模型上传太慢怎么办?答:这是主要是因为训练数据较大,我们可以只上传需要的数据部分。如果要进行训练,可以将不需要的数据删除,只在项目中放需要的数据部分,就可以加快上传速度。
  • [经验分享] 基于MindStudio的TensorFlow模型开发 使用TensorFlow GPU2Ascend
    TensorFlow模型开发使用TensorFlow GPU2Ascend一.进行模型转换的原因NPU(Neural-network Processing Unit)是一种嵌入式神经网络处理器,它采用“数据驱动并行计算”的架构,特别擅长处理人工智能任务。它的指令集直接包括了一些在深度学习中常用的运算,如乘加、激活函数、二维数据运算、解压缩等。这就让用NPU进行的预测和推理更快,在自动驾驶等应用中具有重大意义。同时,解压缩模块可以对神经网络中的权重进行压缩,解决了物联网设备中内存带宽小的问题,使深度神经网络部署到物联网中的一些小型终端成为可能。MindStudio为我们提供了可以很方便使用华为昇腾系列(HUAWEI Ascend)AI处理器的接口。目前训练和在线推理脚本大多还是基于GPU,而 AI处理器本质上是嵌入式神经网络处理器(NPU)。由于NPU和GPU之间存在架构上的差异。基于GPU的训练和在线推理脚本不能直接在NPU上使用。因此,想要利用NPU进行训练和推理,就需要将基于GPU的脚本转换为支持NPU的脚本后才能使用。MindStudio同样也提供了可以简单地将基于GPU的脚本转化为支持NPU的脚本的方法。最新版MindStudio获取方式:cid:link_1MindStudio的安装和使用教程:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/progressiveknowledge/index.htmlMindStudio昇腾论坛:cid:link_2二.模型转换测试案例:ResNet50(cid:link_3)MindStudio版本:MindStudio 5.0.RC1 (Release)Build #MS-211.6693.111.5, built on April 14, 2022Runtime version: 11.0.13+7-b1751.19 amd64VM: Dynamic Code Evolution 64-Bit Server VM by JetBrains s.r.o.Windows 10 10.0GC: G1 Young Generation, G1 Old GenerationMemory: 1774MCores: 16获取项目代码从gitee下载代码或用将项目代码用git拉取到本地下载代码方法:打开目标项目库。点击克隆/下载后,出现点击下载ZIP,将项目下载到指定位置。用git拉取代码方法:同上打开网页,点击克隆/复制后,点击出现的复制按钮,复制内容:在git中进入你需要放置项目的文件夹,输入命令git clone ,粘贴复制的内容,按下回车执行命令。成功后看到如下所示:打开项目在MindStudio中打开下载的项目的文件夹点击Open,选择项目所在路径,打开项目。前提条件使用转换功能需已安装好CANN深度学习框架TensorFlow插件包Ascend-cann-tfplugin_{version}_linux-{arch}.run。如未安装,请参见以下步骤安装此插件包。下载框架适配插件Plugin,用于昇腾软件与Tensorflow框架对接。请参见TensorFlow Adapter商用版,下载并安装插件框架包Ascend-cann-tfplugin_{version}_linux-{arch}.run。安装依赖。pip3 install pandaspip3 install xlrd==1.2.0pip3 install openpyxlpip3 install tkintertablepip3 install google_pasta安装tfplugin插件包。./Ascend-cann-tfplugin_{version}_linux-{arch}.run --install执行脚本转化启动脚本转化。有三种方式可以发起脚本转化任务:首次执行转化任务前,需要先点击任务栏中Ascend下的Convert To Ascend Project。方法一:在工具栏选择“Ascend > Framework Trans > Tensorflow GPU2Ascend”。方法二:右键单击训练工程,然后选择“Tensorflow GPU2Ascend”。方法三:单击工具栏中图标。参数配置:执行上述三种方法中任意一种方法,进入参数配置窗口。Tensorflow GPU2Ascend参数说明如下表所示:参数参数说明CANN Machine自动填充。远程连接CANN所在环境的SSH地址,表现格式为@localhost:端口号。仅Windows系统支持此参数。Command FileLinux环境上的CANN深度学习框架TensorFlow插件包中的工具脚本文件,为main.py文件。示例路径:tfplugin安装目录/tfplugin/latest/tfplugin/python/site-packages/npu_bridge/convert_tf2npu/main.pyInput Path本地待转换脚本文件的路径。Output Path本地脚本转换后的输出路径。Main FilePython执行入口文件的路径。如果原始脚本使用了tf.keras/hvd接口,且脚本中没有main函数,由于迁移工具无法识别入口函数,因此无法进行NPU资源初始化,以及NPU训练相关配置。针对该场景,需要通过配置“Main File”参数指定Python执行的入口文件,以便工具可以将用户脚本进行彻底迁移,保证后续训练的顺利执行。Distributed Strategy分布式策略。如果原始脚本支持分布式训练,需要指定原始脚本使用的分布式策略,便于工具对分布式脚本进行自动迁移。打开此开关,在下方出现的下拉框中选择原始脚本中使用的分布式策略。tf.distributed.Strategyhorovod单击“Transplant”生成结果报告。可在下方“Output”窗口查看运行过程。如图:查看迁移报告:步骤1:了解报告目录结构在目标文件路径中,会有一个以msft结尾的文件,打开文件夹。其中,以report_npu开头文件夹中保存迁移报告。打开report_npu文件夹,查看报告五份报告。各报告的具体内容在下一步骤中可以看到。步骤2:查看报告api_analysis_report.xlsx:为API支持度分析报告,用户可以筛选“不支持(无迁移方案,建议不使用)”和“废弃类”API单独分析,并根据修改建议修改训练脚本。如图:工具迁移 API 支持度说明如下表所示:工具迁移API支持度说明支持(无需迁移)此类API在昇腾AI处理器上绝对支持,无需适配修改。例如"tf.abs"等接口,在昇腾AI处理器上能够完全支持,不需要迁移。工具迁移后API功能支持工具迁移后,该API在昇腾AI处理器上可以支持。例如"tf.data.Dataset.batch(xxx)"接口,由于当前仅支持固定shape下的训练,也就是在进行图编译时shape的值必须是已知的。当原始网络脚本中使用dataset.batch(batch_size)返回动态形状时,由于数据流中剩余的样本数可能小于batch大小。因此,迁移工具必须将drop_remainder设置为True,丢弃文件中的最后几个样本,以确保每个批量都具有静态形状 (batch_size):"tf.data.Dataset.batch(xxx)" --> "tf.data.Dataset.batch(xxx, drop_remainder=True)"工具迁移后训练功能打通工具迁移后,能够保证在昇腾AI处理器训练执行成功,但原有API功能可能不完全支持。例如"tf.config.experimental.set_memory_growth"接口,它的作用一般是将所有GPU设置为仅在需要时申请显存空间,在昇腾AI处理器上训练时,该接口实际并不生效。因此,迁移工具会直接return返回None,从而保证在昇腾AI处理器上训练正常执行。"tf.config.experimental.set_memory_growth" --> 直接return返回None不支持(不影响迁移,无需干预)此类API在昇腾AI处理器上不支持,但不影响脚本执行,无需用户干预。例如"tf.config.experimental.get_memory_growth"接口,由于工具会将"tf.config.experimental.set_memory_growth"直接return返回None,因此对应的get接口也不会影响脚本在昇腾AI处理器上的执行,即便出现这个接口,用户也无需干预。不支持(无迁移方案,建议不使用)此类API在昇腾AI处理器上不支持,且当前暂无具体迁移方案,建议您不要使用,否则会引起训练失败。例如"tf.distribute.experimental.TPUStrategy"等TPU相关接口,需通过Google TPU设备执行,昇腾AI处理器上不支持,建议用户不要使用。另外,"tf.enable_eager_execution"等eager功能相关接口,在当前版本也不支持,建议用户不要使用。废弃类此类API在TensorFlow 1.15版本已经废弃,建议用户使用TensorFlow官网推荐的API,否则可能会引起训练失败。例如"tf.colocate_with"等接口。兼容类此类API主要作为TensorFlow 2.X版本中支持TensorFlow 1.X功能所使用,在TensorFlow 1.X脚本中不会使用到。例如"tf.compat.v1.abs"和"tf.compat.v2.abs"等接口。api_brief_report.txt:汇总脚本中API支持度统计结果,例如:failed_report.txt:脚本中API不支持度统计结果,可能为空白文档。need_migration_doc.txt:脚本中仍需要做迁移统计报告,可能为空白文档。success_report.txt:汇总脚本中API支持度统计结果,例如:三. 将转换后的模型在NPU上进行训练1. 进入运行配置界面用快捷键进入运行配置界面。2. 训练参数说明及配置进入运行配置界面,有如下所示窗口:若Run Mode选择Remote Run:若Run Mode选择Local Run:在右侧配置训练工程运行信息,配置示例如下表所示。参数参数说明示例Name工程名称,用户自行配置。名称必须以字母开头,数字或字母结尾,只能包含字母、数字、中划线和下划线,且长度不能超过64个字符。MyTrainingExecutable训练工程中的执行入口文件。/home/xxx/AscendProjects/MyTraining5/data/download_cifar10.shRun Mode运行环境选择。选择“Remote Run”或“Local Run”,默认为“Remote Run”。“Remote Run”Deployment运行配置。通过Deployment功能,详细请参见Deployment,可以将指定项目中的文件、文件夹同步到远程指定机器的指定目录。选择Remote Run模式时可见,必选配置。Command Arguments训练工程执行参数。可选配置。Environment Variables训练工程环境变量。可选配置。配置完成后,点击“OK”完成训练工程信息的创建。3. 执行训练Tensorflow版本要求:我是用的是tensorflow-1.5.0,可以进行训练,但是跟warning来看,用高一点版本的tensorflow可能会更好。训练集组织要求:本例中使用的是kaggle猫狗大战训练集,在网上进行下载后,按照项目readme中所述放在项目中相应的位置,运行dataset_clusterer.py文件对数据集进行预处理。单击应用工程界面“Run >Run”或单击如图所示菜单,执行训练。训练执行过程:连接远端训练机器 -> 打包训练工程发布到远端训练机器 -> 启动训练工程执行。如果进行的是训练,入口文件设置成train.py文件。执行训练后,在应用工程界面底部“Run”窗口显示运行实时信息,如下图:四.将训练结束的模型导出为pb文件1. 代码展示与讲解代码展示与讲解(以注释形式)如下:def main():      args = parse_args()  #调用函数    tf.reset_default_graph()      # set inputs node    inputs = tf.placeholder(tf.float32, shape=[None, 224, 224, 3], na me="input")      # create inference graph    with res50_helper.custom_getter_with_fp16_and_weight_decay(dtype=  tf.float32, weight_decay=0.0001):          builder = resnet.LayerBuilder(tf.nn.relu, 'channels_last',  False, use_batch_norm=True,  conv_initializer=tf.variance_scaling_initializer(), bn_init_m ode='adv_bn_init', bn_gamma_initial_value=1.0)          logits = resnet.inference_resnet_v1_impl(builder, inputs, [3,  4, 6, 3], 'original', 'v1.5')        with tf.Session() as sess:          #save unfrozen graph          tf.train.write_graph(sess.graph_def, './', 'model.pb')          freeze_graph.freeze_graph(                          input_graph='./model.pb',                          input_saver='',                          input_binary=False,                          input_checkpoint=args.ckpt_path,                          output_node_names='fp32_vars/final_dense',  # graph outputs node                          restore_op_name='save/restore_all',                          filename_tensor_name='save/Const:0',                          output_graph='./resnet50_910.pb',   # output pb name                          clear_devices=False,                          initializer_nodes='')      print("done")  parse_args()函数获得一个解析后的'--ckpt_path'参数,作为后续输入的checkpoint的路径。清除默认图形堆栈并重置全局默认图形。用placeholder()函数分配保存模型需要的内存空间。根据网络创建推理图。最后保存图,用freeze_graph()函数固化tf.train.write_graph()生成的pb文件。2. 简析pb文件和checkpoint文件区别与联系pb文件:谷歌推荐的保存模型的方式是保存模型为 pb 文件,它具有语言独立性,可独立运行,封闭的序列化格式,任何语言都可以解析它,它允许其他语言和深度学习框架读取、继续训练和迁移 TensorFlow 的模型;保存为 pb 文件时候,模型的变量都会变成固定的,导致模型的大小会大大减小,适合在手机端运行。checkpoint文件:这种模型文件是依赖 TensorFlow 的,只能在其框架下使用,难以做迁移。在恢复模型之前需要再定义一遍网络结构,然后才能把变量的值恢复到网络中。五.个人的一些体会和FAQ1. 个人体会MindStudio作为华为自研的IDE,功能十分完善。我在使用过程中,觉得它作为IDE来使用的话,整体感受和功能上并不比pycharm逊色多少。但是MindStudio提供给我们一个可以很方便实现用远端华为服务器的NPU进行训练和推理的接口,这对于个人开发者来说是很大的便利,将我们从没有足够的GPU进行训练的困扰中解放出来。就我个人的体验来说,第一次将模型进行转换,再将模型上传到远端的过程中,还是出现了不少小错误,比如服务器连接有时不够稳定、找不到转换的文件、不确定各种参数该如何配置等。但是跑通了这整个过程后,能感受到配置的过程并不复杂,可以很便捷的将模型上传并训练。能够进行远端训练的好处当然远远大于这一点点小麻烦的。2. FAQ问:为什么GPU2Ascend转换后生成的迁移报告是空的?答:在转化参数配置页面,Input Path处不能直接选择项目文件夹,我的建议是再单独新建一个文件夹,把项目放进去。然后Input Path选择这个新建的文件夹!问:为什么我的工作台面板上找不到 ?答:如果是别的工程导入进来的,需要将该工程先转化为Ascend Project。具体就是点击任务栏中Ascend下的Convert To Ascend Project。问:项目模型上传太慢怎么办?答:这是主要是因为训练数据较大,我们可以只上传需要的数据部分。如果要进行训练,可以将不需要的数据删除,只在项目中放需要的数据部分,就可以加快上传速度。
  • [其他] 基于TensorFlow 2建立深度学习的模型 - 快速入门
    每次建立神经网络模型都从最基础的python语句开始会非常困难:容易出错,而且运行效率低。 因此我们要使用深度学习框架,用来提高深度学习的应用效率。 这里就介绍比较流行的深度学习框架TensorFlow。深度学习框架TensorFlow它的优点有这些:易用性 他提供大量容易理解并且可读性强的函数。他可以很好的与Numpy结合。灵活性 能够在各种类型的设备上运行,小到手机,大到超级计算机。也可以很好的支持分布式计算。可以同时使用CPU或者GPU。高效性 部分采用C++编写支持性 Google团队支持,形成了社区。因为Modelarts里的Codelab里最高的tensorflow版本是1.8,所以我们还是手工新建一个notebook来得到tensorflow2的环境。import tensorflow as tf print(tf.__version__) 2.1.0好了,环境有了,接下来我们看一下基本用法。tensorflow2的Tensor是一个多维数组,类似于Numpy的数组,但包含更多信息。x=tf.add([[1.0,2.0]],[[3.0,4.0]]) print(x) print('x de shape: {}'.format(x.shape)) print('x de data type: {}'.format(x.dtype)) #tf.Tensor([[4. 6.]], shape=(1, 2), dtype=float32) #x de shape: (1, 2) #x de data type: 然后看一下数值运算,比如有这么几个numpy的array变量,做一下加减乘、点乘、平方、求和等运算: import numpy as np x=np.array([[1,2,1],[2,1,1]]) y=np.array([[0],[1],[1]]) z=np.array([[1,1,0],[1,0,1]]) w1=tf.add(x,z) w2=tf.subtract(x,z) w3=tf.multiply(x,z) w4=tf.matmul(x,y) w5=tf.square(x) w6=tf.reduce_sum(y) print('w1: ',w1) print('w2: ',w2) print('w3: ',w3) print('w4: ',w4) print('w5: ',w5) print('w6: ',w6)w1: tf.Tensor( [[2 3 1] [3 1 2]], shape=(2, 3), dtype=int64) w2: tf.Tensor( [[0 1 1] [1 1 0]], shape=(2, 3), dtype=int64) w3: tf.Tensor( [[1 2 0] [2 0 1]], shape=(2, 3), dtype=int64) w4: tf.Tensor( [[3] [2]], shape=(2, 1), dtype=int64) w5: tf.Tensor( [[1 4 1] [4 1 1]], shape=(2, 3), dtype=int64) w6: tf.Tensor(2, shape=(), dtype=int64)TensorFlow2和NumPy有很好的兼容性,体现在运算时NumPy数组和TensorFlow张量可以自动转换;也可以使用.numpy()方法将TensorFlow的张量转换为NumPy数组。np_array=np.ones([3,3]) print('tf运算时自动转换') tensor=tf.multiply(np_array,42) print(tensor) print('numpy运算时自动转换') print(np.add(tensor,1)) print('tf张量使用.numpy方法转换为数组') print(tensor.numpy())tf运算时自动转换 tf.Tensor( [[42. 42. 42.] [42. 42. 42.] [42. 42. 42.]], shape=(3, 3), dtype=float64) numpy运算时自动转换 [[43. 43. 43.] [43. 43. 43.] [43. 43. 43.]] tf张量使用.numpy方法转换为数组 [[42. 42. 42.] [42. 42. 42.] [42. 42. 42.]]建立深度神经网络模型有三步, 一,创建模型结构 二,训练模型 三,评估和预测模型。以下面这样一个具有两个隐藏层的神经网络为例,我们来创建模型结构。 在TensorFlow2中,使用函数tf.keras.models.Sequential可以把隐藏层、输出层等深度学习的模型的层结合在一起,注意不包含输入层。#函数Dense()是创建最常见的神经网络的全连接层(dense layer) #全连接层指该层的所有节点与上一层的所有节点都有连接。 #也就是该层的每一个节点都是上一层所有节点的加权和再通过一个激活函数的结果。 #函数的定义非常的简明,第一个参数是该层的节点数。其他两个参数可以望文生意不用解释。 model=tf.keras.models.Sequential() model.add(tf.keras.layers.Dense(3,input_shape=(5,),activation='relu')) model.add(tf.keras.layers.Dense(3,activation='relu')) model.add(tf.keras.layers.Dense(2,activation='softmax')) model.summary()Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 3) 18 _________________________________________________________________ dense_1 (Dense) (None, 3) 12 _________________________________________________________________ dense_2 (Dense) (None, 2) 8 ================================================================= Total params: 38 Trainable params: 38 Non-trainable params: 0 _________________________________________________________________#第2中建立模型的方式。2种方式是等价的 model=tf.keras.models.Sequential([\ tf.keras.layers.Dense(3,input_shape=(5,),activation='relu'),\ tf.keras.layers.Dense(3,activation='relu'),\ tf.keras.layers.Dense(2,activation='softmax')]) model.summary()odel: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_3 (Dense) (None, 3) 18 _________________________________________________________________ dense_4 (Dense) (None, 3) 12 _________________________________________________________________ dense_5 (Dense) (None, 2) 8 ================================================================= Total params: 38 Trainable params: 38 Non-trainable params: 0 _________________________________________________________________Param代表参数个数。 第一个隐藏层的节点是3,输入层的节点是5。输入层到隐藏层是全连接,所以是53个权重,再加上隐藏层3个节点需要3个截距项。 所以是53+3=18。 下面的第二个隐藏层就是33+3=12,输出层就是32+2=8#查看参数的具体值,即训练前的初始值 model.trainable_variables[, , , , , ]训练前的参数初始值的生成可以做一定的控制,这里不多说。 下面开始设置模型训练的最优化方法、损失函数、模型评价指标。#SGD:Stochastic Gradient Descent 随机梯度下降法,mse既是损失函数,也是评价模型 model.compile(optimizer=tf.keras.optimizers.SGD(),\ loss='mse',metrics=['mse'])现在有了模型结构,有了损失函数,有了最优化方法,就可以训练模型了train_x=np.random.random((1000,5)) train_y=np.random.random((1000,2)) test_x=np.random.random((200,5)) test_y=np.random.random((200,2)) history=model.fit(train_x,train_y,epochs=3,batch_size=100)Train on 1000 samples Epoch 1/3 1000/1000 [==============================] - 2s 2ms/sample - loss: 0.0814 - mse: 0.0814 Epoch 2/3 1000/1000 [==============================] - 0s 10us/sample - loss: 0.0814 - mse: 0.0814 Epoch 3/3 1000/1000 [==============================] - 0s 10us/sample - loss: 0.0814 - mse: 0.0814#看一下预测误差 model.evaluate(test_x,test_y)200/200 [==============================] - 0s 569us/sample - loss: 0.0843 - mse: 0.0843 [0.0843447881937027, 0.08434479]#产生一个观测点,查看观测点的预测值 one_obs=np.random.random((1,5)) print(one_obs) model.predict(one_obs)[[0.59833403 0.25943813 0.96528143 0.8772587 0.40920501]] array([[0.49989235, 0.50010765]], dtype=float32)可以看到模型的不可解释性。虽然模型的构建和训练过程有理论和方法支持,但模型最终是不可解释的。
  • [问题求助] atc转pb模型错误:protobuf 版本不匹配
    tensorflow version:1.14python:3.75导出的pb模型,用atc转om报错:E19005: Failed to parse file [./crnn_1.pb].Solution: Check that a matched Protobuf version is installed and try again with a valid file. For details, see section "--framework" in ATC Instructions.ATC model parse ret fail.[FUNC:ParseGraph][FILE:omg.cc][LINE:788]请问atc依赖的protobuf的版本是什么?我自己安装了一个protobuf但貌似没用detail log:,0][EVENT] TBE(29475,python3):2022-08-17-15:42:57.502.234 [../../../../../../latest/atc/python/site-packages/tbe/common/repository_manager/utils/repository_manager_log.py:29][log] [../../../../../../latest/atc/python/site-packages/tbe/common/repository_manager/route.py:367][repository_manager] The task_distribute function entry. [0] tasks of the same type is running. ,0][EVENT] TBE(29475,python3):2022-08-17-15:43:03.166.585 [../../../../../../latest/atc/python/site-packages/tbe/common/repository_manager/utils/repository_manager_log.py:29][log] [../../../../../../latest/atc/python/site-packages/tbe/common/repository_manager/route.py:376][repository_manager] The task_distribute function get finalize task. ,0][EVENT] TBE(29475,python3):2022-08-17-15:43:03.168.214 [../../../../../../latest/atc/python/site-packages/tbe/common/repository_manager/utils/repository_manager_log.py:29][log] [../../../../../../latest/atc/python/site-packages/tbe/common/repository_manager/route.py:390][repository_manager] The current function exits. [0] tasks of the same type are left.
  • [Atlas200] Onnx 模型转om 后,预估错误:Default MaxPoolingOp only supports NHWC on device type CPU
    tf1.14,使用keras2onnx 完成onnx模型的转换,onnx模型能够正常使用。用atc转为om后预估会报错:Default MaxPoolingOp only supports NHWC on device type CPU转换脚本:atc --model={models_dir}/{onnx_model_name} --framework=5 --output={output_dir}/{om_model_name} --input_shape="{input_name}:{input_shape}" --enable_small_channel=1 --soc_version=Ascend310 --log=info')input shape:(None,step,feature),分别是batch,sequence长度和特征维度报错op在tensorlfow中为GlobalMaxPool1D下面是acl的日志[EVENT] CCECPU(4066,python):2022-08-16-14:42:55.361.614 [tf_adpt_session_mgr.cc:398][tid:4076][TFAdapter] [sessionID:16599357285206909441] Create session success. [ERROR] CCECPU(4066,python):2022-08-16-14:42:55.505.915 [aicpu_tf_kernel.cc:138][tid:4075][TFAdapter] AICPUKernelAndDeviceOp Init failure, kernel_id=0, op_name=MaxPool, error=Invalid argument: Default MaxPoolingOp only supports NHWC on device type CPU [ERROR] CCECPU(4066,python):2022-08-16-14:42:55.506.012 [tf_adpt_session_mgr.cc:149][tid:4075][TFAdapter] [sessionID:16599357285206909441] Create kernel failure, kernel_id=0, op_name=. [ERROR] CCECPU(4066,python):2022-08-16-14:42:55.506.031 [tf_adpt_session_mgr.cc:94][tid:4075][TFAdapter] [sessionID:16599357285206909441] Create kernel failed, kernel_id=0. [ERROR] CCECPU(4066,python):2022-08-16-14:42:55.506.052 [tf_adpt_session_mgr.cc:64][tid:4075][TFAdapter] [sessionID:16599357285206909441] Failed to GetOrCreateKernel, kernel_id=0. [ERROR] CCECPU(4066,python):2022-08-16-14:42:55.506.075 [tf_adpt_session_mgr.cc:433][tid:4075][TFAdapter] [sessionID:16599357285206909441] Run kernel on session failed. [ERROR] CCECPU(4066,python):2022-08-16-14:42:55.506.090 [tf_adpt_api.cc:86][tid:4075][TFAdapter] [sessionID:16599357285206909441] Invoke TFOperateAPI failed. [ERROR] CCECPU(4066,python):2022-08-16-14:42:55.506.106 [ae_kernel_lib_fwk.cc:234][TransformKernelErrorCode][tid:4075][AICPU_PROCESSER] Call tf api return failed:5, input param to tf api:0xfffef9e4a004 [ERROR] CCECPU(4066,python):2022-08-16-14:42:55.506.155 [aicpusd_event_process.cpp:1227][ExecuteTsKernelTask][tid:4075] Aicpu engine process failed, result[5]. ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.506.515 [engine.cc:1131]4096 ReportExceptProc:Task exception! device_id=0, stream_id=1, task_id=1, type=13, retCode=0x91, [the model stream execute failed]. ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.509.834 [device_error_proc.cc:667]4096 ProcessAicpuErrorInfo:report error module_type=0, module_name=E39999 ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.509.936 [device_error_proc.cc:667]4096 ProcessAicpuErrorInfo:An exception occurred during AICPU execution, stream_id:4, task_id:46, errcode:5, msg:aicpu execute failed. ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.510.114 [task.cc:746]4096 PrintAicpuErrorInfo:report error module_type=0, module_name=E39999 ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.510.142 [task.cc:746]4096 PrintAicpuErrorInfo:Aicpu kernel execute failed, device_id=0, stream_id=4, task_id=46. ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.510.242 [task.cc:764]4096 PrintAicpuErrorInfo:Aicpu kernel execute failed, device_id=0, stream_id=4, task_id=46, flip_num=0, fault so_name=, fault kernel_name=, fault op_name=Attention/Reshape_12:0_pooling, extend_info=(info_type:4, info_len:30, msg_info:Attention/Reshape_12:0_pooling). ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.510.270 [task.cc:3148]4096 ReportErrorInfo:model execute error, retCode=0x91, [the model stream execute failed]. ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.510.289 [task.cc:3120]4096 PrintErrorInfo:model execute task failed, device_id=0, model stream_id=1, model task_id=1, flip_num=0, model_id=5, first_task_id=65535 ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.510.450 [stream.cc:843]4066 GetError:[EXEC][DEFAULT]Stream Synchronize failed, stream_id=1 retCode=0x91, [the model stream execute failed]. ,0][ERROR] RUNTIME(4066,python):2022-08-16-14:42:55.510.487 [stream.cc:846]4066 GetError:[EXEC][DEFAULT]report error module_type=7, module_name=EE9999
  • [热门活动] 【CANN训练营】【2022第二季】昇腾AI入门课
    基于Caffe ResNet-50网络实现图片分类,数据替换成自己的图片:修改sample_process中的图片路径更换为ResNet-101网络:修改sample_process中的模型路径之外,transferPic中的代码也要修改img = img.astype("float32")result = img.transpose([0, 1, 2, 3])网络迁移至ModelArts平台:跟着直播视频走基本没什么问题,在本地Pycharm运行前要安装Python3.7+Tensorflow1.15.0
  • [问题求助] 【ModelArt产品】【训练功能】tensorflow.python.framework.errors_impl.Intern
    【功能模块】【操作步骤&问题现象】1、ModelArt使用2、模型使用modelzoo样例模型https://www.hiascend.com/zh/software/modelzoo/models/detail/C/210261e64adc42d2b3d84c447844e4c7【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【沈阳昇腾创新中心+TensorFlow服务器上无法运行】
    【功能模块】之前TensorFlow在服务器上可以跑通,但是速度慢,更改之后在服务器上无法运行【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)