24

麦斯科技 · 2021年04月02日

使用ArmNN优化机器学习应用程序

使用Streamline对在Linux上运行的Arm NN机器学习应用程序进行性能分析

1.png
弗洛朗·勒博

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性能。

2.png

使用Streamline分析Arm NN活动

在“精简”中打开结果时,“时间线”选项卡中将显示其他信息:

Arm NN_Runtime图表显示后端注册(后端是一种抽象,它将网络图的各层映射到负责执行这些层的硬件:Arm Cortex-A,Mali-GPU或Arm ML处理器),网络负载和推论。此图表使用在许多后端运行的不同模型来帮助监视推断。在我们的示例中,我们在Neoverse N1 CPU上运行单个推断;

3.webp

在时间轴视图的详细信息面板中

4.webp

可以选择“ Arm NN时间轴”以显示有关NN管道的信息。

5.webp

“Arm神经网络时间轴”显示神经网络的不同层,其方式类似于Tensorboard可以显示的方式。在我们的案例中,我们训练了卷积神经网络(CNN),它在识别和分类计算机视觉图像方面非常有效。

CNN有两个主要部分:

  • 一种将输入图像分为特征的卷积和池化机制。
  • 一个完全连接的层,用于处理卷积和池化机制的输出并为描述标签赋予属性。

Arm NN时间轴可让您了解何时执行不同层的转换,它们如何连接以及使用了什么后端。例如,您可以看到卷积“ conv2D”在CpuRef后端花费了大量时间。由于父/子连接,单击时间线中的图层有助于可视化它在CNN图层图中的适合位置。
6.webp

7.webp

总结性能分析,概要文件表明应用程序未利用所有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指标与推理的不同步骤进行关联。

8.png

我们可以看到目标CpuAcc后端启用了Advanced SIMD指令以及多线程,以利用Neoverse N1 CPU上的所有计算资源。这导致重要的加速,特别是对于卷积运算。

总结

这涵盖了配置和优化使用Arm NN在Linux上运行推理的机器学习应用程序的步骤。要了解有关Streamline如何帮助您开发基于ML和Arm NN的应用程序的更多信息:
试用Streamline Performance Analyzer

推荐阅读
关注数
5845
内容数
525
定期发布Arm相关软件信息,微信公众号 ArmSWDevs,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息