1.1. 介绍
1.1.1. 嵌入式设备中的深度学习推理
TIDL使应用程序能够利用TI在EVE和C66x DSP计算引擎上专有的、高度优化的CNN/DNN实现,从而将深度学习带到了边缘。TIDL最初的目标是在AM57x soc上使用2D(通常是视觉)数据。对于1D或3D输入数据块,没有基本的限制来阻止TIDL的使用。
TIDL是一组开源Linux软件包和工具,能够将深度学习(仅限于推理)计算负载从ARM内核卸载到硬件加速器(如EVE和/或c66xdsp)。TIDL的目标是隐藏用于机器学习/神经网络应用的异构设备的复杂性,并帮助开发人员关注他们的特定需求。这样,ARM内核就可以从繁重的计算负载中解放出来,并且可以用于应用程序中的其他角色。这也允许使用传统的计算机视觉(通过OpenCV)增强深度学习算法。
目前,TIDL软件主要支持卷积神经网络推理,使用离线预训练的模型,存储在设备文件系统中(没有对目标设备进行训练)。使用Caffe或Tensorflow-slim 框架训练的模型可以导入和转换(使用提供的导入工具),以便在TI设备上高效执行。
额外的性能优势可以通过使用Caffe的Caffe-Jacinto fork进行训练,其中包括将卷积权重张量稀疏化的函数,从而给予卷积层3 -4倍性能提升的机会。
图1 AM57xx设备的深度学习开发流程
1.1.2. 应用程序空间
当前版本的TIDL软件面向计算机视觉深度学习应用。示例应用包括视觉计算机、条形码阅读器、机器视觉摄像机、工业自动化系统、光学检测系统、工业机器人、货币计数器、占用检测器、智能电器和无人驾驶车辆。在这些情况下,通常使用彩色图像张量(宽度x高度x 3,用于BGR平面),但也可以使用其他数据类型(例如灰度和深度平面:宽度x高度x 2张量)
基于模型和任务,TIDL输入数据是相似的,但输出数据会根据任务而变化:
任务 输出数据
图像分类 具有类存在可能性的一维向量。排名靠前表示类优胜者(即数据类的对象出现在输入中)
图像像素分割 2D矩阵:宽x高,每个单元格设置为整数,从0到max_class_index,模型可以区分
图像目标检测 元组的列表。每个元组包含类索引、检测概率、左上角(xmin,ymin)、边框宽度和高度
路线图中提供了其他应用领域(语音、音频、预测性维护)的其他示例。除了卷积网络拓扑外,未来版本还计划支持RNN/LSTM层和拓扑,以处理顺序数据为目标。
1.1.3. 支持的设备
TIDL软件适用于AM57xx Sitara设备,这些设备具有DSP或EVE或两种加速器:
1.1.4. 验证网络拓扑
有必要了解,TIDL没有针对可以在Caffe或TF中运行的任意网络拓扑进行验证。相反,我们专注于验证层和网络拓扑,这些层和网络拓扑对于在功率受限的嵌入式设备上执行是有意义的。有些网络过于复杂,功率预算只有几瓦。所以重点放在计算量不是很高,内存要求也不是很高的网络上。以下拓扑已通过TIDL软件验证:
• Jacinto11 (similar to ResNet10), classification network
• JSeg21, pixel level segmentation network
• JDetNet, (similar to SSD-300/512), object detection network
• SqueezeNet
• InceptionV1
• MobileNetV1
1.1.5. TIDL支持的神经网络层
支持以下图层类型/推断功能:
• Convolution Layer
• Pooling Layer (Average and Max Pooling)
• ReLU Layer
• Element Wise Layer (Add, Max, Product)
• Inner Product Layer (Fully Connected Layer)
• Soft Max Layer
• Bias Layer
• Deconvolution Layer
• Concatenate layer
• ArgMax Layer
• Scale Layer
• PReLU Layer
• Batch Normalization layer
• ReLU6 Layer
• Crop layer
• Slice layer
• Flatten layer
• Split Layer
• Detection Output Layer
1.1.6. 图层参数约束
当前版本TIDL库中的层有一些参数相关的约束:
• Convolution Layer 卷积层
• 验证内核大小高达7x7(也适用于更高的值,但未验证)
• 参数值的膨胀有效:1,2,4
• 支持步长值1和2.
• 密集的卷积流只支持1x1和3x3的kernel, stride =1, expansion =1
• 支持的最大输入和输出通道数:1024.
• Deconvolution Layer
• 组数应等于通道数
• 仅支持的步幅值为2
• Arg Max
• EVE核最多支持15个输入通道,DSP核最多支持6个通道
• out_max_val=false和top_k=1(默认值)以及axis=1(仅支持跨通道)
• InnerProductLayer
• 最大支持4096个输入输出节点
• 输入数据必须平坦化(即输入数据的C =1和H =1)
• 在C > 1和H > 1中,在这一层之前可以使用一个平坦层
• 如果一个全局平均池也可以扁平化输出
• Spatial Pooling Layer
• 步长1、2、4和内核大小为2x2、3x3、4x4等支持平均池和最大池。不支持随机池
• 平均值和最大值都支持全局池。输出数据N=1和H=1。输出W将用输入“N”更新
• BiasLayer
• 每个通道只支持一个标量偏差.
• CancatLayet
• 仅支持跨通道连接(轴=1;默认).
• CropLayer
• 仅支持空间裁剪(轴=2;默认).
• FlattenLayer
• 保持“N”不变。使C=1和H=1
• ScaleLayer
• 每个通道仅支持一个标量缩放和偏移.
• SliceLayer
• 切片仅支持跨通道(轴=1;默认).
• SoftmaxLayer
• 输入数据必须平坦化(即输入数据的C =1和H =1)
• SSD
• 只验证了基于Caffe-Jacinto的SSD网络.
• 重塑、置换层仅在SSD网络的上下文中受支持.
• “share_location” 必须为真
• Tested with 4 and 5 heads.
• TIDL推断中忽略了SaveOutputParameter.
• Code_type 只测试了CENTER_SIZE.
• Tensorflow
• 只有基于Slim的模型被验证。请参考下面的InceptionNetV1和mobilenet_1.0作为构建您的模型的示例.
• TF-Slim: https://github.com/tensorflow/models/tree/master/research/slim
1.1.7. 重要的TIDL API框架特性
TIDL API的当前实现提供了以下重要特性:
• 不同 EVEs/DSPs上的多个网络可以同时运行
我们可以同时运行尽可能多的不同网络,因为我们有可用的加速器。在AM5749的情况下,最大数量为4(2xEVE上2个,2xDSP上2个)-可能需要增加默认CMEM块大小(每个加速器约64MB-默认设置为192MB)。单个任务执行单元是一个完整的网络,即它通常只在一个EVE或DSP上从头到尾执行,但我们可以在一个EVE中启动一个网络,并在另一个EVE中启动相同或不同的网络,并在第二个EVE中启动自己的输入.
• 相同的基于TIDL API的应用程序代码可以在EVE或DSP加速器上运行
这可以通过修改一个设备类型参数来实现,更多细节请参见编程模型简介
• 某些网络可以在EVE和DSP之间分开
对于某些网络(JDetNet就是一个例子),使用层组的概念是有益的。一个层组在EVE上运行,另一个层组在DSP上运行。在DSP上运行得更快的层很少:SoftMax、Flatten和Concat层。因此,在本例中,我们使用DSP+EVE作为单网络。
1.3. 开发者指南
1.3.1. 软件栈
软件的复杂性只是为了更好地理解。期望用户只基于TIDL API进行编程。
如果TIDL使用DSP作为加速器,则有三个软件层:
•在DSP C66上运行的TIDL库
•opencl运行时,运行在A15和DSP上
•tidl API主机包装器,用户空间库
在TIDL使用EVE作为加速器的情况下,有四个软件层:
•在EVE上运行的tidl库
•m4服务层,作为EVE和A15 Linux之间的代理(被认为是OpenCL的一部分)
•OpenCL运行时,运行在A15上,也运行在M4上(IPU1为TIDL OpenCL监控角色预留)
•tidl API主机包装器,用户空间库
请注意,TIDL API包API是相同的,无论我们使用DSP或EVE(或两者)。用户只需要通过参数指定加速器。
图TIDL软件栈
1.3.2。其他公共TI资源
以下两个与Caffe相关的存储库(由TI团队维护)为训练阶段提供了必要的工具。请将其作为训练、TIDL推理软件的主要信息来源。它们包括对Caffe源树的修改,以实现更高的计算性能(使用TIDL推理)。
Repo/URL Description
Caffe-jacinto NVIDIA/caffe的fork是BVLC/Caffe的衍生。这个分叉中的修改使稀疏量化CNN模型的训练成为可 能,从而产生可用于嵌入式平台的低复杂度模型。请按照README.md,如何克隆,编译和安装这个版本的Caffe。
Caffe-jacinto-models 提供使用tidsp/caffe-jacinto训练稀疏模型的示例脚本。这些脚本支持稀疏CNN模型的训练,从而得到可用于嵌入式平台的低复杂度模型。该存储库还包括预先训练的模型。脚本文件夹中还提供了其他脚本,可以用于准备数据集和运行培训。
1.3.3. 编程模型简介
在当前的版本中,它只有3个类,允许使用一个或多个神经网络模型,这些模型可以在独立的EVEs或C66x内核上并行运行。
单个处理单元是张量(例如,一个图像帧,但也可能有其他输入),通常由单个加速器(EVE或DSP)处理,直到完成。但在某些情况下,从性能的角度来看,将网络层分成两个层组是合理的。然后,我们可以在EVE上运行一层组,在DSP上运行第二层组。这是按顺序进行的。
顶层TIDL API和OpenCL主要是服务软件层(相对于TIDL软件,而不是NN),即它们有助于简化编程模型、IPC机制和内存管理。TIDL-Lib提供了所需的特性,它运行在实时操作系统环境(EVE或DSP)中。该软件层以封闭固件形式提供,并由最终用户按原样使用。