这次将会带来一些很硬的东西,如何从硬件底层到传输层到算法层提升模型性能、GPU、CPU、VPU、FPGA的异构系统、英特尔酷睿第六代Skylake架构、多设备协同工作的架构、传感器通道融合、CV、NLP、神经网络处理等
下面是课程的链接,我觉得他们讲的非常清晰,如果我写的地方有不清楚的部分可以看一下他们的那个课程:
http://edu.csdn.net/course/detail/32064?utm_source=coderacademy
在最右侧的是CPU,是通用计算设备,它的功能更加多元化可以处理各种问题。左侧是定制化的加速处理硬件,它在处理一些特定问题的时候有着很出色的表现。
通用计算设备需要匹配不同的模块来处理大量的任务,但是加速器只需要一个简单的结构去运行一个特定的任务。
CPU可以支持最广泛的程序应用,它用有最广泛的边界模型,支持多种编程语言,但是在画面的渲染方面来说,CPU的表现不如GPU,GPU的执行这些任务就会更快,GPU的编程更加复杂和独立,调试工具比较少。拿英伟达来说,一般无法通过多种编程语言进行调用,常CUDA对GPU进行操作。 VPU是面向特定领域的,高度定制化的加速器,这款硬件能够在更低的情况下执行更高效的任务。 FPGA是可编程门阵列,是混合解决方案。但是FPGA也是有它的局限的。
英特尔的硬件设备每个的专长的都不一样,有的适合去加速视频,有的适合去解码,所以最理想的状态是不同的硬件相互合作,共同去完成任务。
在总多的硬件中主要是以CPU为主控制器,将我们所需要执行的任务分发给加速器,然后加速器将运算的结果返回给CPU。
在以CPU做主控的前提下假设每个流程都用了不同的加速器,那就可以讲每个流程开发到极致。在一定的组合条件下可以使得系统拥有超越单个硬件数量级的倍数。
硬件加速的话我们主要考虑三个方面的问题:1、硬件的使用。2、不同模型、不同语言的APIS的转化。3、数据格式、内存布局也都是不一样的。所以openVINO主要解决的问题就是在如何很好地协调这三个问题使得系统处理速度最快。
我们前面已经提及过图像处理的五个过程,解码编码、图像处理、推理这五个过程,那我们根据这个五个过程的不同特性可以选用GPU、CPU、AI (主要产品有计算棒)分别处理这五个流程。
这句是我们要达到的三效果:
每个任务都在最高效的硬件运行
平衡各种系统资源
尽可能少地减少数据传输
对于不同的模型、不同的架构的解决方法是将他们转化成一个相同的中间语言-- IR,再将IR 在各种硬件中执行。
在CPU、GPU、FPGA、 AI中的IR库可以分别被他们MKL- DNN、cl-DNN、DLIA 、myraid识别然后执行
我们来看一下这个表,这个表中如果你看单个的硬件在三种模型的变现,你会发现其实每个硬件在不同模型的性能是不一样的,CPU在关键点检测中会有很良好的性能,但是GPU却不算太强。最后你看第四列,叠加后很明显每一部分都超越了单个的硬件性能。
这个是英特尔集成显卡,英特尔的CPU中会包含一些GPU的模块电路,CPU会将图形处理单元集成在同一块芯片上。所以一个CPU会包含多个芯片内核,比如说下面这个就是四核的,如果像下面这种样子的GPU和CPU集成在同一块芯片上,那么两者的通讯的会变得非常快。
当然大部分的GPU不是直接集成在一块CPU上的,常见的是一块英伟达显卡加一块英特尔的CPU,那么两者之间的内存带宽和GPU的可用内存都会影响数据通讯的效率。
假设我们现在需要处理一个模型,首先是用与之擅长的设备处理,第二个是设备的之间的信号传输不能成为影响性能的因素。看下面这个例子,CPU将压缩的视频流发送给GPU,然后取回解压好的压缩视频。将解压好的视频给VPU推理,然后将结果返回给CPU。
这个就是方案一。
那么现在我们来看下第二种方案,第二种我们先将压缩的视频发送给GPU,然后GPU把视频流发送给VPU直接处理,然后结果返回CPU。这样子做的话,就要求三个硬件是同步的。
OPENVINO就可以完成这个组合。
我们来看下面这个架构,这个是英特尔酷睿第六代Skylake的整体布局架构,这里是双核的,蓝色这块是最小的GPU,具有24个集成单元,占用了芯片一半的大小。
下面是GT4和四核的架构,可以看到,性能有了很大的提升。
下面来看下集成的GPU的内部,这里有24个执行单元,以及VBOX、VEBOX这些单元可以加速图像处理
这里提一下media- SDK,一个软件可以帮你在多语言多平台上编程GPU,加速视频解码编码等
而且你在CV、FFMPGE、Gsteamer等框架调用这两个API
比如说我们有个模型,这是采用典型的流水线来处理图形,每次处理按顺序去处理图片,依次处理四个图像如上图。然后有第二种解决方案,我一次处理四张图是不是可以生成更多的图像
从延迟来看,上面的延迟是10s一张,下面是11.3秒四张。但是吞吐率上来说,底部会更高。所以看实际中的需求。
1、神经网络
2、设备
3、执行参数
我们可以拿下面两个模型来举例。神经网络的卷积是选择300300比500500轻,链接层的选择、内存占用这些都是都是要考虑的。如果选择的模型太重了,无法将所有权重的加载到内存时就没用了。
选择的设备会对推理性能。比如说设备的数据格式时不一样的,那么就需要软件转化,数据格式会影响内存大小和所需的计算能力。我们需要确保用时需要内存够大,能够保持权重。
3、执行参数
这个需要自己去调,一般的AI工程师都只是在这一层下功夫,接下里详细介绍一下这六个
我们来看下两种执行模式:看看他们哪个快
1、先推理第一帧,然后准备推理第二帧,这个叫同步执行,这个需要等待执行一个再执行下一个。
2、先发送第一帧时别等推理完成,然后继续填入第二帧,然后推理完时就可以接上第二帧,这个叫异步执行
3、批处理和推理请求
我们可以将四个输入项打包起来时,可以一次处理batch ,这个时候batch=4。推理请求是指系统可以同时并行的程序数量。
4、视频流处理功能
在吞吐量模式下,线程将从以前一组进行分组成几组,数据的局部性更加出色。
我们来举个例子去理解这个线程。
我们可以选择要分配的线程数,或者将线程固定到特定核心,或者让CPU分配给资源。
这就想一个核心一个车道,如何每个核心可以处理两个线程,所以一个核心相当于双车道。
第二种情况是如果这个时候我线程很多,而核心(车道)还是两个的话就堵车。
上面已经提到过的数据线性与否、卷积层、链接层等等都是影响性能
数据格式通常会影响性能,因为内存大小和内存带宽小会有优势。你可以在一个FP32的空间中配置四个INT8.第二个是提升运算速度,一般是整数更快。
那我们可以来打包数据
我们可以把多个INT8打包在一起,执行单指令单数据的操作。
在一个FP32中可以打包四个INT8
然后越往后的打包的越多
为支持聚合需要有非常大和非常小的聚合,在压缩为更小的范围来进行推理。
数据格式转化的两种方式
用较低精度的权重重新训练模型
转化模型精度
将模型数据转化为整数的办法
POT–后训练优化工具
输入的是转化后的IR模型 和带有标注的数据集
读取器读取数据
转化注释
预处理对数据操作
调用推理引擎(VINO、caffe等)
计算量化指标
POT主要是在两种模式进行工作
第一种是默认量化模式,执行最快量化,速度快,但是更注重性能。但是不具备感知性能。
第二种是准确性感知模式
算法量化一些层,直到满足预设的准确率。
最终不是所有的数据都会被转化,而是原有的数据和转化的数据叠加的结果
图像特征提取
在上一章我们知道在图像处理中如果我们可以掌握好图片中的每一个像素,就可以确定图像的全部信息,但是在我们对图像进行旋转或者其他处理后就会转化成完全不同的图像。
我们通常会使用不随着所可能操作而变化的表达方式。我们通常使用神经网络的第一层负责这个任务,第一层拿到原始图像,第一层和第一批层通常是用过卷积从图像中提取特征,第一层看起来像边缘图像。第二层提取更高级别的特征,比如说圆形、直角等形状。所以第一批层的每一批层都会提取越来越来的特征。想要保持这些图形特征不变的方法是使用多种图像过滤器,并以较小的缩放和旋转来提取特征。完全链接层可以根据提取的特征层来确定这是否是一朵花。简单来说,这个流程就是视觉处理的描述。
音频特征也图像特征提取一样,通过多个卷积层提取特征音频不变特征。
音频我们学过通信原理、信号处理课程都知道,可以理解为音频是时域中的信号,进行信号采用和量化后(傅立叶变化后)也可以在频域得到相应的表示。
所以时域和频域可以结合在一起,利用的是短时傅立叶变换(FFT),如果我们多个时间运用这种方法把时域和频域结合在一起就可以得到如下的光谱图。
光谱图可以看作是很多彼此相邻排列的FFT,每个FFT都是在较小的时间范围内完成的,表示创建的和合成的音频信号。颜色表示每个频率的幅度和强度。颜色越亮颜色越高。横轴是时间,我们可以看到声音是如何随时间变化的
下面这个图形和上面那个图像表示的内容是一致的,但是纵坐标不同,一般都是对这个信号图进行处理。
我们将音频信息提取出光谱图,然后将光谱图送入到CNN 卷积神经网络中就可以对音频信号进行分类。
NLP的特点的是信号的长度是可变的,不同单词间的差异很大,并且还有停顿和静默时刻。所以需要确定一个时间窗口,在开始分类之前,语境、单词的顺序等都很重要。
比如说我们在哪里见面、去哪里,这种语境肯定是与地点相关联的,所以我们还需要历史记录,不仅是分类的单词,还有句子中所有的单词。
RNN神经网络是一个前馈神经网络,在底部输入顶部输出,向一个方向前进。
这种思想和NLP中对单词的处理也是一样的,在这里不是对整个神经网络的输出,而是下一步可以用来对下一个单词分类的输出。
现在我们有一段声音,然后让它变成文字。我们先将声音转化成为光谱图。
将神经网络用在多个窗口,对每个光谱进行推理,逐个推理出每个话的意思。
1、gvatrack
接着我们来介绍重要的概念,方便后面的通道融合的展开。
一般来说我们读视频流的处理很多基本思想是对每一帧进行检测,但是如果你是采用的跟踪的办法,每次不对物体进行检测而是根据前面已经检测出来的信息就可以以很低的代价进行检测。
我们把这个思想插入到模型中,比如说我们只是每十帧检测一次,中间的时间我们都是只跟踪对象,这样子就可以节省大量的算力。
更多的信息可以参考官方的技术文档
2、gvamataconvert
接下来我们把技术贯彻到一些工业项目中去理解不同设备交互工作,比如说智慧城市项目中有成百上千的摄像头,所有的摄像头都需要与城市指挥中心通信。所以必须建立起完备的处理、通信、管理系统。
我们可以以六个摄像头为一组,与路口的交互计算机和节点进行通信。
然后再路口的计算阶段与街区的节点进行通信
所有的街区再与云指挥中心进行通信
比如说我们通过一个摄像头检测到新面孔,然后把图片信息传到路口的交互口去提取面孔的特征将其传输给街区交互口,街口交互口将从所有的下级收取这个嫌疑人的信息,最后上传到指挥中心。
指挥中心就可以向下传达这个是嫌疑人的指令
这里的所有的交互口的信息都需要能够相互进行数据通讯。
这里的设备传输可以使用gvamateconvert 可以吧数据转化成比较容易处理的格式
3、gvamatapulish
然后把格式通过MQTT协议进行传输,为什么用它?因为它确实简单好用。每个客户端都可以发布和接受。
openVINO中有专用的MQTT包gvamatapublish
我们现在物联网发展得非常快。多传感器智能融合,每个传感器的数据都将会作为AI模型的一部分。比如说我们有音频和视频两个管道,然后我们要融合实现在两个管道交换数据。
所以需要解决的是两个问题
如何进行信息传输(上面那两个数据)
如何保证管道时间同步(比如说我检测到的是汽车喇叭是属于第六十帧的)
接下来我们来看一下openvino管道构建的方式
每个管道都有发送和接收数据的两个口
当然我们也可以设置多个输出的源和输入端
我们把解码放在同一个阶段执行,这个问题不大,因为信息获取大概率都是同时获取的
将解码的信息同时发送到两个管道之中
中间的模型就是算法对数据的处理
然后我们将音频检测的结果发送到一个临时文件中,将视频检测的结果都是放到GST。BUFFER缓冲区中,我们可以构建一个python脚本,将两处同步。
依此类推,我们甚至可以一定意义上模仿人类的所有的感知,对温度、味觉、色彩、声波等多个信息进行检测。