本篇文章我们将介绍瑞萨为R-Car V4H提供的三种类型的DNN开发模拟器,以及它们的使用情况和特点。
背景
用于汽车SoC实时处理的深度学习的模型转换
深度学习是使用底层软件(深度学习框架)开发的,如TensorFlow和PyTorch。
仅仅通过移植在深度学习框架中学习到的模型,不可能在R-Car这样的车载SoC上进行实时处理,因为深度学习的推断过程需要大量的计算和内存使用。因此,有必要对所学模型进行非等价的模型压缩,如量化和剪枝,以及使用深度学习编译器进行性能优化。
首先,让我们讨论一下模型压缩。在量化中,通常以浮点计算的推断过程被转换为近似的整数运算,如8位。通过将对识别结果贡献较小的权重设置为零并跳过对这些权重的计算,修剪减少了计算和内存的使用。这两种转换都是对原始推断过程的非等效的算法转换,因此很可能会降低识别的准确性。
在性能优化方面,深度学习编译器可以对训练过的模型的推断过程进行程序转换,以便在深度学习加速器上进行更快的处理,或者应用内存可以进行优化,例如将分配给一个层的输出数据的快速小型SRAM重新用于另一个层的输出数据。
应用这种转换可以在车载SoC上进行实时处理。
在R-Car中使用瑞萨工具和软件的推断流程
瑞萨的R-Car中的H/W加速器CNN-IP,出于计算效率的考虑,可以使用整数值进行推断操作。由于这个原因,用户必须使用瑞萨公司提供的R-Car CNN工具来进行量化,这是上述模型转换中的一种。
首先,在实际执行量化之前,必须进行校准,以计算量化参数(刻度和零点),用于将浮动数转换为整数。为此,一个外部工具(如TFMOT、ONNX runtime),根据网络模型的格式,从大量的输入图像中找到每一层的最大/最小输出值。从这些最大/最小值中,可以计算出比例/零点等量化参数;R-Car CNN工具使用这些量化参数来量化每一层的参数。
R-Car CNN工具然后从网络模型和每层的量化参数中创建一个命令列表。命令列表是二进制数据,用于指示CNN-IP执行哪些命令和设置哪些参数(每个量化层的参数)。通过向CNN-IP提供该命令列表并运行它,可以进行推断。
命令列表是由网络模型和量化参数唯一确定的,因此它只需要事先创建一次。上述命令列表可以对每个图像执行,以便在实际设备上进行推断。
使用瑞萨工具和软件对R-Car V4H进行推断的框图见图1。
图1 使用瑞萨工具和软件进行推断的方框图
关于每个模拟器
每个模拟器的概述和特点
瑞萨电子准备了模拟器来解决以下两个用户挑战:
A)在开发一个应用程序之前,用户希望检查由于量化而导致的精度变化
B)想在不使用实际设备的情况下使用命令列表检查和调试用户应用程序
瑞萨的模拟器有三种类型,每种类型解决不同的任务,具有不同的功能。各自的特点见表1。每一种都在准确性和处理速度上有所不同。对于每一种情况,都会参照框图介绍其特点和使用情况的细节。
表1 各模拟器的概述和特点
(*1)命令列表是使用R-Car CNN工具创建的,基于网络模型和量化参数,使用与上述实际机器上的推断相同的程序。
(*2)Accurate Simulator在R-Car CNN工具中运行。用户向R-Car CNN工具提供网络模型和量化参数,该工具会自动计算每一层的量化参数,然后将其输入到Accurate Simulator。
ISS
该模拟器旨在使用与实际设备尽可能相同的软件配置和输入数据(命令列表,主要是寄存器设置)来调试输出结果。它不能重现计时,也不打算用于计时验证。
结果与实际设备完全相同,速度比Accurate Simulator慢,因为它以指令为基础重现输出。
图2 使用ISS的系统方框图
精确的模拟器
该模拟器将网络模型作为输入,用于精度验证,无需使用实际设备。对于每一层,都要实现一种算法,使其输出与设备的计算算法完全匹配。由于执行速度比ISS快10倍左右,所以在只验证精度的情况下,它是很有用的。
图3 使用Accurate Simulator的系统框图
快速仿真器
该模拟器用于检查大量图像的定量误差。
Fast Simulator扩展了深度学习框架(R-Car V4H中的Tensor Flow),在每层推断操作后都有一个伪量化功能,并带有浮点数字。伪量子化是一种重现浮点数的伪量子化误差的方法,在浮点数仍然是浮点数的情况下,加入与量子化导致的精度下降相同的误差。
可以只在Tensor Flow中添加一个伪量化功能,其运行速度与Tensor Flow相似,但速度更快。
另外,由于输入/输出接口与深度学习框架是通用的,所以用户在切换到深度学习框架时很容易检查出量化错误。
然而,由于每层的推断操作和伪量化都会产生一个小的浮点算术误差,所以结果与实际的机器结果并不完全匹配。
图4 使用快速仿真器的系统框图