【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。 点击这里开始你的技术升级之旅吧
本文分享至飞腾开发者平台《飞腾平台Arm NN软件栈安装使用指南》
1 介绍
ArmNN可在基于Arm的高能效平台上轻松构建和运行机器学习应用程序。ArmNN桥接了现有神经网络框架与底层硬件平台。本文介绍了如何在飞腾平台上构建ArmNN软件栈。
2 环境要求
2.1 硬件环境
硬件环境如下表所示。
项目 | 说明 |
---|---|
CPU | FT-2000+/64、飞腾腾云 S2500、FT-2000/4、飞腾腾锐 D2000 |
网络 | |
存储 | |
内存 |
2.2 软件环境
软件环境如下表所示。
项目 | 版本 | 下载地址 |
---|---|---|
OS | centos8.2、Kylin V10、 Ubuntu19.10 | |
GCC | 9.2.1、7.3.0、8.3.1、9.3.0 | |
GNU Binutils | 2.32、2.33、2.34、2.35 | |
Glibc | 2.28、2.23、2.31、2.30 | |
boost | https://dl.bintray.com/boostorg/release/1.64.0/source/boost_1... | |
gator | https://github.com/ARM-software/gator.git | |
ComputeLibrary | https://github.com/ARM-software/ComputeLibrary.git | |
protobuf | https://github.com/protocolbuffers/protobuf.git | |
tensorflow | https://github.com/tensorflow/tensorflow.git | |
Arm NN | https://github.com/ARM-software/armnn.git | |
googlemock | https://github.com/google/googlemock/archive/release-1.7.0.zip | |
googletest |
3 编译环境搭建
3.1 编译安装GCC(示例)
步骤一 获取gcc-9.3。
$ wget [.0.tar.gz](http://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc-9.1.0.tar.gz)
步骤二 解压并下载所依赖的库。
$ tar -xzvf gcc-9.3.0.tar.gz //解压缩
$ cd gcc-9.3.0 //进入解压文件路径
$ ./contrib/download_prerequisites //运行脚本自动下载所需要的依赖文件和库
步骤三 建立输出目录。
$ mkdir gcc-build-9.3.0
$ cd gcc-build-9.3.0
步骤四 编译和安装。
$ ../configure -enable-checking=release -enable-language=c,c++ -disable-multilib
$ make && make install
步骤五 加载环境变量。
# 若gcc指令安装目录不在PATH中,则还需设置export PATH=/gcc_path/bin:$PATH
$ export LD_LIBRARY_PATH=/usr/local/lib64/:$LD_LIBRARY_PATH
步骤六 版本查看。
gcc默认安装路径为/usr/local/bin,编译安装成功之后,可使用以下命令进行版本查看:
$ gcc -v
步骤七 创建链接符号。
$ cd /usr/local/bin
$ ln -s aarch64-unknown-linux-gnu-gcc aarch64-linux-gnu-gcc
$ ln -s aarch64-unknown-linux-gnu-g++ aarch64-linux-gnu-g++
$ ln -s aarch64-unknown-linux-gnu-c++ aarch64-linux-gnu-c++
3.2 编译安装GNU Binutils(示例)
GNU Binutils是二进制工具的集合,是linux系统不可缺少的一个工具包。
步骤一 下载binutils源码。
$ cd $HOME
$ wget <http://ftp.gnu.org/gnu/binutils/binutils-2.35.tar.gz
步骤二 解压源码包。
$ tar -xzvf binutils-2.35.tar.gz //解压缩
$ cd binutils-2.35 //进入解压文件路径
步骤三 编译和安装。
$ mkdir buid
$ mkdir -p \$HOME/binutils //创建安装目录
$ cd build
# 执行以下命令进行编译安装
$ ../configure prefix=\$HOME/binutils
$ make
$ make install
步骤四 拷贝指令。
$ cd $HOME/binutils/bin
$ sudo cp * /usr/local/bin //将生成指令拷贝至指定目录中
步骤五 版本查看。
编译安装成功之后,可使用以下命令进行版本查看:
$ ld --version
4 构建Arm NN软件栈
运行build脚本,下载并编译构建Arm NN软件栈所需的所有软件:
$ cd $HOME
$ git clone https://github.com/ARM-software/Tool-Solutions.git
$ cd Tool-Solutions/ml-tool-examples/build-armnn/
$ ./build-armnn.sh
5 示例程序运行
5.1 MNIST Draw
MNIST Draw是一个有趣的单页网站,用户可以使用机器学习对0到9之间的数字进行手绘和分类,分类时使用对MNIST数据集进行训练得到的机器学习模型。该项目是mnist-draw的修改版,它使用Arm NN SDK在Arm Cortex-A CPU上进行推理。该程序在飞腾平台上运行,可以使用浏览器通过网络进行访问。如下所示:
步骤一 进入资源库。
$ cd $HOME/Tool-Solutions/ml-tool-examples/mnist-draw
# 安装所需要的模块,所需模块具体可见目录下的requirements.txt
$ sudo yum install python3-numpy.aarch64
$ sudo yum install python3-pillow.aarch64
步骤二 构建armnn-draw应用程序。
$ make -C armnn-draw
步骤三 设置Arm NN环境变量。
$ export
LD_LIBRARY_PATH=$HOME/armnn-devenv/armnn/build:$LD_LIBRARY_PATH
步骤四 启动python服务器。
$ python3 -m http.server --cgi 8000
步骤五 程序验证。
在能访问服务器的机器上打开浏览器,进入http://ip-address:8000,网站界面的示例如下图所示:
使用鼠标在空白方框中绘制一个0到9之间的数字,然后单击"Predict"按钮以处理其绘制。处理过程中的任何错误将以警告图标指示并打印到控制台。常见错误包括未在armnn-draw/中编译应用程序以及未使用python3。
结果以条形图显示,其中每个分类标签从机器学习模型获得的分数在0.0到1.0之间。使用clear按钮清除画布以绘制和处理其他数字。
5.2 MNIST Demo
MNIST演示应用程序使用对MNIST训练的TensorFlow神经网络,该程序使用Arm NN用于推理。两个示例程序,mnist_tf_convol.cpp和mnist_tf_simple.cpp。这两个应用程序都读取TensorFlow模型。模型以protobuf二进制格式存储在model/目录中,MNIST数据集以存储向量的简单格式存储在目录data/中,该目录包含MNIST测试数据和标签。 使用make构建应用程序,如下所示:
步骤一 构建应用程序。
$ cd $HOME/Tools-Solutions/ml-tool-examples/mnist-demo
$ make
make生成上述两个示例程序。这些示例的目的是演示如何使用Arm NN在C++应用程序中加载和执行TensorFlow模型。
步骤二 运行MNIST推理。
要运行该应用程序,请使用命令行指定要使用的硬件(CPU或GPU)以及要处理的图像数:
# 优化模式: 0:CpuRef, 1:CpuAcc, 2:GpuAcc
# 输入大小: 1至2000 (要预测的图像数)
$ ./mnist_tf_convol 1 10
步骤三 结果验证。
程序正常运行,可以得到类似以下内容的输出:
Optimisation mode: CpuAcc
#1 | Predicted: 7 Actual: 7
...
#10 | Predicted: 9 Actual: 9
Prediction accuracy: 100%
步骤四 性能比较。
可尝试不同的程序配置,并可比较执行时间:
$ time ./mnist_tf_convol 0 10 # 未优化的cpu设备上的10张图像
$ time ./mnist_tf_convol 1 100 # 在优化的cpu设备上的100张图像
$ time ./mnist_tf_convol 2 1000 # GPU设备上的1000张图像
推荐阅读
欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料
如开发者在使用飞腾产品有任何问题可通过在线工单联系我们
版权所有。飞腾信息技术有限公司 2023。保留所有权利。
未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。
商标声明
Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。
本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。