使用Streamline对在Linux上运行的Arm NN机器学习应用程序进行性能分析
弗洛朗·勒博
2021年1月20日
Arm Streamline 性能分析器提供系统性能指标,软件跟踪和统计分析,以帮助工程师从硬件中获得最大性能并找到软件中的重要瓶颈。
Streamline v7.4增加了对用于CPU,GPU和NPU的Arm NN机器学习推理引擎的支持。Arm NN弥合了现有框架和底层硬件之间的鸿沟。Streamline可以自动分析Arm NN应用程序,并提供有关推理运行时的有用性能信息。
此处讨论的示例是一个在Arm上运行ML推理的Linux应用程序。我们之前已经在MNIST数据集上训练了一个神经网络 来识别手写数字。使用 Arm NN 和Streamline,我们想了解模型的效率以及如何进一步优化模型。
在应用程序中启用Arm NN分析
为了在应用程序中启用精简配置,必须使用精简配置标志编译Arm NN。这是使用定义来完成的:
全屏
1-DPROFILING_BACKEND_STREAMLINE = 1
此外,要使应用程序使用性能分析,它必须启用性能分析选项,通常在应用程序源代码中完成。在应用程序中启用Arm NN分析选项:
全屏
1 - options.m_ProfilingOptions.m_EnableProfiling = true;
2 - options.m_ProfilingOptions.m_TimelineEnabled = true;
让我们看看如何启用概要分析并捕获在N1 SDP上运行的应用程序的Streamline跟踪 并显示ML推断信息。
设置ML应用程序以进行概要分析
首先,我们将使用先前指定的define选项构建 Gator,Arm Streamline的概要分析代理,依赖库和Arm NN。可以使用github上Arm工具解决方案存储库中的脚本之一轻松完成此操作。安装所需的软件包并运行脚本以在$ {HOME} / armnn-devenv中构建Arm NN。
1 - $ sudo apt install cmake解压缩curl scons
2 - $ cd $ {HOME}
3 - $ git clone https://github.com/ARM-software/Tool-Solutions.git
4 - $ cd工具解决方案/ ml-tool-examples / build-armnn /
5 - $ bash ./build-armnn.sh
要安装ML应用程序,请转到以下存储库并编译示例:全屏
1 $ cd $ {HOME} / Tool-Solutions / ml-tool-examples / mnist-demo /
2 $ ARMNN_LIB = / home / ubuntu / armnn-devenv / armnn / build / \
3 ARMNN_INC = / home / ubuntu / armnn-devenv / armnn / include \
4 make
我们已经添加了启用Arm NN分析的选项。现在,我们准备使用Gator来分析应用程序并连接Streamline:
全屏
1 $〜/ gatord --app ./mnist_tf_convol 0 80
要在时间轴中可视化Arm NN事件,需要从计数器配置菜单中启用Arm NN_Runtime事件,以便Gator收集它们。请注意,该应用程序需要运行一次才能在菜单中看到这些事件,因为Arm NN需要计数并收集与ML相关的计数器,以将它们传递给Gator。此外,我们还启用了PMU指令以了解SIMD性能。
使用Streamline分析Arm NN活动
在“精简”中打开结果时,“时间线”选项卡中将显示其他信息:
Arm NN_Runtime图表显示后端注册(后端是一种抽象,它将网络图的各层映射到负责执行这些层的硬件:Arm Cortex-A,Mali-GPU或Arm ML处理器),网络负载和推论。此图表使用在许多后端运行的不同模型来帮助监视推断。在我们的示例中,我们在Neoverse N1 CPU上运行单个推断;
在时间轴视图的详细信息面板中
可以选择“ Arm NN时间轴”以显示有关NN管道的信息。
“Arm神经网络时间轴”显示神经网络的不同层,其方式类似于Tensorboard可以显示的方式。在我们的案例中,我们训练了卷积神经网络(CNN),它在识别和分类计算机视觉图像方面非常有效。
CNN有两个主要部分:
- 一种将输入图像分为特征的卷积和池化机制。
- 一个完全连接的层,用于处理卷积和池化机制的输出并为描述标签赋予属性。
Arm NN时间轴可让您了解何时执行不同层的转换,它们如何连接以及使用了什么后端。例如,您可以看到卷积“ conv2D”在CpuRef后端花费了大量时间。由于父/子连接,单击时间线中的图层有助于可视化它在CNN图层图中的适合位置。
总结性能分析,概要文件表明应用程序未利用所有CPU资源:
CPU活动平均为25%–仅当N1SDP具有4个内核时,推理才在1个N1内核上运行;
尽管执行卷积时发出了大量指令,但“高级SIMD”指令却非常低。该应用程序没有利用矢量化的优势。
最大化Arm NN效率
在我们的示例中,将应用程序的第一个参数从0切换为1将启用更快的应用程序版本:全屏
1 $〜/ gatord --app ./mnist_tf_convol 1 80
此参数设置优化模式:0使用便携式CpuRef模式,而1使用CpuAcc模式,它将在Neoverse,Cortex-A和某些Cortex-R处理器上运行。
在Streamline中打开结果时,我们可以自然地将PMU指标与推理的不同步骤进行关联。
我们可以看到目标CpuAcc后端启用了Advanced SIMD指令以及多线程,以利用Neoverse N1 CPU上的所有计算资源。这导致重要的加速,特别是对于卷积运算。
总结
这涵盖了配置和优化使用Arm NN在Linux上运行推理的机器学习应用程序的步骤。要了解有关Streamline如何帮助您开发基于ML和Arm NN的应用程序的更多信息:
试用Streamline Performance Analyzer