电子说
虽然推理加速器最初用于数据中心,但它们已经迅速发展到应用程序的边缘推理,如自动驾驶和医学成像。通过这种转变,客户发现,同样的加速器,在数据中心处理图像很顺利,但移到边缘推断方面却显得糟糕。其实原因很简单:一个处理数据池,而另一个处理的是数据流。
当你在batch = 1时进行批处理时,池子里待处理的batch就会很多。在数据中心,客户通常是数据的处理池,比如被标记的照片。其目标是用最少的资源和功耗以及最佳的延迟来处理尽可能多的照片。
另一方面,边缘推断应用程序需要处理数据流。我们通常的相机每秒拍摄30帧,每帧通常是200万像素。通常情况下,每幅图像需要33毫秒,每秒大约30帧。当你有一个图像从一个流进来,它如何被处理取决于它需要做什么。
例如,使用推理进行零售分析的商店可能会计算给定时间排队的人数。在这个例子中,他们真的不需要几个小时甚至几天的结果。然而,如果你驾驶一辆使用自动驾驶功能的汽车,你只有毫秒来处理图像,否则你可能会撞到人。虽然在这两个例子中,相机每3毫秒生成1帧图像,但使用的推理加速器非常不同。
让我们看看数据流发生了什么。
首先,您需要清理图像以去除诸如光线条纹之类的东西,然后应用推理。当推理完成后,您需要采取一个行动,根据你正在处理的活动,所有这些都需要在特定的时间内发生。如果你不需要几个小时的结果,你可以对图像进行批处理。在这种情况下,延迟就无关紧要了。重要的是用最少的成本和能量处理最多的图像。
最常犯的一个错误就是在选择边缘推断解决方案时没有考虑延迟和流媒体吞吐量。比方说,你有一台每秒能处理30帧的推理加速器,另一台每秒能处理15帧。
大多数人自然而然地认为每秒30帧的解决方案更好——其实你错了。
每秒30帧的加速器可能会获得比较可观的吞吐量,原因是它有三个引擎,每个引擎都有不同的延迟。最典型的是英伟达Xavier推理加速器。Xavier的深度学习引擎处理图像大约需要300毫秒,GPU大约需要90毫秒。如果客户有两个深度学习引擎+GPU都在运行,他们可能会在数据池中获得显著的吞吐量。
但是,如果它需要从数据流一次处理一个图像,它就不能有效地使用深度学习引擎,吞吐量会显著下降。在这种情况下,你需要观察哪个执行单元的延迟最短,即GPU的延迟为90毫秒。分割成1000毫秒就是每秒的帧数,这意味着这个吞吐量实际上只有每秒10帧(而不是宣传的每秒30帧)。
x Logix购买了一台Xavier AGX,并将其配置为NX模式(该软件测量芯片的功率,当功率超过15W时,会调低芯片的时钟,以防止芯片过热)。
然后,我们通过Nvidia Xavier NX软件流运行三个模型(YOLOv3加上我们客户的两个模型),并在芯片上运行,测量每张图像的延迟。我们还通过自己的InferX X1性能评估器运行了相同的模型。
显然,Nvidia不能为我们自己客户的机型发布基准测试,但YOLOv3的数据是在Xavier AGX上发布的,而不是在NX上发布的——而且他们发布的数据是使用GPU和两个DL加速器的综合吞吐量。对于Batch= 1,GPU有可接受的延迟。
不同的领域对应不同的处理器
关注自动驾驶和航空航天等应用程序的客户要处理数据流,所以可能只关心流吞吐量。即使它们是空闲的,它们也不能利用运行较慢的执行单元,因为它们需要在下一个图像可用之前处理第一个图像。在这些应用程序中,要跟上图像流是至关重要的,因为如果不这样做,就需要存储越来越多的数据。如果应用程序是自动驾驶,这将延长延迟时间,并可能导致严重后果。
总之,如果你正在研究推理加速器,请明白它们是为什么而优化的。
今年推出的大多数推断加速器都是为ResNet-50进行优化设计的,本人认为是一个糟糕基准测试,因为它使用了小图像,比如224×224。
对于像自动驾驶这样的应用程序,一般是需要处理200万像素的1440×1440级别的图像。对于这些应用程序,YOLOv3是一个更好的基准测试。
我们也开始看到与ResNet-50和YOLOv3有着截然不同的新模型。在生物医学工程或医学成像等市场,他们处理不同类型的传感器,而非行人目标的检测和识别,他们以一种非常不同的方式使用神经网络。在YOLOv3上运行良好的加速器可能在这些模型上运行得更好。
简单介绍一下YOLOv3,它是YOLO (You Only Look Once)系列目标检测算法中的第三版,相比之前的算法,尤其是针对小目标,精度有显著提升。下面我们就来看看在算法中究竟有哪些提升。
YOLOv3算法
首先如上图所示,在训练过程中对于每幅输入图像,YOLOv3会预测三个不同大小的3D tensor,对应着三个不同的scale。设计这三个scale的目的就是为了能够检测出不同大小的物体。在这里我们以13x13的tensor为例做一个简单讲解。对于这个scale,原始输入图像会被分成分割成13x13的grid cell,每个grid cell对应着3D tensor中的1x1x255这样一个长条形voxel。255这个数字来源于(3x(4+1+80)),其中的数字代表bounding box的坐标,物体识别度(objectness score),以及相对应的每个class的confidence,具体释义见上图。
其次,如果训练集中某一个ground truth对应的bounding box中心恰好落在了输入图像的某一个grid cell中(如图中的红色grid cell),那么这个grid cell就负责预测此物体的bounding box,于是这个grid cell所对应的objectness score就被赋予1,其余的grid cell则为0。此外,每个grid cell还被赋予3个不同大小的prior box。在学习过程中,这个grid cell会逐渐学会如何选择哪个大小的prior box,以及对这个prior box进行微调(即offset/coordinate)。但是grid cell是如何知道该选取哪个prior box呢?在这里作者定义了一个规则,即只选取与ground truth bounding box的IOU重合度最高的哪个prior box。
上面说了有三个预设的不同大小的prior box,但是这三个大小是怎么计算得来的呢?作者首先在训练前,提前将COCO数据集中的所有bbox使用K-means clustering分成9个类别,每3个类别对应一个scale,这样总共3个scale。这种关于box大小的先验信息极大地帮助网络准确的预测每个Box的offset/coordinate,因为从直观上,大小合适的box将会使网络更快速精准地学习。
责编AJX
全部0条评论
快来发表一下你的评论吧 !