TI深度学习(TIDL)-- 3

Posted chocolate2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TI深度学习(TIDL)-- 3相关的知识,希望对你有一定的参考价值。

1.4. 训练
只要支持图层并且满足参数约束,就可以导入现有的Caffe和TF-Slim 模型。但是,这些模型通常包括密集的权重矩阵。为了利用TIDL-Lib的一些优点,并获得3x-4x的性能改进(对于卷积层),有必要使用caffe-jacinto caffe fork重复训练过程,可在https://github.com/tidsp/caffe-jacinto?卷积神经网络计算负荷的最大贡献来自于卷积层(通常在80-90%的范围内),因此特别注意优化卷积层处理。
数据集准备应遵循标准的Caffe方法,通常创建LMDB文件。培训完成后,分3步进行:
•初始训练(通常使用L2正则化),创建密集模型。
这个阶段实际上是桌面上常用的训练程序。在这个阶段结束时,有必要验证模型的准确性。权重张量是密集的,因此性能目标可能无法达到,但以下步骤可以提高性能。如果准确度不够,则不建议继续进行进一步的步骤(它们不会提高准确度-实际上预计应计率会有1-2%的小幅下降)。相反,修改训练参数或增强数据集,并重复训练,直到达到精度目标。
•L1正则化
这一步是必要的(与L2相反),以牺牲其他权重值为代价,并使较大的部分权重变小。剩余的权重将像特征提取器一样发挥作用(这是下一步需要的)。
•稀疏(“稀疏化”)
通过逐步调整权重阈值(从小到高),在每一步(例如70%或80%)测试稀疏化目标。这个过程消除了较小的权重,只留下较大的贡献者。请注意,这只适用于卷积层。
•根据精度下降定义可接受的稀疏化标准
由于从FP32表示转换为8-12位权值表示(和8位激活),可接受的精度下降应在1-2%范围内(取决于模型),例如,如果Caffe-Jacinto桌面模型的分类精度为70%(使用初始阶段后的模型),我们不应该看到稀疏化和量化模型的准确率低于68%。
1.4.1. 训练程序示例
•特定较小对象的数据集集合的设置。
除了许多公开可用的图像数据集之外,经常需要为特定用例收集新的数据集。例如,在工业环境中,通常更容易预测,并且通常可以确保良好照明的受控环境。对于拾取和放置应用程序,可以出现在摄影机视野中的对象集不是无限的,而是仅限于几个或几十个类。使用具有良好照明的转台和照相亭可以快速收集数据集。
•使用AM57xx采集数据集
数据集图像可以由外部相机设备记录,甚至可以使用相机子卡(AM57xx)记录。建议的记录格式是H264,它提供了良好的质量,并且可以使用GStreamer管道高效地解码。只能持续15-20秒(转盘的旋转周期)。对于较慢的fps(10-15fps),这将提供200-300帧。这个过程可以通过改变距离和仰角(3-4次)来重复,所以每个类的总图像计数可以达到2000-3000帧。这样可以将单类数据收集时间限制为5-10分钟。
•后处理
应将视频剪辑复制到Linux x86以进行离线后处理。FFMPEG包允许轻松地将视频剪辑分割成单独的图像。由于记录是在统一的背景下进行的,所以也可以应用自动标记程序。可以使用图像增强脚本进行其他数据集增强,轻松地将图像数量增加10-20倍。
为训练准备LMDB文件
请参考github.com/tidsp/caffe-jacinto-models/scripts中可用的脚本
•从头开始训练或进行迁移学习(微调)
通常,开始训练时最好使用由通用数据集(如ImageNet)创建的初始权重。底层的行为类似于特征提取器,只需要使用我们刚刚收集的数据集(如前几集所述)对顶层或少数层进行微调。对于Jacinto11,良好的起点是在“初始”阶段之后创建的模型。我们将需要重复初始阶段,但现在使用新的数据集,并使用相同的层名称为这些层,我们想预加载早期模型。可以通过减少base_lr(在train.prototxt中)来调整训练,并增加最上面一层或几层的lr。通过这种方式,底层将表面上发生变化,但顶层将根据需要进行调整。
1.4.2. 稀疏化的好处从何而来
•最初,深度学习网络是使用单精度浮点算法(FP32)实现的。在过去的几年中,有更多的研究是关于量化影响和降低精度的算术运算。在许多情况下,8位或更少(低至2-4位)被认为足以进行正确的操作。这可以用大量的参数(权重)来解释,这些参数都有助于操作的准确性。在DSP和EVE推理实现的情况下,权值(由导入工具配置文件中的参数控制)可以以8-12位的精度进行量化。激活层输出(神经元输出)以8位精度(单字节)存储在内存中。积累以40位的精度完成,但最终输出在单字节存储到内存之前右移。右移计数是动态确定的,每层唯一,每帧一次。更多详情请参见https://openaccess.thecvf.com/content_cvpr_2017_workshops/w4/papers/Mathew_Sparse_Quantized_Full_CVPR_2017_paper.pdf
•额外的优化(在上面的文章中描述)是基于卷积层权重的稀疏化。在训练过程中,个人重量被强制为零。这是在“L1正则化”阶段(以牺牲其他权重为代价执行较少较大的权重)和“稀疏”阶段(小权重被钳制为零)实现的。我们可以指定所需的训练目标(例如,所有权重的70%或80%为零)。在推理过程中,重新组织计算,以便在所有输入值上使用单个权重参数进行乘法。如果权重为零,则跳过所有输入数据(对于该输入通道)的乘法。所有的计算都是使用预加载到本地L2内存中的块来完成的(使用“影子”EDMA传输)。
1.5. 性能数据
1.5.1. 验证网络的计算性能

•j11, JSeg21, JDetNet, Mobilenet, SqueezeNet:
Network topology	ROI size	MMAC (million MAC)	Sparsity (%)	EVE using sparse model	EVE using dense model	DSP using sparse model	DSP using dense model	EVE + DSP (optimal model)
MobileNet	224x224	567.70	1.42682.63ms	•		717.11ms	•	
SqueezeNet	227x227	390.8	1.46289.76ms	•		1008.92ms	•	
InceptionNetV1	224x224	1497.37	2.48785.43ms	•		2235.99ms	•	
JacintoNet11	224x224	405.81	73.15	125.9ms	235.70ms	115.91ms	370.64ms	73.55ms
JSegNet21	1024x512	8506.5	76.47	378.18ms	1236.84ms	1101.12ms	3825.95ms	•	
JDetNet	768x320	2191.44	61.84	•		•		•		•		197.55ms

•上表中提供的稀疏度是所有卷积层的平均稀疏度。
•优化模型-在EVE和DSP之间优化层的位置(某些NN层在DSP上运行得更快,如SoftMax;EVE中的ARP32模拟软件中的浮点操作,因此这可能相当慢)。
•下一个版本将通过使用最佳层布局(EVE具有较慢的SoftMax层实现)来提高性能,并将支持例如高达28-30fps的Jacinto11(在AM5749上)。
1.5.2. 选定网络的准确性
为方便起见,以下表格复制自https://github.com/tidsp/caffe-jacinto-models文档。
•图像分类:分类精度排名前1表示ground truth排名最高的概率。前5位的分类精度表示ground truth在前5位候选中的概率。

Configuration-Dataset Imagenet (1000 classes)	Top-1 accuracy
JacintoNet11 non-sparse	60.9%
JacintoNet11 layerwise threshold sparse (80%)	57.3%
JacintoNet11 channelwise threshold sparse (80%)	59.7%

•图像分割:联合的平均交集是真阳性和真阳性、假阴性和假阳性之和的比值

Configuration-Dataset Cityscapes (5-classes)	Pixel accuracy	Mean IOU
Initial L2 regularized training	96.20%	83.23%
L1 regularized training	96.32%	83.94%
Sparse fine tuned (~80% zero coefficients)	96.11%	82.85%
Sparse (80%), Quantized (8-bit dynamic fixed point)	95.91%	82.15%

•目标检测:验证精度可以是分类精度或平均精度(mAP)。请注意“初始”(密集)和“稀疏”模型之间的精度变化(性能提升可以是2x-4x):

Configuration-Dataset VOC0712	mAP
Initial L2 regularized training	68.66%
L1 regularized fine tuning	68.07%
Sparse fine tuned (~61% zero coefficients)	65.77%

1.6. 故障排除
•验证OpenCL堆栈是否在Linux引导下运行,OpenCL固件是否下载到DSP和EVE。由于OpenCL monitor for IPU1(控制EVEs)是新添加的,因此预期跟踪:在目标上输入以下命令:cat /sys/kernel/debug/remoteproc/remoteproc0/trace0 预期输出,指示可用EVE加速器的数量(低于AM5729 trace表示4个EVEs):

[0][      0.000] 17 Resource entries at 0x3000
[0][      0.000] [t=0x000aa3b3] xdc.runtime.Main: 4 EVEs Available
[0][      0.000] [t=0x000e54bf] xdc.runtime.Main: Creating msg queue...
[0][      0.000] [t=0x000fb885] xdc.runtime.Main: OCL:EVEProxy:MsgQ ready
[0][      0.000] [t=0x0010a1a1] xdc.runtime.Main: Heap for EVE ready
[0][      0.000] [t=0x00116903] xdc.runtime.Main: Booting EVEs...
[0][      0.000] [t=0x00abf9a9] xdc.runtime.Main: Starting Bios...
[0][      0.000] registering rpmsg-proto:rpmsg-proto service on 61 with HOST
[0][      0.000] [t=0x00b23903] xdc.runtime.Main: Attaching to EVEs...
[0][      0.007] [t=0x00bdf757] xdc.runtime.Main: EVE1 attached
[0][      0.010] [t=0x00c7eff5] xdc.runtime.Main: EVE2 attached
[0][      0.013] [t=0x00d1b41d] xdc.runtime.Main: EVE3 attached
[0][      0.016] [t=0x00db9675] xdc.runtime.Main: EVE4 attached
[0][      0.016] [t=0x00dc967f] xdc.runtime.Main: Opening MsgQ on EVEs...
[0][      1.017] [t=0x013b958a] xdc.runtime.Main: OCL:EVE1:MsgQ opened
[0][      2.019] [t=0x019ae01a] xdc.runtime.Main: OCL:EVE2:MsgQ opened
[0][      3.022] [t=0x01fa62bf] xdc.runtime.Main: OCL:EVE3:MsgQ opened
[0][      4.026] [t=0x025a4a1f] xdc.runtime.Main: OCL:EVE4:MsgQ opened
[0][      4.026] [t=0x025b4143] xdc.runtime.Main: Pre-allocating msgs to EVEs...
[0][      4.027] [t=0x0260edc5] xdc.runtime.Main: Done OpenCL runtime initialization. Waiting for messages...

•请验证CMEM是否处于活动状态并正在运行:

•cat /proc/cmem
•lsmod | grep " cmem "

•默认的CMEM大小对于超过2个EVE的设备来说是不够的(使每个EVE有大约56-64MB的可用空间)。
•验证模型准备程序
•如果导入外部模型失败,导入过程可能不会给出足够的信息。
例如,如果无法识别格式,则可以看到以下报告(在这种情况下,尝试导入Keras模型):

$ ./tidl_model_import.out ./modelInput/tidl_import_mymodel.txt
TF Model File : ./modelInput/mymodel
Num of Layer Detected :   0
Total Giga Macs : 0.0000

Processing config file ./tempDir/qunat_stats_config.txt !
  0, TIDL_DataLayer                ,  0,   0 ,  0 ,  x ,  x ,  x ,  x ,  x ,  x ,  x ,  x ,  0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,

Processing Frame Number : 0

End of config list found !

•数据集准备问题
•在准备训练集时,良好的照明是非常理想的。
•增强
•桌面Caffe执行与目标执行的等价性
为此,我们可以使用仿真工具,因为它是位精确的EVE或DSP执行。模拟工具生成的跟踪可以直观地与桌面Caffe推断后保存的数据块进行比较。如果其余的都是正确的,那么比较中间结果是值得的。请记住,Caffe桌面计算(使用单精度FP32)和目标计算(使用8位激活和8-12位权重)之间的数值等效性是不可能的。静止特征图(中间层)应该是相当相似的。如果有明显不同,请尝试更改权重的位数,或使用更具代表性的图像重复导入处理。这种问题应该很少遇到。
•运行时的典型错误(何时重启平台)

... inc/executor.h:199: T* tidl::malloc_ddr(size_t) [with T = char; size_t = unsigned int]: Assertion `val != nullptr' failed.
This means that previous run failed to de-allocate CMEM memory. Reboot is one option, restarting ti-mctd deamon is another option.

以上是关于TI深度学习(TIDL)-- 3的主要内容,如果未能解决你的问题,请参考以下文章

TI深度学习(TIDL)-- 3

TI深度学习(TIDL)--1

TI深度学习(TIDL)--1

TI深度学习(TIDL)--2

TI深度学习(TIDL)--2

TI深度学习(TIDL)--2