您现在的位置是:主页 > 人工智能 >


DSP芯片AI推理设备的设计

2020-02-27 22:22人工智能 人已围观

简介随着人工智能浪潮的到来,基于人脸识别(Face Recognition)的各类门禁闸机,基于自然语言处理(Natural Language Processing)的语音助手等 AI 设备已经不同程度地出现在人们的生活中。这一切的实...

  随着人工智能浪潮的到来,基于人脸识别(Face Recognition)的各类门禁闸机,基于自然语言处理(Natural Language Processing)的语音助手等 AI 设备已经不同程度地出现在人们的生活中。这一切的实现,得益于计算机科学的发展,以及各类处理器芯片计算性能的不断提升,使得原本只能在高性能服务器上运行的深度学习(Deep Learning)以及卷积神经网络(CNN)的算法逐步在嵌入式设备中得到应用与落地。本文描述了一种基于 DSP 芯片的高性价比高能效比的 AI 推理设备的设计与实现,同时配合MCU 的使用,完成了USB 接口数据通路的搭建, 以及基于 Linux 环境的 PC 端测试程序的开发。本文重点围绕该设备软硬件架构设计,芯片选型, USB 接口与 PC 端程序进行数据交互的协议实现等方面展开论述,同时从方案完整性的方面考虑, 也将简要介绍 CNN 框架以及使用 MobileNet-SSD 网络进行物体识别的基本概念以及网络模型在 DSP 上运行的方法。
  

  1 芯片选型

  
  从工程化和产品化的角度出发,在芯片选型上综合考虑了性价比和能效比的因素。用于神经网络(NN) 推理运算的 DSP 芯片选定为 Rockchip 的RK1608,USB 桥接芯片基于Rockchip 的某款ARM Cortex-M3 架构的 MCU 进行开发,本章节将介绍这两颗芯片的基本架构和主要特性,同时也将展开描述扮演数据中继角色的 USB 桥接芯片的选型过程。
  
  1.1 DSP芯片
  
  RK1608 是一款双核 DSP(CEVA XM4)架构的协处理芯片,内置了 256MB 的 DDR。 同时每个DSP 核内嵌 32KB ITCM 以及 256KB DTCM。
  
  DSP(数字信号处理器),是一种非常适合于数字信号处理的微处理器,它的矢量运算单元可以在一个指令周期内完成若干次的乘加运算。RK1608 内嵌有 256 个乘加器(MAC),最多可以在一个指令周期内完成 256 次的乘加运算。而在 AI 算法的卷积神经网络的运算中,卷积运算就是以乘加运算为主,因此,DSP 的这种架构就非常适合用于卷积运算的加速。这也是设计该设备选用 DSP 的重要原因。此外,相较于 ARM 这类通用计算 CPU,DSP 虽然通用计算的性能不强,但是却可以在更低的功耗下实现更高性能的数字信号处理类的运算。
  
  除了 DSP 核外,RK1608 上还提供了多路外围接口,主要有:3 路 MIPI CSI RX, 1 路 MIPI CSI TX, 1 路 MIPI CSI TX/RX, 1 路高达 50Mbps 的SPI 接口,此外还有 UART/I2C/GPIO 等接口。
  
  在基本的认知中,AI 运算必定带来大量的数据吞吐,所以高速的 MIPI 接口是比较适合作为数据输入 RK1608 的通路。但实际情况是,考虑到 DSP 的算力以及实际应用场景,AI 类算法的输出帧率一般只有十几帧,甚至小于 10fps,而且输入到 NN 算法的图像帧的大小,仅仅需要小于 VGA 的分辨率, 甚至只需要 300x300。同时综合考虑功耗和成本后, 会发现使用 SPI 接口即可满足要求。而选择放弃使用 MIPI 接口,还将降低对 USB 桥接芯片的要求, 扩大了选型范围。SPI 在理想情况下 50Mbps 带宽可承载的图像分辨率及帧率情况如下表所示:
  
  表 1 50Mbp 带宽可承载的图像分辨率及帧率
  表 1 50Mbp 带宽可承载的图像分辨率及帧率
  为了论述方便,在后续章节中,将使用 DSP或 DSP 芯片来指代 RK1608。
  
  1.2 USB桥接芯片
  
  USB 桥接芯片所承担的任务是通过 USB 口接收上位机的图像数据,并通过 SPI 接口传输给 DSP,同时从 DSP 接收算法结果,回传给上位机。
  
  表 2    USB 转 SPI 桥接芯片数据传输性能对比
  表 2    USB 转 SPI 桥接芯片数据传输性能对比
  通过上述表格的对比,可以发现,市面上现成的桥接芯片,SPI 的传输速率无法与 DSP 的 50Mbps速率匹配,甚至大部分芯片的 USB 速率也仅能达到 12Mbps。基于这种情况,将桥接芯片的选型方向转为利用同时带 USB 及 SPI 接口的MCU 进行自主开发桥接功能。在 MCU 选型的过程中, 同样碰到 USB 或 SPI 速率达不到要求的情况。考虑到同一家芯片公司出厂的芯片大概率会使用相同的 SPI 控制器,因此最终找到一款产自 Rockchip 的 MCU, 可以同时支持 USB Hi-Speed 以及 50Mbps SPI。
  

  2 硬件架构

  
  经过选型,确定 DSP 及 MCU 使用 SPI 接口连接,进行命令交互与数据传输。同时 MCU 作为USB Device 与上位机的 USB Host 连接,下行传输图像帧数据及控制指令,上行返回算法结果。
  图 1  硬件架构图
  图 1  硬件架构图
  

  3 软件架构

  
  从软件层面来看,整个设计分为 PC 端测试程序,MCU 嵌入式系统程序,DSP 嵌入式系统及算法程序三部分。三部分程序之间的交互流程如下图
  图 2 软件指令及数据交互流程图
  图 2 软件指令及数据交互流程图
  
  在最初的设计中,MCU 仅仅当作 USB 转 SPI 的桥接芯片,对上位机和 DSP 完全透明。但实际上, 由于 DSP 芯片的上电、下载固件以及消息交互的操作,需要额外的 GPIO 辅助,同时对 SPI 也有一些非标准的操作,因此,将驱动 DSP 的程序放置在MCU 端完成。上位机与 MCU 之间建立一套交互指令间接完成对 DSP 的控制。
  
  从图2 中可以看到,上位机与MCU 之间的USB 连接,使用了 RNDIS 协议。它是 Remote Network Driver Interface Specification 的缩写,即远程网络驱动接口规范。基于 USB 实现 RNDIS 实际上可以认为是 TCP/IP over USB,就是在 USB 设备上跑TCP/IP。上位机与 MCU 相当于同一个网段内的两个拥有不同 IP 地址的设备之间的通信。RNDIS 协议由微软提出,与 USB 标准中的 CDC(Communi- cations Devices Class)协议非常接近。在 Windows 和 Linux 上都有自带的 RNDIS 设备驱动,因此可以省去额外开发上位机 USB 驱动的工作。
  
  RNDIS 协议使用了 4 个 USB 端点(EP: End Point),1 个控制端点 EP0,1 个中断端点,1 个Bulk IN 端点, 1 个 BULK OUT 端点。通过配置USB 描述符(Descriptor),并通过控制端点和中断端点的指令交互后,USB Host 端就可以枚举出 USB RNDIS 设备,同时创建网络接口(如 Linux 上为usb0)。在此基础上再配合手动设置双方约定好的 IP 地址,就可以进行网络通信。
  
  socket 是基于c/s 的架构的一种网络通信方式, 区分客户端和服务器。考虑到从上位机发往 MCU 的下行数据量(即图像帧数据)比上行的数据量(算法结果)相对大很多,同时大部分情况下,是由上位机向 MCU/DSP 端发起操作请求,因此,将 MCU 定为服务器端。此外,所有的通信大体可以分为两种,一种是可靠的,面向连接的,一种是非可靠的, 非面向连接的。区别在于,收发两端是否有同步机制,来保证数据在丢失或发错的情况下,发端会重新发送。这两种连接,通常在基于 IP 的网络通信中分别对应 TCP 和 UDP 这两个网络传输层协议,前者可靠性高,后者实时性好。在这个设计中,我们会看到,上位机与 AI 设备之间收发的数据,既有固件,网络模型,指令等不允许出现差错的数据类型,也有图像帧这类对细小数据错误不敏感但对实时性要求高的数据类型。基于这样的考虑,在最终的设计中,上位机与 MCU 之间分别使用 socket 建立了 TCP 和 UDP 连接。在这个环节中,由于 MCU 上运行的是轻量化的实时操作系统,因此需要移植一个轻量化的 TCP/IP 协议栈,如 lwip。
  
  在建立了上位机与 MCU 的通信后,需要完成MCU 与 DSP 的命令交互与数据传输。这里利用了这款 DSP 芯片中一个称之为 SPI2APB 的特殊的功能,即通过 SPI 发送特定的命令,直访问包括 DDR 在内的 APB 总线地址。该功能固化在芯片上,不需要运行驱动程序。利用这一特性,就可以在 DSP 芯片的内置 DDR 上建立两个队列,一个用于 MCU 向 DSP 发送消息和指令,另一个则是相反方向的操作。对于图像帧数据,则不使用队列,而是在 DDR 上开辟两块 buffer,每个 buffer 设立分别设立一个读标志和一个写标志。MCU 只往其中一块读标志未置上 buffer 写入数据,同时置位写标志,表示这块 buffer 正在进行写入,不允许 DSP 上的算法程序读取数据,待图像帧写入当前 buffer 的操作完成后, 清空写标志。而 DSP 的算法程序只读取其中一块写标位未置上的 buffer,同时置位读标志,待当前buffer 中的图像帧读取结束后,清空读标志。这样交替地读写两块 buffer,即可保证图像帧的完整性。
  
  除了完整性外,还需要考虑图像帧传输的实时性。实时性通常受两种因素的影响,一种是写快于读,我们称之为 overrun;另一种是读快于写,即underrun。若出现 overrun,即当前 buffer(A buffer)写入完成后,另外一块 buffer(B buffer)的读操作还未完成,无法写入。此时为保证实时性,需要重新使用 A buffer,将新的图像帧写入 A buffer,覆盖旧的图像帧,如此反复操作,直到 B buffer 的读标志被清空。如果情况相反,碰到 underrun,有两种操作,一是反复使用当前有效的图像帧进行算法运算,输出算法结果,直到新的图像帧出现;二是停止算法运算,输出空的算法结果。这两种策略都是允许的,可以视上位机软件的需求进行选择。
  

  4 NN 算法与 MobileNet-SSD

  
  数据通路搭建完成后,图像帧数据最终将送入DSP 的 NN 算法中。运行基于 CEVA XM4 的 NN 算法,有两种方法。一种是使用 CEVA CDNN 框架, 另一种是使用 Rockchip RKNN 框架。两种框架的使用方法很相似,都是先利用 PC 端的模型转换工具, 将标准的 Caffe或 TensorFlow 生成的 NN 模型文件转换为自定义的模型及参数文件。这步操作很重要的一步是将浮点操作定点化,最大限度发挥 DSP 的运算能力。转换后的模型及参数文件会传入 DSP 进行解析,然后传给在 DSP 端运行的 CDNN 或RKNN 框架的运行库。当图像帧到来时,将触发中断,中断中生成任务,调用 NN 算法进行运算并输出结果。
  
  在此设计中,我们使用 MoblieNet 作为主干网络,同时运行 SSD(Single Shot Multi-Box Detection) 进行物体识别。MobileNet 是为移动和嵌入式设备提出的高效模型。MobileNet 基于流线型架构(streamlined) ,使用深度可分离卷积(depthwise separable convolutions,即Xception 变体结构)来构建轻量级深度神经网络。MobileNet-SSD 是基于MobileNet 主干网络运行的物体识别网络模型,可识别 21 类物体,包括人,大巴,小汽车,狗,猫等等。
  

  5 性能测试

  
  在整个系统跑通后,几个分立模块先进行了单独的测试。首先 MCU 与 DSP 之间的 SPI 通信,理论速率 50Mbps,实际运行速率 47Mbps。其次,上位机(Linux PC)与 MCU 的 USB 通信,受 MCU 中总线带宽,CPU 频率及任务调度效率,系统运行负荷等影响,理论速率 480Mbps,实际运行速率小于100Mbps, 系统负荷较重时甚至低于 30Mbps,与预期基本吻合,可以满足需求。再次,DSP 运行NN 算法,输出帧率大致为 12fps。最终,整合 MCU 及 PC 端测试程序,可以保证 DSP 能获得 12~15fps 的图像帧(300x300@RGB888)输入,算法 10-12fps 的输出。同时整机运行功耗维持在 1~1.2W。
  

  6 结束语

  
  针对当前 AI 算法和应用落地的大背景,本文提出了一种新的尝试,将 DSP 与 MCU 进行组合, 设计并实现了基于 USB 接口的 AI 推理设备,在算力方面虽然无法与当前先进的 NPU(神经网络处理器 Neural-network Process Units)相比,但足以满足目前常见的 AI 应用场景,且具备了低成本和低功耗的优势。更加重要的是,对于一些存量的老设备的智能化升级或扩展 AI 配件,比如带 USB 接口的网络摄像头,带 USB 接口的广告机等,这样一种USB AI 设备,将会是性价比非常高的选择。

Tags:

标签云