嵌入式中的人工神经网络
人工神经网络在AI中具有举足轻重的地位,除了找到最好的神经网络模型和训练数据集之外,人工神经网络的另一个挑战是如何在嵌入式设备上实现它,同时优化性能和功率效率。 使用云计算并不总是一个选项,尤其是当设备没有连接的时候。 在这种情况下,需要一个能够实时进行信号预处理和执行神经网络的平台,需要最低功耗,尤其是在一个电池设备上运行的时候。
通过使用不同的工具(如 python 脚本) ,可以训练一个数据格式的网络(在 Caffe 和 Tensorflow),然后使用Snapdragon 神经处理引擎的SDK将其转换为可在Snapdragon 平台上运行的神经网络。
概述
高通的Snapdragon 平台和Snapdragon 神经处理引擎SDK是一个非常好的选择,可以在低功耗和小规模设备上创建一个定制的神经网络。 Snapdragon NPE 是为了给开发者提供工具,使他们能够轻松地将智能从云端迁移到边缘设备。
Snapdragon NPE 为开发者提供软件工具,深度神经网络上的工作负载在移动和其他边缘物联网(IoT)设备上,由 Snapdragon 处理器提供软件工具。 开发者可以为所需的用户体验选择最佳的 Snapdragon 核心—— Qualcomm Kryo CPU、 Qualcomm Adreno GPU 或Hexagon DSP。
本文探讨了利用 Matlab 工具在 Snapdragon 平台上开发和实现神经网络,并主要关注 ONNX 格式。 同时,我们还研究了 Snapdragon 平台如何通过使用 Snapdragon 核心和 SNPE SDK 提供的工具来帮助减少电力和处理时间。
设计并开发简单的 DNN
从设计和培训深度神经网络开始,使用 Matlab并移植带Snapdragon的设计,寻找Snapdragon上最好的子系统来完成这项工作。
手写数字识别系统
从使用 DNN 的手写数字识别系统开始。 这个网络与(音频数字识别系统)之间的主要区别之一是这个系统没有对输入信号进行任何预处理。 具有异构计算架构的 Snapdragon 平台拥有强大的音频和图像处理引擎,使用数字信号处理(dsp)和图形处理单元(GPU)进行音频和图像处理。
该网络是一个基于三层卷积的网络。为了开发和训练这个网络,可以使用 Matlab,还可以使用 Matlab 的手写数据库(与 MNIST 数据库相同; 关于该数据库的资料,请查看 Matlab 文档)。
编写脚本
选择数据库
[XTrain,YTrain] = digitTrain4DArrayData;
[XValidation,YValidation] = digitTest4DArrayData;
设置图层
layers = [ imageInputLayer([28 28 1],'Name','input', 'Normalization', 'none')
convolution2dLayer(5,16,'Padding','same','Name','conv_1')
batchNormalizationLayer('Name','BN_1')
reluLayer('Name','relu_1')
convolution2dLayer(3,32,'Padding','same','Name','conv_2')
batchNormalizationLayer('Name','BN_2')
reluLayer('Name','relu_2')
fullyConnectedLayer(10,'Name','fc')
softmaxLayer('Name','softmax')
classificationLayer('Name','classOutput')];
建立网络
options = trainingOptions('sgdm',...
'MaxEpochs',6,...
'Shuffle','every-epoch',...
'ValidationData',{XValidation,YValidation},...
'ValidationFrequency',20,...
'Verbose',false,...
'Plots','training-progress');
进行训练(有关训练过程的细节,参见 Matlab的相关文档)。
图1 训练结果
为了验证网络,使用这个图像作为分类器,网络可以正确地对它进行分类。
图2 分类器
现在,在将网络转换为 ONNX 格式之后,进入了下一步,即使用 SNPE 工具。
首先,需要将 ONNX 格式转换为 DLC。
snpe-onnx-to-dlc -m handwritten-onnx --debug
这将创建一个 DLC 格式网络,可用于SNPE。
然后使用此命令,可以验证网络结构与在 Matlab 中创建的结构是否匹配。
图3 拓扑对比(左侧 SNPE DLC,右侧 Matlab)
现在使用相同的测试图像并在 Snapdragon 目标板上验证它。 以下是 ARM,cDSP 和 GPU 的结果摘要,使用了以下步骤:
- 拉取平台上不同核(使用 dsp 和使用 gpu)的 snpe-net-run 结果
- 对照拉取的结果在主机上运行 snpe-diagview
ARM | GPU |
---|---|
Dnn Runtime Load/Deserialize/Create Statistics: Load: 4627 us Deserialize: 5148 us Create: 126428 us Average SNPE Statistics: —————————— Total Inference Time: 10956 us Forward Propagate Time: 3080 us Layer Times: ————— 0: 1 us 1: 1298 us 2: 74 us 3: 8 us 4: 908 us 5: 257 us 6: 16 us 7: 465 us 8: 6 us | Dnn Runtime Load/Deserialize/Create Statistics: Load: 4099 us Deserialize: 4931 us Create: 1136097 us Average SNPE Statistics: —————————— Total Inference Time: 3723 us Forward Propagate Time: 3648 us Layer Times: ————— 0: 5 us 1: 31 us 4: 83 us 7: 381 us 8: 5 us |
比较结果表明,DSP 和 GPU 关系密切,但在这些平台上,与 GPU 相比,cDSP 没有较大负载(特别是当有图形应用程序运行时).
使用信号预处理子系统
到目前为止,已经实现的 DNN 网络不需要对输入信号进行任何预处理(比如从输入图像中提取特征)。 然而,并不是所有的实现都是这样。
对于这些情况和实现较低的功耗,可以使用Snapdragon-aDSP,mDSP,cDSP,GPU,dsp/hvx,arm/neon 的不同子系统。看看xDSP和如何使用这些处理器进行特征提取的例子。
Snapdragon上的Hexagon xDSP
Hexagon DSP 是一种具有 L1/2缓存和内存管理单元的多线程DSP,在大多数 Snapdragon SOC上,它和其他核心一样可以访问一些资源。QuRT OS这个独特的结构创建了一个灵活的 DSP 平台,为不同的用例创建应用程序。
图4 DSP 硬件体系结构
图像处理
对于实时图像处理,可以在 ISP 管道中注入定制的 HVX 模块。 该模块的管道位置可能不同,取决于Snapdragon 具体型号。 在某些平台上,可以在相机传感器接口模块之后使用它。
图5 图像的管道处理
或者在其他地方,可以在相机管道的不同位置(红点)中注入 HVX 模块。
图6 HVX模块的注入点
或者可以用于 ISP 之后的内存转移中。有几个例子可以在 Hexagon sdk3.3中找到。
例如,一个使用 HVX 的噪声640×480图像上的 Sobel 处理,可以使用大约10K 的指令周期。
图7 噪声图像的sobel 处理
音频处理
对于音频预处理,aDSP 及其 Elite 框架适用于实时特征提取。 在数字识别系统的 DNN 网络中,该网络的输入为 Mel-frequency cepstral coefficients (MFCC) ,使用一秒音频文件和14个系数,输入层为14×98。 这个数据是从 https://aiyprojects.withgoogle.com/open_*speech_*recording 中收集的,每个数字(0-9)使用1500个音频文件。 这里有一个用于数字1的 MFCC 例子。
图8 数字1的音频信号
网络配置为
图9 数字的DNN
DNN将尝试学习和分类这些类型的图像为不同的数字。 特征提取部分是在 aDSP 中完成的,是 Elite 框架中音频路径拓扑中的一个定制模块。
处理方式 | ARM | GPU | DSP |
---|---|---|---|
DNN运行时负载 | 2532 us | 1729 us | 15103 us |
DNN运行时反序列化 | 1196 us | 1168 us | 7678 us |
DNN运行时创建 | 122546 us | 1137250 us | 216279 us |
平均SPNE总推理时间 | 9020 us | 3429 us | 4289 us |
平均SPNE前向传播时间 | 3712 us | 3382 us | 4244 us |
平均SPNE层处理时间 | 0: 2 us 1: 1441 us 2: 117 us 3: 18 us 4: 1736 us 5: 86 us 6: 166 us 7: 91 us 8: 4 us | 0: 5 us 1: 132 us 4: 209 us 7: 211 us 8: 4 us | 0: 38 us 1: 263 us 2: 1527 us 3: 9 us 4: 154 us 5: 609 us 6: 5 us 7: 128 us 8: 29 us |
传感器处理
平台包含一个传感器集线器,是Snapdragon 传感器核心,可以帮助整合来自不同传感器的数据并处理它们。 这种技术可以帮助从中央处理器卸载这些任务,减少电池消耗,同时提供更好的性能。 针对传感器行为识别目标的任何传感器信息的任何DNN预处理都可以从 DSP 上卸载,并且可以实时完成。
在上述所有情况下,可以不使用分配的 DSP 进行输入,而是使用 FastRPC 从 ARM 中卸载处理到任何其他子系统(如 mDSP) ,但是这种技术有它自己的处理开销。
小结
Snapdragon 平台和 Snapdragon 神经处理引擎SDK提供了强大的平台和工具,可以在低功耗和小规模的边缘设备上创建一个定制的人工神经网络。