工程师说 | R-Car DNN模拟器的介绍 (2)
背景
R-Car SoC是我们提出的一种高性能、低功耗的SoC。为了在R-Car SoC上运行客户用主流深度学习框架(如PyTorch、TensorFlow等)训练的模型,需要采用剪枝 (*1) 和量化 (*2) 等非等效的近似方法进行模型压缩。我们提供的R-Car CNN工具,不仅可以在R-Car SoC上执行上述近似程序,运行客户训练好的深度学习模型,还可以根据客户的应用场景提供不同精度和速度的模拟器。这样即使您没有R-Car SoC硬件,也可以验证操作和进行性能预估。 (*3)
在各类模拟器中,Accurate Simulator能获得与实际R-Car SoC最为一致的输出结果。本文提出使用Accurate Simulator对模型进行调试分析和精度改进的方法。通过逐步追踪在实际的R-Car SoC中无法确认的模型的中间输出,我们将介绍确定意外结果产生原因并提高准确性的方法。
使用场景
为了将客户训练好的深度学习模型转换成可以在R-Car SoC上执行的格式,需要进行非等价的近似模型压缩,如剪枝和量化。量化是一种将为浮点运算的模型近似为整数运算模型的方法。在这个过程中,每层输出张量的最大值和最小值由多个输入图像估计,每层权重参数的最大值和最小值,以及量化参数(scaleとzero point)将被确定(校准)。当在实际的R-Car SoC或模拟器 (*4) 上验证这个量化模型时,与原始训练模型的结果相比,不同的输入图像数据可能会导致意想不到的结果。在这种情况下,使用Accurate Simulator来分析模型是非常有用的,它可以直接观察模型中的中间输出,而这些输出在实际的R-Car SoC上无法获取。
使用Accurate Simulator
进行模型分析的流程
在上述案例中,校准时输入图像数据的质量或数量不足,可能导致(a)校准不理想或(b)中间输出波动较大的层所导致的量化失败。在这种情况下,首先确定原因是(a)还是(b),然后采取(a)增加或更新输入图像数据并再次进行校准,或(b)确定发生问题的层并增加该层的位宽以提高量化模型的准确性等有效方法。
Accurate Simulator是一个模拟器,旨在确保输出结果与实际的R-Car SoC机器完全匹配。与R-Car SoC不同,Accurate Simulator允许用户提取模型中每一层的中间输出。具体来说,用户可以用Accurate Simulator从输入图像数据的层侧开始逐一提取各层的中间输出,并与原始训练模型的中间输出相比较以确认误差。
演示示例
当使用我们的R-Car SoC时,客户使用我们的R-Car CNN工具将训练好的模型转换为R-Car SoC的执行格式并执行。以下假设在原始训练模型(例如TensorFlow)和R-Car SoC的输出结果在运行时不匹配的情况下找出原因并解决的方法。我们将说明如何使用Accurate Simulator直接比较原始TensorFlow模型和R-Car可执行格式模型的中间输出来估计量化误差。
1
将客户训练好的TensorFlow模型转换为ONNX,并使用我们的R-Car CNN工具将其转换为Accurate Simulator可执行的格式,同时提供量化条件和足够数量的图像数据用于校准。
2
运行客户的TensorFlow模型,提取要比较的层的中间输出。
3
使用R-Car SDK runtime,运行①中生成的Accurate Simulator的执行格式模型。需要比较的层的中间输出可以在这个步骤被提取出来。
4
比较在②和③中得到的中间输出的组成部分。Accurate Simulator的输出结果是在模型量化的前提下以整数表示的,我们也准备了反量化的工具。图中的图表显示了由TensorFlow和Accurate Simulator生成的中间输出张量成分的直接比较。在这个例子中,比较结果几乎是相同的,这一层没有任何问题。
5
重复步骤①到④,以确定近似被破坏的那一层。通过增加相关层的量化参数的显示位宽(如从8位到16位)可以提高量化模型的输出结果精度。
图1:TensorFlow和Accurate Simulator之间的中间输出比较流程
总结
本文介绍了一种方法,当客户训练的模型在我们的R-Car SoC上运行,其输出结果不尽如人意的时候,可以使用Accurate Simulator找出原因并提高模型的精度。Accurate Simulator的设计是为了获得与实际R-Car SoC相当的计算结果,可用于调查无法使用实际设备检查的模型的中间输出。我们希望客户能利用这一点进行模型的调试评估,提高模型的精度。今后,瑞萨将继续致力于R-Car CNN工具的开发,供客户用于模型评估和验证。
1
END
1