AI application development for TDA4 | 10,000-word notes
This is perhaps the most complete TDA4 deployment AI model tutorial (one) on the Internet.
Although I have experience in tensorRT model deployment, but in the familiar Ubuntu x86 environment, this time it is a completely unfamiliar TDA4 embedded development environment. I’ve recorded some of the roads (pits) I’ve traveled, hoping to be able to point the way for those who come after me.
(Take a deep breath) This article may be a bit long, so it is divided into the following four chapters.
-
Installation: from flash board preparation to power-on test
-
Architecture: Running environment to inference engine
-
Quantification: Hardware acceleration to quantization techniques
-
Deployment: EdgeAI Studio to custom model
1 Installation
Just as getting started with Linux starts with installing the Ubuntu system, for people with zero basic knowledge of embedded systems, the TDA4 journey should also start with flashing the computer.
Unboxing and inspecting the hardware platform
First, know your hardware platform, such as the following parameters:
-
Sensor interface: can connect up to several cameras, etc.
-
Communication interface: USB type A/C, Ethernet, CAN-FD, UART.
-
Memory: DRAM size, whether ECC is supported.
-
Display interface: DP, HDMI.
The hardware platform can be customized or you can purchase the official development board EVM. J721EXSKG01EVM [1] is a TDA4 starter kit evaluation module (development board). It is an independent test, development, and evaluation module that allows developers to perform software and hardware development on the J721E processor subsystem. Then coupled with some other peripherals (power, camera, wifi, etc.), it can be used to develop functions in different scenarios, including Edge AI base, AI-powered Robot and multi-channel capture AI using fusion board, etc.
Understand the internal structure of the chip
One of the outstanding features of TDA4 is the combination of everything. The general processor architecture only has general computing and GPU functions, but TDA4 integrates numerous functional IP cores, including general processing part CPU, real-time MCU, functional safety MCU, C7x DSP, MMA deep learning accelerator, VPAC DMPAC visual accelerator , internal ISP and Ethernet switches, and PCIe switches, etc.
What is an IP core? IP core refers to the mature design of circuit modules with independent functions in the chip. From the number of integrated IP cores inside the chip, we can see the large scale of its design and the complexity of its functions. An article that explains the chip industry chain very clearly mentioned that IP cores can be divided into four categories:
This highly integrated hyper-heterogeneous chip includes processor IP such as CPU (A72, R5F), DPU (C7x), GPU, and main MCU. The R core is connected to an external camera I/O connection module to directly control the opening and closing of the camera and real-time data transmission to achieve high real-time computing; the A core is responsible for calculations with non-real-time high performance requirements, and combines C7x and MMA to achieve AI acceleration and complete real-time deep learning. Convolution and other calculations improve the computing power of visual perception. The GPU is responsible for video pre-processing, rendering and other functions. In addition, in order to meet the functional safety requirements, a dual-core MCU is also set up to implement the lock-step verification function required by the functional safety island.
In terms of interface IP, it integrates a wealth of high-speed network interfaces, including an Ethernet switch that supports 8 external expansions. It is said to be the industry's first chip-integrated PCIe switch and 2 dual-role device (DRD) USB. For automotive in-vehicle communication, 16 channels of CAN-FD and 2 CSI2.0 are integrated for high-speed transmission of video stream data.
Designing a complex, highly integrated chip is not simply a collection of various IPs. In order to achieve a balanced overall performance, it is also necessary to reasonably select and configure the bandwidth efficiency of the bus, the size of internal cache, RAM and other memories. Hushuo Tantan mentioned in the article "IP Core and Technical Services",
The complex chip design process is like putting together green tiles (self-designed circuit parts) and other multi-colored tiles (outsourced IP cores with different functions) to complete a jigsaw puzzle. The difference is that the jigsaw puzzle only requires Considering the shape of the tile, the chip design must consider many parameters and indicators of the IP core, and each IP core must be correctly connected to the self-designed parts to ensure that the functions and performance of the entire chip are correct.
For a detailed introduction to the internal subsystems of the chip, it is recommended to watch the YouTube series. [2]
Download Processor SDK Kit
When I first saw the download page [3] , I was very confused about which files to download. Therefore, it is necessary for us to first clarify the function definitions of different SDKs.
-
Linux SDK: used for the startup program, operating system, file system, and formatted TF card on the A72 core.
-
RTOS SDK: Software package including R5F, c66x, and C7x deep learning cores.
-
QNX SDK: Similar to the Linux SDK, software running on the A72
-
Linux-SK SDK: Installation files used on the SK-TDA4 suite, pre-built binary and file system images with edge AI stack. On this page, I accidentally discovered the Robotics SDK , which runs in the Docker environment on top of the Linux SDK for edge AI (which includes ROS Noetic and ROS2 Foxy). Conveniently use the ROS ecosystem to quickly implement AI applications.
There is also a Linux-RT SDK, but I still don’t quite understand the difference between this and the Linux SDK. I roughly compared the two SDK Documentations and found no obvious differences. The only difference found is that the Download page of the Linux SDK contains the tisdk-edgeai-image-j7-evm.tar.xz [4] file. This image should contain related content of the Edge AI stack.
Generally speaking, downloading Linux SDK+RTOS SDK is a common combination. You can also download the corresponding kit according to your own needs. For example, if you purchase the SK-TDA4 development kit, then download the Linux-SK SDK, but the RTOS SDK still needs to be downloaded. If you want to run edge AI demos, you may also need to download the dataset file, such as psdk_rtos_ti_data_set_08_06_00.tar.
Install Processor SDK
The following two pictures nicely illustrate the functional division and module composition of Procesor SDK, giving you a general understanding of the software and firmware. For the specific installation process, the official documentation is the best tutorial.
首先是安装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其一。
SD卡有两个分区:一个是BOOT分区(FAT32),存放bootloader 如uboot,另一个是rootfs(ext4),存放Linux文件系统。一般单片机平台的开发,直接用电脑使用USB将固件烧写到eMMC或FLASH。TDA4和NVIDIA的Jeston Xavier一样,也是使用SD卡进行开发,插卡上电启动。
接着是RTOS SDK安装(其实是解压即可)。RTOS提供了两种安装方式,一种是prebuilt,另一种是build from source。针对不同的应用场景(Vision apps, gateway, MCUSW, etc),编译和SD卡刷写过程也存在一些差异,分别详见以下页面:
-
prebuilt demos [8]
-
Vision app [9]
-
MCUSW [10]
-
Ethernet Firmware [11]
上电运行测试
把硬件平台上的各种线束连接好,通电,启动demo脚本。然后,静待见证奇迹的时刻!
如果想要开发自己定义的功能模块,无论是在A核上运行还是R核,都可以参考上一节中诸多页面里提及的build from source步骤,刷写SD卡也如此。嘿,开始动手吧!
如果想要了解更多Training材料,也可以看 TI academy [12] 这个网页。
2 架构篇
这节我们将打开芯片内部的软硬件架构设计,深入理解TDA4的AI计算实现过程,这将有助于为AI算法设计和性能优化提供思路。
我曾有一个认知误区,认为(汽车)AI算法工程师无需了解计算架构,只要懂计算框架API调用即可。
如果是通用计算平台,比如HPC,PC等,算法应用工程师确实不用太关注底层计算硬件情况。但是汽车作为一个端侧使用场景,使用嵌入式计算平台,十分强调软硬件协同。要知道,汽车厂商们总是一边想要提供给用户更多更好的功能体验,一边又孜孜不倦地严格控制物料成本,高举精益生产,以此提升自家产品的价格竞争力。所以,高性价比的功能产品设计,自然离不开硬件与软件的协调匹配。也就是说,针对功能场景需求,选择合适的硬件,并在硬件上运行适合的软件。
TDA4目前是众多国内外的汽车厂商和一级供应商选择的计算平台,主要适用于L2 ADAS辅助驾驶功能场景。它是当下行泊一体应用的爆款芯片,约占70%市场份额。与其他芯片相比,TDA4主打性能均衡和高性价比,既可以满足智能驾驶的算力需求,又有成熟的芯片设计,对功能安全也考虑周到,并且在成本方面也有明显优势。
硬件架构:参与AI计算的处理器们
嵌入式系统基本是我的知识盲区,对于下图所示的绝大多数内容,属于只认识字,却不知道是什么。
没关系,我们关心的问题是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计算框架和组件
一张图清楚展示硬件上的软件栈情况。
绝大部分深度学习计算任务是在C7x+MMA上执行,其他部分任务在A72上执行。
在C7x+MMA上运行的主要软件模块有TI-RTOS,IPC核间通信,PDK平台开发套件,TIDL深度学习推理引擎和编译工具, TI OpenVX/TIOVX中间件。这些模块包含在 Processor SDK RTOS [14] 软件包中,下图是该软件包PSDK RTOS的软件模块层级架构。
我们重点关注其中的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数据流中的位置。
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的软件架构。
OpenVX [17] 又是什么?它是一个计算机视觉函数的标准框架,相当于一个中间件,连接芯片内部的硬件加速去和视觉应用软件层。它支持多家厂商的硬件加速(multi-core CPUs, GPUs, DSP subsystem),包括树莓派、日本索喜、德州仪器、英特尔、AMD、高通等。
OpenVX提供了常用的视觉函数抽象和函数集合的抽象(Graph),提高视觉应用的性能和效率,减少运行时间。OpenVX是TDA4软件栈上参与AI计算任务的重要模块,感兴趣的同学可以了解一下OpenVX的重点数据结构(Node, Graph, Kernel,Context, Parameter),实现了任务和数据独立的执行,在异构芯片上进行并行计算。
Edge AI: 开箱即用的工具包
在对硬件架构和软件架构有了一定了解后,接着,我们看下TI为TDA4提供的边缘AI开发工具链情况,如下图所示。
不得不说,这一套工具链真的是相当完整,可见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] 应用,下图是整个数据流图。
输入是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架构的过程还算顺利,TI提供了足够详细的开发资料和案例展示。值得称赞的一点是,TI对document的展现形式和内容颗粒度把握得恰好,容易理解,而不是被大量文字内容劝退(参考对象是我的NV Xavier上手体验)。
TDA4在汽车领域横扫行泊一体市场的既定事实,让我思考这样一个问题,一款爆款芯片的成功因素有哪些。这款芯片带给我的直观感受是,做到了通用性能与目标场景的有效平衡,不过分堆砌处理核数量;提供清晰明了的上手指南,减少文本信息的压迫感;目标场景从来不只是为汽车而生,而是把自己定位成 高效的边缘AI系统 [29] 。
在驶向边缘AI的星辰大海途中,TDA4还有许多想象等待被解锁。
3 量化篇
这一节研究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内部三种数据字长所影响:
-
I/O信号字长,浮点DSP通常是24位,定点是16位;
-
乘法的系数字长。定点系数是16位,与信号数据相同;浮点系数可能是24位或53位,取决于单宽精度还是双宽精度。
-
保存乘加器(MAC)运算中间结果的字长。
定点DSP在进行小数运算时,需要进行定标、移位、检查溢出等操作。定点DSP在计算过程中,必须时刻关注溢出的发生,为了防止溢出,要么不断进行移位定标(耗费时间和空间),要么做截尾(精度损失)。
浮点DSP在计算时,扩大了动态范围,提高了精度,节省了运算时间和存储空间,因大为大减少了定标,移位和溢出检查。但是要注意一点,在比较两个浮点数时,永远不要用操作符==来判断相等。
量化加速模型推理
一般,DNN硬件加速的两个基本运算分别是处理单元PE和累加器ACC。参考高通出品的《 A White Paper on Neural Network [31] 》,下图展示了神经网络加速计算 的基本过程。首先累加器加载偏置值 ,然后将权重值 和输入值 加载到数组中,并在单个循环中计算得到 乘积,最后把乘积和偏置值进行累加得到 。
对于更大的矩阵-向量乘法,上述乘累加(MAC)过程会多次执行。一旦所有循环执行完成,累加器中的结果会被写回内存中,以便下一层神经网络使用。通常,神经网络的训练使用FP32的权重和激活值。如果使用FP32进行推理,不仅需要处理单元PE和累加器ACC支持浮点计算,还会需要在32位数据加载和写回内存上花费很多时间和能耗。如果使用低精度的定点数,比如int8, 不仅减少数据传输量,也降低了MAC的规模和能耗。一般,这些计算的成本与使用的位数成二次线性关系,而且定点加法也比浮点加法的效率更高。
综上,当量化把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官方给出的量化建议。以下四个页面强烈推荐:
-
AI计算加速的用户参数设置列表: User options for TIDL Acceleration. [34]
-
概览TIDL提供的量化选项: Quantization on TIDL [35]
-
介绍TI量化实践经验(PTQ+QAT): Quantization [36]
-
展示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 DSP for 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的一席之地吗?
4 部署篇
选择部署环境
通常,芯片厂商会提供两种方式让开发者在开发阶段进行测试:
-
PC Host Emulation,也就是在 Linux/Windows 虚拟一个运行环境,让结果与在 Device 上基本没差。
-
EVM board,俗称评估模块,类似于一个入门开发板,搭载自家的处理器芯片。
要是既不想选择 1(繁琐的环境安装),也不想选择 2(不方便买到货),有没有既简单上手又省时省钱的选择呢?
我还真找到了第三种,那就是 EDGE-AI-STUDIO [46] ,支持在网页端(Jupyter notebook)进行模型部署验证,测试模型性能。
认识 Edge AI Studio
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 的开箱方式。
-
登陆 TI Developer Zone [49] ,注册账号。
-
下拉 Tools,选择 Edge AI studio, 然后进入 Model Analyzer。
-
选择目标芯片。目前提供了四种芯片选型,分别是 AM62A,AM68A,AM69A, TDA4VM,对应了不同的算力。
-
选择应用类型和引擎框架。一类是 Find youre model,了解不同模型任务的性能对比;另一个类是 Get model benchmarks,既可以选择 TI 提供的预编译好的模型,也可以选择编译自己的模型。引擎框架支持 TensorFlow lite,Onnx runtime 和 TVM。
接下来,就进入了熟悉的 Jupyter Notebook 界面,无论是跑 Demo,还是手抠代码,任你自由发挥。
我就不过多赘述运行各种任务 Demo 的过程了,直接进入部署 Custom AI model 环节。
部署 custom AI 模型
由于最近听了太多大模型的报道,反倒让我对小而美的模型产生了浓厚兴趣。
于是,我转向了号称做到手机端 1ms 延迟的主干网模型 MobileOne。这是工业界更喜欢的 CNN 架构,没有 Self-Attention。通过 MobileNet, 重参数技术、训练技巧等组合创新,实现了 ImageNet1k 75.9 的 TOP1 精度,几乎是目前轻量级模型的最优效果。
大致过程如下:
-
从 ml-mobileone [50] 下载训练好的 torch 模型(mobileOne-s0.pth)
-
转换成 onnx 格式,得到 mobileone-s0.onnx。在 36 server 开启 nvidia-docker,编写 torch2onnx 转换脚本
-
上传到 TI Edge AI studio>>workspace。花了很长时间才找到这个位置。原本是想从通过 wget url 等方式,但是发现 TI 并不允许 external download link。
-
仿照 notebook/custom-onnx. ipy 的基本流程,主要是替换 model path 和设置 compile options。但是出现了如下报错。
原因像是不支持某些算子加速。
检查了 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 模型的全过程。
但是,本篇的故事还未结束。请细细观察一下,mobileOne-s0 在 TDA4 上的推理速度。
为何如此慢呢?我在知乎上回答了对这个问题,感兴趣的朋友可以移步 你有没有发现同一个模型部署在不同终端上,推理性能差异非常大? [53]
简单版的回答: 由于不同终端的硬件加速配置不同,导致同一个模型在不同终端上的推理表现可能会产生较大的差异 。
(全篇完)
附 :汽车电子与软件正在筹划组织一期 TDA4开发者吐槽大会 ,搭建一个纯技术的讨论平台,有兴趣的小伙伴欢迎联系组织者。(活动仅面向TDA4的开发者开放,闭门线下讨论)。
参考资料
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]Official manual: 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]Vision AI processor design edge AI system: 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
[twenty one]ytorch/vision: https://github.com/pytorch/vision
[twenty two]edgeai-mmdetection: https://github.com/TexasInstruments/edgeai-mmdetection
[twenty three]edgeai-yolov5: https://github.com/TexasInstruments/edgeai-yolov5
[twenty four]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]Efficient edge AI system: https://www.ti.com.cn/document-viewer/cn/lit/html/ZHCY189A/GUID-A605292E-E4B2-4F65-8F64-F1C3D01D09C3#GUID-2C5CAF71-385A-45C1- 9769-DD95A77139C4
[30]Fixed-point DSP and floating-point 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]Symmetric quantization and asymmetric quantization: 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]Balance of quantization error: 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]Here: https://github.com/TexasInstruments/edgeai-tidl-tools/blob/rel_8_6/examples/osrt_python/README.md#user-options-for-tidl-acceleration
[41]Zhihu question-DSP hardware acceleration: https://www.zhihu.com/question/446008489
[42]The battle for deep learning chips: https://cloud.tencent.com/developer/article/1053927?areaSource=106001.7
[43]DSP for AI hardware acceleration: http://scis.scichina.com/cn/2019/N112018-00288.pdf
[44]Reflections of AI chip entrepreneurs: https://cx.comake.online/getNewsCon?key=1658800933654004
[45]Three design principles for AI chips: 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]Zhihu question-AI terminal deployment: https://www.zhihu.com/question/601448533/answer/3033718310