TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (2024)

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (1)

这也许是全网最完整的 TDA4部署AI模型教程(之一)。

虽然有过 tensorRT 模型部署的经验,但是在熟悉的 Ubuntu x86 环境下,而这次是完全陌生的 TDA4 嵌入式开发环境。记录下走过的一些路(坑),但愿能为后来者指北。

(深吸一口气)这篇内容可能有点长,分成以下四个章节分别展开。

  1. 装机篇:刷板准备到上电测试

  2. 架构篇:运行环境到推理引擎

  3. 量化篇:硬件加速到量化技巧

  4. 部署篇:EdgeAI Studio 到 custom 模型

正如入门Linux是从装Ubuntu系统开始,对于嵌入式基本零基础的人来说,TDA4之旅也应该是从刷机开始。

开箱检查硬件平台

首先,认识你的硬件平台,比如以下参数:

  • 传感器接口: 最多可接几个摄像头等。

  • 通信接口:USB type A/C ,以太网,CAN- FD,UART。

  • 内存:DRAM大小,是否支持ECC。

  • 显示接口:DP, HDMI。

硬件平台既可以是定制化设计,也可以购买官方开发板EVM。 J721EXSKG01EVM [1] 是TDA4入门套件评估模块(开发板),是一个独立的测试、开发、评估模块,让开发者在J721E处理器子系统上进行软件和硬件开发。然后再加上其他的一些外设(power, camera, wifi etc.),就可以用来进行不同场景的功能开发,包括 Edge AI base, AI-powered Robot和 multi-channel capture AI using fusion board等。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (2)

了解芯片内部构造

集大成者是TDA4的突出特性之一。一般的处理器架构仅具有通用计算和GPU功能,而TDA4却集成了众多的功能IP核,包括通用处理部分的CPU、实时MCU、功能安全MCU、C7x DSP、MMA深度学习加速器、VPAC DMPAC视觉加速器、内部的ISP和以太网交换机,以及PCIe交换机等等。

什么是IP核?IP核是指芯片中具有独立功能的电路模块的成熟设计。从芯片内部IP核的集成数量,可以窥见其设计规模之大、功能之复杂。一篇把 芯片产业链 讲的十分清楚的文章提到,IP核可以分为四类:

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (3)

这款高集成度的超异构芯片,包含了CPU(A72、R5F)、DPU(C7x)、GPU、主MCU等处理器IP。R核外接摄像头I/O连接模块,直接控制摄像头的开闭及数据实时传输,实现高实时性运算;A核负责非实时高性能要求的计算,联合C7x和MMA实现AI加速,完成实深度学习卷积等计算,提升视觉感知的运算能力。GPU负责视频前处理、渲染等功能。此外,为了满足功能安全要求,还设置了双核MCU实现功能安全岛需要的锁步校验功能。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (4)

在接口IP方面,集成了丰富的高速网络接口,包括支持8个外部扩展的Ethernet switch,据称是行业首个芯片集成PCIe switch, 2个dual-role device (DRD)USB。针对汽车车载通信,集成了16路CAN-FD和2个CSI2.0用于视频流数据高速传输。

设计一款复杂的高集成度芯片,不是单纯地将各类IP集合在一起,为了实现整体性能的均衡,还需要对总线的带宽效率,内部cache,RAM等memory的大小进行合理选择与配置。胡说漫谈在《IP核与技术服务》一文中谈到,

复杂的芯片设计过程就像是把绿色图块(自主设计的电路部分)和其他多种颜色图块(外购的不同功能的IP核)拼好完成拼图一样,所不同的是,拼图游戏只要考虑图块的形状,而芯片设计要考量IP核的许多参数和指标,并要把各个IP核和自主设计部分正确连接,保证整个芯片的功能和性能正确无误。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (5)

有关芯片内部子系统的详细介绍,推荐观看 YouTuBe系列。 [2]

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (6)

下载Processor SDK套件

当我第一次看到 下载页面 [3] 时,十分困惑到底该下载哪些文件。因此,我们有必要先搞清楚不同SDK的功能定义。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (7)
  • Linux SDK: 用于A72核上的启动程序、操作系统,文件系统,格式化TF卡。

  • RTOS SDK : 包含R5F、c66x、C7x深度学习核的软件包。

  • QNX SDK: 类似于Linux SDK的作用,运行在A72上的软件

  • Linux-SK SDK: 用在SK-TDA4套件上的安装文件,pre-built binary and file system images with edge AI stack。在这个页面里,意外发现了 Robotics SDK , 运行在Linux SDK for edge AI 上面的Docker环境中(里面有ROS Noetic和ROS2 Foxy)。方便使用ROS生态,快速实现AI 应用。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (8)

还有一个Linux-RT SDK,可是至今我也没太搞清楚这个跟Linux SDK的区别。粗略比较了两者SDK Documentation,也没发现显性的差异。唯一找到的不同是,Linux SDK 的Download页面包含了 tisdk-edgeai-image-j7-evm.tar.xz [4] 文件,这个镜像里应该是有Edge AI stack的相关内容。

一般来说,下载Linux SDK+RTOS SDK是常见搭配。也可以根据自己的需求下载对应的套件,比如你购买了SK-TDA4开发套件,那就下载Linux-SK SDK,但是RTOS SDK仍然需要下载。如果要跑edge AI demos,可能还需要下载dataset文件,例如psdk_rtos_ti_data_set_08_06_00.tar。

安装Processor SDK

下面两张图很好地展示了Procesor SDK的功能划分和模块组成,对软件和固件情况有个大致了解。具体的安装过程,官方文档是最好的教程。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (9) TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (10)

首先是安装Linux SDK,请参见 安装Overview [5] 视频 [6] 。有一点需要注意,Host PC最好是Ubuntu18.04,否则就需要做一些配置修改。(这一点不太用户友好)

The Setup Script will first check to see if the user is running the recommended Ubuntu Long Term Support (LTS) distribution, if not it will exit. If the user is running on a different Ubuntu version or another Linux distribution, they are encouraged to modify the environment setup script to match their distribution. Ubuntu version 18.04 is currently supported.

然后是环境配置和 刷写SD卡 [7] 。在Linux SDK下载列表里,即包含了installer,也有SD卡的boot 和target image文件。可以根据需求选择default, tiny, edgeai其一。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (11)

SD卡有两个分区:一个是BOOT分区(FAT32),存放bootloader 如uboot,另一个是rootfs(ext4),存放Linux文件系统。一般单片机平台的开发,直接用电脑使用USB将固件烧写到eMMC或FLASH。TDA4和NVIDIA的Jeston Xavier一样,也是使用SD卡进行开发,插卡上电启动。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (12)

接着是RTOS SDK安装(其实是解压即可)。RTOS提供了两种安装方式,一种是prebuilt,另一种是build from source。针对不同的应用场景(Vision apps, gateway, MCUSW, etc),编译和SD卡刷写过程也存在一些差异,分别详见以下页面:

  • prebuilt demos [8]

  • Vision app [9]

  • MCUSW [10]

  • Ethernet Firmware [11]

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (13)

上电运行测试

把硬件平台上的各种线束连接好,通电,启动demo脚本。然后,静待见证奇迹的时刻!

如果想要开发自己定义的功能模块,无论是在A核上运行还是R核,都可以参考上一节中诸多页面里提及的build from source步骤,刷写SD卡也如此。嘿,开始动手吧!

如果想要了解更多Training材料,也可以看 TI academy [12] 这个网页。

这节我们将打开芯片内部的软硬件架构设计,深入理解TDA4的AI计算实现过程,这将有助于为AI算法设计和性能优化提供思路。

我曾有一个认知误区,认为(汽车)AI算法工程师无需了解计算架构,只要懂计算框架API调用即可。

如果是通用计算平台,比如HPC,PC等,算法应用工程师确实不用太关注底层计算硬件情况。但是汽车作为一个端侧使用场景,使用嵌入式计算平台,十分强调软硬件协同。要知道,汽车厂商们总是一边想要提供给用户更多更好的功能体验,一边又孜孜不倦地严格控制物料成本,高举精益生产,以此提升自家产品的价格竞争力。所以,高性价比的功能产品设计,自然离不开硬件与软件的协调匹配。也就是说,针对功能场景需求,选择合适的硬件,并在硬件上运行适合的软件。

TDA4目前是众多国内外的汽车厂商和一级供应商选择的计算平台,主要适用于L2 ADAS辅助驾驶功能场景。它是当下行泊一体应用的爆款芯片,约占70%市场份额。与其他芯片相比,TDA4主打性能均衡和高性价比,既可以满足智能驾驶的算力需求,又有成熟的芯片设计,对功能安全也考虑周到,并且在成本方面也有明显优势。

硬件架构:参与AI计算的处理器们

嵌入式系统基本是我的知识盲区,对于下图所示的绝大多数内容,属于只认识字,却不知道是什么。 TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (14)

没关系,我们关心的问题是AI计算的实现过程,所以仅关注参与AI计算的部分即可。TDA4VM上的深度学习计算主要是依靠A72+C7xDSP w/ MMA完成。

TDA4VM有两个Arm Cortex-A72核,属于通用处理器 MPU/CPU,可以运行Linux,QNX操作系统。

C71x DSP是TI DSP家族的新成员,将TI的DSP和EVE内核整合为一个更高性能的内核,并增加了浮点矢量计算功能,具有80GFLOPS、256GOPS算力。

MMA是深度学习矩阵乘法加速器,具有8 TOPS算力。

更多介绍内容可以参考 官方手册 [13]

软件架构:AI计算框架和组件

一张图清楚展示硬件上的软件栈情况。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (15)

绝大部分深度学习计算任务是在C7x+MMA上执行,其他部分任务在A72上执行。

在C7x+MMA上运行的主要软件模块有TI-RTOS,IPC核间通信,PDK平台开发套件,TIDL深度学习推理引擎和编译工具, TI OpenVX/TIOVX中间件。这些模块包含在 Processor SDK RTOS [14] 软件包中,下图是该软件包PSDK RTOS的软件模块层级架构。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (16)

我们重点关注其中的TIDL和TIOVX/OpenVX。

TI Deep learning Product (TIDL) [15] 包含TI的深度学习推理方案,提供了多种主流的开源执行引擎(TFLite Runtime,ONNX Runtime和基于TVM的Runtime),可以在ARM MPU上运行,并且拥有一个基于C7x和MMA的优化的TIDL-RT后端。它还包括必要的DNN编译工具,并提供许多Python和C示例来展示工具和推理方案。下图展示了TIDL在Edge AI studio数据流中的位置。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (17)

TIOVX/OpenVX [16] 是 OpenVX标准的一个实现,为VPAC(Vision Pre-processing Accelerator), DMPAC(Depth and Motion Perception Accelerator), CSI2RX, Display, TIDL, Video decode等模块提供OpenVX nodes,让用户能够使用OpenVX API在TI SOC上创建视觉和计算应用。下图是TIOVX的软件架构。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (18)

OpenVX [17] 又是什么?它是一个计算机视觉函数的标准框架,相当于一个中间件,连接芯片内部的硬件加速去和视觉应用软件层。它支持多家厂商的硬件加速(multi-core CPUs, GPUs, DSP subsystem),包括树莓派、日本索喜、德州仪器、英特尔、AMD、高通等。

OpenVX提供了常用的视觉函数抽象和函数集合的抽象(Graph),提高视觉应用的性能和效率,减少运行时间。OpenVX是TDA4软件栈上参与AI计算任务的重要模块,感兴趣的同学可以了解一下OpenVX的重点数据结构(Node, Graph, Kernel,Context, Parameter),实现了任务和数据独立的执行,在异构芯片上进行并行计算。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (19)

Edge AI: 开箱即用的工具包

在对硬件架构和软件架构有了一定了解后,接着,我们看下TI为TDA4提供的边缘AI开发工具链情况,如下图所示。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (20)

不得不说,这一套工具链真的是相当完整,可见TI对于边缘AI应用的押注极大。其实,TI对于TDA4的期待远不于此,在官网介绍上,这款芯片的定位是, 视觉 AI 处理器设计边缘 AI 系统 [18] ,旨在以低功耗和更低的系统 BOM 成本提供可扩展的吞吐量和计算性能。

工具箱包含了如下部分:

  • edgeai-modelzoo [19] : 提供了一系列预训练模型,覆盖了6大任务:(Image Classification, Object Detection, Semantic Segmentation, Depth Estimation, 3D Object Detection, 6D Pose Estimation)。

  • edgeai-torchvision [20] : 这个是 pytorch/vision [21] 仓的扩展,包含了三类模型和脚本:1)为TI芯片打造的引入QAT后的轻量模型eddgeailite; 2) 原生torchvision lite 模型;3)原生torchvision 模型。此外,也包含了模型优化工具,比如QAT, Sparsity(未完成), Model surgery(未完成)。

  • edgeai-mmdetection [22] , edgeai-yolov5 [23] , edgeai-yolox [24] : 针对一些常见的训练仓库进行扩展,提供轻量版本的模型。

  • edgeai-studio [25] :这是一个云端的集成开发环境,可以方便开发者熟悉模型编译和推理过程,更多内容参考部署篇。

  • edgeai-tidl-tools [26] :提供了推理引擎,编译工具等(model import,PTQ)库文件和脚本。

  • edgeai-benchmark [27] : 方便用户做多个模型的性能比较,为选择和设计适合自己应用场景的模型提供参考。

案例展示: AI计算的完整过程

话不多说,举个例子来理解在TDA4上运行AI计算的完整过程。

这是一个 Image Classification [28] 应用,下图是整个数据流图。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (21)

输入是bmp格式的图片数据、首先,在A72核上进行预处理,包括Resize,格式转换(planer format on C66),Center crop等,得到224 224大小的RGB planar图像。然后,在C7x MMA上进行深度学习计算,输出1000类别的预测结果(32bit 浮点)。接着,在A72核上进行后处理,根据排序选择Top 5类别,并对应到文本名称。最后,将以上结果用1280 720 RGB buffer输出给DSS模块,通过视频接口输出,如下图所示。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (22)

小结

基于我有限的嵌入式开发经验,这次学习TDA4架构的过程还算顺利,TI提供了足够详细的开发资料和案例展示。值得称赞的一点是,TI对document的展现形式和内容颗粒度把握得恰好,容易理解,而不是被大量文字内容劝退(参考对象是我的NV Xavier上手体验)。

TDA4在汽车领域横扫行泊一体市场的既定事实,让我思考这样一个问题,一款爆款芯片的成功因素有哪些。这款芯片带给我的直观感受是,做到了通用性能与目标场景的有效平衡,不过分堆砌处理核数量;提供清晰明了的上手指南,减少文本信息的压迫感;目标场景从来不只是为汽车而生,而是把自己定位成 高效的边缘AI系统 [29]

在驶向边缘AI的星辰大海途中,TDA4还有许多想象等待被解锁。

这一节研究TDA4之 模型量化 。这是一种基于计算机存储和计算过程特点,提升(端侧)模型推理速度,并维持稳定精度的模型压缩方法。

对于一些时间敏感的AI应用,比如自动驾驶,不仅要求AI模型的准确性高,而且对推理速度的要求也是非常严苛。如何让AI模型在端侧设备上跑得又快又准?经广泛实践验证,量化是一种有效途径。

3.1 量化基础知识

量化一般是指把模型的单精度参数(Float32)转化为低精度参数(Int8,Int4),把推理过程中的浮点运算转化为定点运算。

理解定点和浮点运算

一个常见的理解误区是,浮点指的是float小数,定点指的是int整数。其实,浮点与定点的本质区别在于小数点是否固定,两者都可表示小数和整数。int本质上是小数点位于末尾的定点数。

最近恰好在看《CSAPP》第二章,主要描述了计算机对信息的表达和处理,比如浮点数和定点数在计算机中的表示。

对于计算机来说,任何数都是用0-1表示,小数点的位置是人为逻辑上的设定。根据IEEE754标准,浮点数的格式由符号位,指数位和尾数位组成。比如,FP32占用4个字节,共32位,其中1个符号位,8个指数位,23个指数位。而定位数的格式是由符号位、小数位和整数位组成。比如8位定点数,最高位为符号位,整数位和小数位的多少可以设定,若整数位占4位,则小数位占3位。小数位越多,可表示的精度越高;整数位越多,可表示的最大值越大。

浮点运算和定点运算的不同在于,浮点运算在运算过程中,小数点的位置是变动的,而定点运算则是固定不变。如果将浮点数转换成定点数,就可以实现一次读取多个数进行计算,因而也就提高了运算效率。

举个例子,假如有4个32位浮点数:0.145,1.231,2.364,7.512,将它们转成8位定点数(4个整数位)的表示是:1,10,19,60。那么,读一次32位浮点数的时间,就可以同时读4个8位定点数。是不是觉得很赞?但这也是要付出一定代价的。虽然定点运算速度快,硬件实现也相对简单,但缺点也显而易见,容易造成溢出和精度损失。若将上面的定点数转成浮点数,结果分别是0.125,1.250,2.375,7.500。与上面对比,发现差异了吗?

DSP中的定点与浮点

在架构篇中提到,TDA4的AI计算是在C7x DSP /w MMA 上完成。

C7x DSP是TI DSP家族的新成员,将TI的DSP和EVE内核整合为一个更高性能的内核,并增加了浮点矢量计算功能,具有80GFLOPS、256GOPS算力。MMA是深度学习矩阵乘法加速器,具有8 TOPS算力。

根据是否支持浮点计算,DSP可以分为 定点DSP和浮点DSP [30]

定点DSP处理器速度快,功耗低,价格便宜;浮点DSP处理器计算精确,动态范围大,速度快,易于编程,功耗大,价格高。

在硬件上,浮点DSP处理器具有浮点/整数乘法器,整数/浮点算数逻辑运算单元ALU,适合存放扩展精度的浮点结果的寄存器等。数据精确的表示由DSP内部三种数据字长所影响:

  1. I/O信号字长,浮点DSP通常是24位,定点是16位;

  2. 乘法的系数字长。定点系数是16位,与信号数据相同;浮点系数可能是24位或53位,取决于单宽精度还是双宽精度。

  3. 保存乘加器(MAC)运算中间结果的字长。

定点DSP在进行小数运算时,需要进行定标、移位、检查溢出等操作。定点DSP在计算过程中,必须时刻关注溢出的发生,为了防止溢出,要么不断进行移位定标(耗费时间和空间),要么做截尾(精度损失)。

浮点DSP在计算时,扩大了动态范围,提高了精度,节省了运算时间和存储空间,因大为大减少了定标,移位和溢出检查。但是要注意一点,在比较两个浮点数时,永远不要用操作符==来判断相等。

量化加速模型推理

一般,DNN硬件加速的两个基本运算分别是处理单元PE和累加器ACC。参考高通出品的《 A White Paper on Neural Network [31] 》,下图展示了神经网络加速计算 的基本过程。首先累加器加载偏置值 ,然后将权重值 和输入值 加载到数组中,并在单个循环中计算得到 乘积,最后把乘积和偏置值进行累加得到

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (23)

对于更大的矩阵-向量乘法,上述乘累加(MAC)过程会多次执行。一旦所有循环执行完成,累加器中的结果会被写回内存中,以便下一层神经网络使用。通常,神经网络的训练使用FP32的权重和激活值。如果使用FP32进行推理,不仅需要处理单元PE和累加器ACC支持浮点计算,还会需要在32位数据加载和写回内存上花费很多时间和能耗。如果使用低精度的定点数,比如int8, 不仅减少数据传输量,也降低了MAC的规模和能耗。一般,这些计算的成本与使用的位数成二次线性关系,而且定点加法也比浮点加法的效率更高。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (24)

综上,当量化把FP32转成Int8后,不仅大大减少了参数的存储空间,也提高了读取效率,因而推理速度就能显著提升了。也正如上述提到的,这个过程会损失一部分数据精度。虽然数据精度的损失了一些,但这并不意味着最终推理结果的精度损失。我们可以通过一定方法,实现推理结果精度的稳定。

量化方法

按照量化阶段,可以分为:

  • Post-training quantization (PTQ,训练后量化、离线量化);

  • Quantization-aware training (QAT,训练时量化,伪量化,在线量化)。

训练后量化(PTQ)可以将预先训练好的FP32模型转换为定点模型,且不需要训练流程。通常不需要数据(data-free)或者只需要很少的校准数据集,因此是一种轻量级的、一键式的量化方法。一般进行量化时,首选PTQ。如果发现效果不佳,尤其时在低位量化时(int4),可以考虑尝试训练时优化QAT。

对于PTQ,本质是为每个量化器找到良好的量化范围,也就是选择合适的量化系数(比例因子),将浮点值域映射到定点值域空间。一般采用线性量化方式。

  • 对称量化和非对称量化 [32] 。区别在于偏移量是否为0,也就是是否把FP32零映射到INT8零。对称量化比较简单,而非对称量化一般能够更好地处理数据分布不均匀的情况。二次幂量化是指比例因子被限制为二次幂,这样可以提高计算效率,因为缩放操作对应了移位操作。

  • 量化误差的平衡 [33] 。当浮点数值大于定点数的值域空间时,将会产生截断误差;当浮点数转成定点数时,存在四舍五入取整操作,因而产生舍入误差。如果想要减少截断误差,可以通过增大比例因子从而扩大量化范围,但同时也导致舍入误差增加,因为舍入误差的范围是 。选择合适的量化参数,就是实现截断误差和舍入误差之间的平衡。

  • 量化颗粒度:针对量化数据维度区分,可以分为逐层量化(per tensor)和逐通道量化(per channel)。逐层量化是指每个网络层采用同一个阈值来进行量化;而逐通道量化是对每一层的每个通道都有各自的阈值。

  • 量化方法的改进:浮点数动态范围确定(MinMax, MovingAverageMinMax, Kullback-Leibler divergence); 跨层均衡化,偏正校正,自适应取整。

QAT 通过模拟量化操作对训练期间的量化噪声进行建模。与 PTQ 相比,此训练过程可以找到更好的量化解决方案,同时实现更有效和更激进的激活量化。然而,更高的准确性也要求更多的训练成本,更长的训练时间,需要带标签的数据集,超参数搜索等。

3.2 TDA4量化指南

量化的本质是把浮点计算转换成定点计算。看似短短几个字,却蕴藏了丰富的量化经验和知识。有可能量化技巧的些微差异,将导致推理性能的显著不同。这也让我进一步加深了”神经网络是一门实验科学“的认知。

由于量化与硬件密切相关,我们十分有必要先仔细阅读TI官方给出的量化建议。以下四个页面强烈推荐:

  1. AI计算加速的用户参数设置列表: User options for TIDL Acceleration. [34]

  2. 概览TIDL提供的量化选项: Quantization on TIDL [35]

  3. 介绍TI量化实践经验(PTQ+QAT): Quantization [36]

  4. 展示PTQ中Calibration的实现与使用: Post Training Calibration [37]

下面是以上内容的浓缩版本。

要点概述

量化实现主要采用了 Power-Of-2, Symmetric, Per-Tensor Quantization 等方法,支持16-bit 和8-bit定点推理。量化对象包括了weights, feature maps and all operations。

优先使用PTQ方法,实在不行再尝试QAT。

PTQ包括Simple Calibration, Advanced Calibration, Mix Precision, Model Surge and Sparsity Model(Not available yet)。

QAT中使用了PACT2,而不是常见的PACT。 PACT [38] 是指引入一个带有train变量的激活函数来替代原有的RELU或RELU6; PACT2 [39] 主要区别是 Power-of-2 trainable clip threshold。

当发现8-bit推理精度下降严重时,首先检查16-bit推理效果如何。如果16bit推理效果与浮点计算是差异不大,那说明问题在量化过程。如果16-bit推理也比较差,那很有可能是其他地方的问题,而不是量化操作。

PTQ经验

  • 使用合适的正则化参数(Regularization, weight decay)。不建议太小,比如1e-5,推荐使用1e-4,或是接近这个值的数。

  • 推荐在每一个卷积层后使用Batch Normalization,尤其对Depthwise Convolution Layer有用。不过,不建议在segmentation/objection dection network的最后一层使用,可能会对精度影响很大。

  • 相比MobileNets, ResNets, DenseNets, EfficientNets(Lite)等嵌入式友好型网络, 更推荐使用RegNetX,可以在量化过程的复杂性和易用性之间取得平衡,保证精度。

QAT经验

  • 相同模块不应该在一个module内使用多次。

  • 推荐使用Modules,而不是functional or tensor operations。

  • 支持Multi-GPU training/ validation。

具体参数的设置方法请详见 这里 [40] 。参数说多也不多,说少也不少,实话还是有点懵,重点搞清楚 accuracy_level deny_list mixed_precision_factor 这几个常用的参数定义。

3.3 一些疑问:DSP硬件加速

为什么不经常看到利用DSP作为机器学习硬件加速器的文章或者新闻? 知乎上有人问 [41]

用dsp大概还不如gpu吧,相同成本dsp算力不如gpu,又缺乏gpu这样的生态,而且玩不出什么花样,dsp能做的gpu也能做。fpga/asic就不一样了,不同量化不同网络结构不同做法对性能和效率的影响天差地别,在一些特定任务上能获得远高于gpu的算力,能讨论的空间很大。比如一月份华为发的用fpga实现addernet的效果就很好,相比传统乘法卷积神经网络,addernet精度更高,且能耗比大幅领先。

有篇文章 [42] 里说,DSP适用于卷积神经网络CNN,但可能对循环神经网络RNN和长短期记忆网络 LSTM等处理语音和自然语言的网络无能为力。

确实通常RNN和LSTM计算是基于GPU和FPGA进行模型推理。TDA4也是主要是针对机器视觉CNN任务,暂时没有介绍语音和自然语言类的任务。

我经过简单搜索,找到了两篇基于DSP进行RNN和LSTM网络推理的论文:

A Hardware Accelerated Low Power DSPfor Recurrent Neural Networks

基于通用向量 DSP 的深度学习硬件加速技术 [43]

尽管GPU在AI领域已是非常普遍,但是对于许多边缘应用(汽车、电视、家居安防)而言,GPU似乎太贵、太耗电了。嵌入式DSP以低成本、低功耗和软件编程的灵活性等特点,也许能有一定的发展空间。

一篇 AI芯片创业者的反思 [44] 中提到,“在深度学习早期的端侧加速方案中,有很多SIMD DSP的案例。但是DSP的特点决定了它可以做万金油,但用在特定领域时又发现不是最合适,所以很快市场上就出现了专用的AI加速芯片。”

AI芯片的一个重要指标是能耗效率(energy efficiency), SIMD DSP之所以被替代的一个重要原因是这个指标不够好,另一个原因在于SIMD的并行度依然不够高。

访存(memory access)一直是限制AI计算效率的瓶颈之一。业界有 AI芯片的三条设计原则 [45] :1,存储层次化(memory hierarchy); 2,数据复用(data reuse); 3,片上互连(interconnect)。这三条原则必须同时使用才能达到降低访存的效果,其中选择不同的数据复用算法又会有不同的微架构。

端侧AI加速芯片的未来会有DSP的一席之地吗?

选择部署环境

通常,芯片厂商会提供两种方式让开发者在开发阶段进行测试:

  1. PC Host Emulation,也就是在 Linux/Windows 虚拟一个运行环境,让结果与在 Device 上基本没差。

  2. EVM board,俗称评估模块,类似于一个入门开发板,搭载自家的处理器芯片。

要是既不想选择 1(繁琐的环境安装),也不想选择 2(不方便买到货),有没有既简单上手又省时省钱的选择呢?

我还真找到了第三种,那就是 EDGE-AI-STUDIO [46] ,支持在网页端(Jupyter notebook)进行模型部署验证,测试模型性能。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (25)

认识 Edge AI Studio

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (26)

Edge AI Studio 集成了一系列工具,旨在帮助开发者在 TI 嵌入式设备上加速 AI 应用的开发。主要有两个产品:Model Analyzer 和 Model Composer。

Model Analyzer,前身叫做 TI edge AI cloud, 可以让开发者在一个远程 TI 开发板上,评估测试 AI 模型的推理效果,并进行多个模型的 Benchmark [47] ,以及部署自己的模型。

Model Composer 是一个完整的创建 AI 应用的集成方案,支持让开发者做数据采集,标注,模型训练,以及上板编译。比如,用自己的数据重新训练 TI Model Zoo [48] 的模型和更多性能优化操作。

这里我主要介绍 Model Analyzer 的开箱方式。

  1. 登陆 TI Developer Zone [49] ,注册账号。

  2. 下拉 Tools,选择 Edge AI studio, 然后进入 Model Analyzer。

  3. 选择目标芯片。目前提供了四种芯片选型,分别是 AM62A,AM68A,AM69A, TDA4VM,对应了不同的算力。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (27)
  1. 选择应用类型和引擎框架。一类是 Find youre model,了解不同模型任务的性能对比;另一个类是 Get model benchmarks,既可以选择 TI 提供的预编译好的模型,也可以选择编译自己的模型。引擎框架支持 TensorFlow lite,Onnx runtime 和 TVM。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (28)

接下来,就进入了熟悉的 Jupyter Notebook 界面,无论是跑 Demo,还是手抠代码,任你自由发挥。

我就不过多赘述运行各种任务 Demo 的过程了,直接进入部署 Custom AI model 环节。

部署 custom AI 模型

由于最近听了太多大模型的报道,反倒让我对小而美的模型产生了浓厚兴趣。

于是,我转向了号称做到手机端 1ms 延迟的主干网模型 MobileOne。这是工业界更喜欢的 CNN 架构,没有 Self-Attention。通过 MobileNet, 重参数技术、训练技巧等组合创新,实现了 ImageNet1k 75.9 的 TOP1 精度,几乎是目前轻量级模型的最优效果。

大致过程如下:

  1. ml-mobileone [50] 下载训练好的 torch 模型(mobileOne-s0.pth)

  2. 转换成 onnx 格式,得到 mobileone-s0.onnx。在 36 server 开启 nvidia-docker,编写 torch2onnx 转换脚本

  3. 上传到 TI Edge AI studio>>workspace。花了很长时间才找到这个位置。原本是想从通过 wget url 等方式,但是发现 TI 并不允许 external download link。

  4. 仿照 notebook/custom-onnx. ipy 的基本流程,主要是替换 model path 和设置 compile options。但是出现了如下报错。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (29)

原因像是不支持某些算子加速。

检查了 cloud EVM 的 TI DL tools version 似乎是 8.6.1,对应支持的算子可以在 edge-tidl-tools-github [51] 查到。然而,却没有找到是什么算子的问题。难道是 MobileOne-s0 有什么特别之处吗?

然后,我尝试了另外一种验证方法,从 torchvision 下载一个 mobilenetv2 [52] 模型,经过模型转换和 TIDL 编译,遇到了类似的问题。难道我下载的 mobilenetv2 和 TI 提供的 mobilenetv2 有什么不同?

经过人肉比对网络图层结构,并没有发现差异。奇怪了?

我开始暴力解法,逐一排除每个算子的嫌疑。最终结果是 tv-mobilenetv2 不支持 Flatten,mobileone-s0 不支持 Reshape, 需要在 compile options 里设置成 deny_list,如下图所示。

 # model compilation options
compile_options = {
'tidl_tools_path' : os.environ['TIDL_TOOLS_PATH'],
'artifacts_folder' : output_dir,
'tensor_bits' : num_bits,
'accuracy_level' : accuracy,
'advanced_options:calibration_frames' : len(calib_images),
'advanced_options:calibration_iterations' : 3, # used if accuracy_level = 1
'debug_level' : 1,
'deny_list' : "Reshape",
}

最后,展示 tv-mobilenetv2 和 mobileone-s0 对一张图片的推理结果如下。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (30)
TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (31)

以上,便是 TDA4 从零开始部署 AI 模型的全过程。

但是,本篇的故事还未结束。请细细观察一下,mobileOne-s0 在 TDA4 上的推理速度。

为何如此慢呢?我在知乎上回答了对这个问题,感兴趣的朋友可以移步 你有没有发现同一个模型部署在不同终端上,推理性能差异非常大? [53]

简单版的回答: 由于不同终端的硬件加速配置不同,导致同一个模型在不同终端上的推理表现可能会产生较大的差异

(全篇完)

:汽车电子与软件正在筹划组织一期 TDA4开发者吐槽大会 ,搭建一个纯技术的讨论平台,有兴趣的小伙伴欢迎联系组织者。(活动仅面向TDA4的开发者开放,闭门线下讨论)。

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (32)

参考资料

[1]

J721EXSKG01EVM: https://www.ti.com.cn/tool/cn/SK-TDA4VM

[2]

YouTuBe系列。: https://www.youtube.com/playlist?list=PLISmVLHAZbTRkVcGm3Bkkzx7Z2vFsM_zb

[3]

下载页面: https://www.ti.com/tool/PROCESSOR-SDK-J721E

[4]

tisdk-edgeai-image-j7-evm.tar.xz: https://dr-download.ti.com/software-development/software-development-kit-sdk/MD-U6uMjOroyO/08.06.01.02/tisdk-edgeai-image-j7-evm.tar.xz

[5]

安装Overview: https://software-dl.ti.com/jacinto7/esd/processor-sdk-linux-rt-jacinto7/08_06_01_02/exports/docs/linux/Overview.html

[6]

视频: https://www.youtube.com/watch?v=3XFhe8Bp1wk&list=PLISmVLHAZbTRkVcGm3Bkkzx7Z2vFsM_zb&index=16

[7]

刷写SD卡: https://software-dl.ti.com/jacinto7/esd/processor-sdk-linux-jacinto7/08_06_01_02/exports/docs/linux/Overview/Processor_SDK_Linux_Formatting_SD_Card.html

[8]

prebuilt demos: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/psdk_rtos/docs/user_guide/out_of_box_j721e.html

[9]

Vision app: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/vision_apps/docs/user_guide/RUN_INSTRUCTIONS.html#run_steps_linux

[10]

MCUSW: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/mcusw/mcal_drv/docs/drv_docs/mcusw_c_ug_top.html#mcusw_run_sbl_j721e_mmc

[11]

Ethernet Firmware: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/ethfw/docs/user_guide/demo_ethfw_combined_top.html

[12]

TI academy: https://dev.ti.com/tirex/explore/node?node=AAz9Dxht0WlNjAge02XsaQ

[13]

官方手册: https://www.ti.com/document-viewer/TDA4VM/datasheet/GUID-55814AC4-0871-4E32-BBAF-9BD82ED8CDA2#TITLE-SPRSP36SPRS9322174

[14]

Processor SDK RTOS: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/08_06_00_12/exports/docs/psdk_rtos/docs/user_guide/sdk_components_j721e.html?highlight=pdk#tidl

[15]

TI Deep learning Product (TIDL): https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/08_06_00_12/exports/docs/tidl_j721e_08_06_00_10/ti_dl/docs/user_guide_html/index.html

[16]

TIOVX/OpenVX: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/tiovx/docs/user_guide/index.html

[17]

OpenVX: https://registry.khronos.org/OpenVX/specs/1.1/html/d0/d84/page_design.html#sec_framework_objects

[18]

视觉 AI 处理器设计边缘 AI 系统: https://www.ti.com.cn/document-viewer/cn/lit/html/ZHCY189A/GUID-F1ECAE9B-BA7C-47EF-918F-267D35F75BA8#GUID-A0FFE567-D215-4F65-91FC-0FE44B9BB00B

[19]

edgeai-modelzoo: https://github.com/TexasInstruments/edgeai-modelzoo

[20]

edgeai-torchvision: https://github.com/TexasInstruments/edgeai-torchvision#guidelines-for-model-training--quantization

[21]

ytorch/vision: https://github.com/pytorch/vision

[22]

edgeai-mmdetection: https://github.com/TexasInstruments/edgeai-mmdetection

[23]

edgeai-yolov5: https://github.com/TexasInstruments/edgeai-yolov5

[24]

edgeai-yolox: https://github.com/TexasInstruments/edgeai-yolox

[25]

edgeai-studio: https://www.ti.com/tool/EDGE-AI-STUDIO

[26]

edgeai-tidl-tools: https://github.com/TexasInstruments/edgeai-tidl-tools

[27]

edgeai-benchmark: https://github.com/TexasInstruments/edgeai-benchmark

[28]

Image Classification: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/08_06_00_12/exports/docs/vision_apps/docs/user_guide/group_apps_dl_demos_app_tidl.html

[29]

高效的边缘AI系统: https://www.ti.com.cn/document-viewer/cn/lit/html/ZHCY189A/GUID-A605292E-E4B2-4F65-8F64-F1C3D01D09C3#GUID-2C5CAF71-385A-45C1-9769-DD95A77139C4

[30]

定点DSP和浮点DSP: https://blog.csdn.net/cuiweitju/article/details/39395715

[31]

A White Paper on Neural Network: https://link.zhihu.com/?target=https%3A//arxiv.org/abs/2106.08295

[32]

对称量化和非对称量化: https://github.com/HarleysZhang/deep_learning_system/blob/main/4-model_compression/%E6%A8%A1%E5%9E%8B%E5%8E%8B%E7%BC%A9-%E9%87%8F%E5%8C%96%E7%AE%97%E6%B3%95%E6%A6%82%E8%BF%B0.md

[33]

量化误差的平衡: https://zhuanlan.zhihu.com/p/462990610

[34]

User options for TIDL Acceleration.: https://github.com/TexasInstruments/edgeai-tidl-tools/blob/rel_8_6/examples/osrt_python/README.md#user-options-for-tidl-acceleration

[35]

Quantization on TIDL: https://github.com/TexasInstruments/edgeai-tidl-tools/blob/rel_8_6/docs/tidl_fsg_quantization.md#quantization-options

[36]

Quantization: https://github.com/TexasInstruments/edgeai-torchvision/blob/master/docs/pixel2pixel/Quantization.md

[37]

Post Training Calibration: https://github.com/TexasInstruments/edgeai-torchvision/blob/master/docs/pixel2pixel/Quantization.md

[38]

PACT: https://zhuanlan.zhihu.com/p/392592993

[39]

PACT2: https://patents.justia.com/patent/20210224658#history

[40]

这里: https://github.com/TexasInstruments/edgeai-tidl-tools/blob/rel_8_6/examples/osrt_python/README.md#user-options-for-tidl-acceleration

[41]

知乎问题-DSP硬件加速: https://www.zhihu.com/question/446008489

[42]

深度学习芯片之争: https://cloud.tencent.com/developer/article/1053927?areaSource=106001.7

[43]

DSP用于AI硬件加速: http://scis.scichina.com/cn/2019/N112018-00288.pdf

[44]

AI芯片创业者的反思: https://cx.comake.online/getNewsCon?key=1658800933654004

[45]

AI芯片的三条设计原则: https://cx.comake.online/getNewsCon?key=1658800933654004

[46]

EDGE-AI-STUDIO: https://www.ti.com/tool/EDGE-AI-STUDIO

[47]

Benchmark: https://github.com/TexasInstruments/edgeai-benchmark

[48]

TI Model Zoo: https://github.com/TexasInstruments/edgeai-modelzoo

[49]

TI Developer Zone: https://dev.ti.com/

[50]

ml-mobileone: https://github.com/apple/ml-mobileone/tree/main

[51]

edge-tidl-tools-github: https://github.com/TexasInstruments/edgeai-tidl-tools/blob/rel_8_6/docs/supported_ops_rts_versions.md

[52]

mobilenetv2: https://download.pytorch.org/models/mobilenet_v2-b0353104.pth

[53]

知乎问题-AI终端部署: https://www.zhihu.com/question/601448533/answer/3033718310

TDA4 之AI应用开发 | 万字笔记-电子头条-EEWORLD电子工程世界 (2024)

References

Top Articles
Latest Posts
Article information

Author: Sen. Emmett Berge

Last Updated:

Views: 5538

Rating: 5 / 5 (60 voted)

Reviews: 83% of readers found this page helpful

Author information

Name: Sen. Emmett Berge

Birthday: 1993-06-17

Address: 787 Elvis Divide, Port Brice, OH 24507-6802

Phone: +9779049645255

Job: Senior Healthcare Specialist

Hobby: Cycling, Model building, Kitesurfing, Origami, Lapidary, Dance, Basketball

Introduction: My name is Sen. Emmett Berge, I am a funny, vast, charming, courageous, enthusiastic, jolly, famous person who loves writing and wants to share my knowledge and understanding with you.