华人澳洲中文论坛

热图推荐

    吞吐晋升30倍:CV流水线走向全栈并行化

    [复制链接]

    2023-2-12 07:15:06 20 0

    引言
    斯坦福传授、Tcl 言语创造者 John Ousterhout 曾写过一本书《软件设计的哲学》,零碎探讨了软件设计的通用准则和办法论,整书的中心观念是:软件设计的中心在于升高繁杂性。
    实际上,这个观念也合用于波及底层硬件适配的软件设计。
    以视觉模型开发为例,以往视觉模型开发过程当中,人们个别会更为关注模型自身的优化来晋升速度与成果。而关于图象前处置(预处置)和后处置阶段,人们则很少关注。
    当模型计算即模型训练和推理主阶段的效力愈来愈高时,图象的先后处置阶段愈发成为图象处置工作的机能瓶颈。


    详细而言,在传统的图象处置流程中,先后处置部份通常都是用 CPU 进行操作的,这会致使全部流程中 50% 到 90% 以上的任务负荷都和先后处置相干,从而它们会成为全部算法流程的机能瓶颈。
    01
    主流CV库的局限性
    上述问题是目前市面上的主流 CV 库在运用场景上的次要局限性,也就是说,对底层硬件依赖的纷歧致性致使了繁杂性和机能瓶颈。正如 John Ousterhout 总结繁杂性缘故时所道:繁杂性源于依赖性。


    主流的图象处置库 OpenCV,其运用场景十分普遍,但在实际使用的时分也会见临一些问题。
    好比用 OpenCV 的 CPU 版本先做训练再做推理的时分,在推理阶段可能需求一共性能对比高的版本。
    由于在训练场景里,先后处置与模型推理能够在时间上进行掩盖,从而掩盖前处置的时间。但推理流水线中,模型只包孕前向推理,且通过 Tensor RT 减速后耗时急剧减小,这时候前处置的耗时占比会十分高,难以被模型推理所掩盖。
    要想增加推理场景的耗时,进步推理场景的机能,个别会用 OpenCV 的 GPU 版本进行减速。
    然而OpenCV 的 CPU 版本和 GPU 版本之间可能会泛起后果纷歧致的状况。典型的例子是 resize 算子,其在 CPU 版本和 GPU 版本上关于差值的计算形式是纷歧致的。
    OpenCV 在训练和推理的时分会使用不同版本的算子,在训练的时分个别用 CPU,由于其 CPU 算子掩盖度对比高,在推理的时分个别用 GPU,由于机能对比好。因此,这也会致使后果对齐的问题。也就是说,当用 CPU 做模型训练,并用 GPU 做模型推理的时分,会致使终究的输入后果无奈对齐。
    其次,部份 GPU 算子的机能会有所退步。在 OpenCV 中,部份 GPU 算子自身的耗时对比大,从而致使全部算子的机能回退,乃至差于 CPU 版本。
    第三,OpenCV 的 GPU 算子掩盖度是无限的,部份算子只要 CPU 版本。还有一些 GPU 算子在参数、数据类型等方面的掩盖度也没有 CPU 版本高,从而带来使用上的限度。
    最初,假如在使用中将 CPU 算子和 GPU 算子交互使用,就会带来少量的 CPU 和 GPU 之间的数据拷贝和同步操作,进而致使总体的减速机能不敷高。
    此外一个罕用的图象处置库是 TorchVision。
    TorchVision 在做模型推理的时分,有些算子不足 C++ 接口,从而在调用的时分不足灵敏性。假如要生成 C++ 版本,必需经过 TorchScript 生成。这会致使使用上的许多未便,由于在流程两头拔出曾经其它库的算子来交互使用会带来额定开消和任务量。TorchVision 还有一个缺陷是算子的掩盖度不高。
    以上就是目前的主流 CV 库的局限性。
    02
    一致 CV 流水线
    既然先后处置的机能瓶颈次要在于使用 CPU 计算,而模型计算阶段使用 GPU 的技术曾经愈来愈成熟。
    那末,一个很天然的解决计划是,用 GPU 对先后处置进行减速,对全部算法流水线将会有十分大的机能晋升。
    为此,NVIDIA英伟达携手字节跳动开源了图象预处置算子库 CV-CUDA。CV-CUDA 能高效地在 GPU 上运转,算子速度能达到 OpenCV 的百倍摆布。
    2023 年 1 月 15 日,9:30-十一:30,由 NVIDIA英伟达 主办的『CV-CUDA 初次地下课』,约请了来自 NVIDIA英伟达、字节跳动、新浪微博的 3 位技术专家(张毅、盛一耀、庞锋),就相干主题进行深度分享,本文汇总了三位专家的演讲精髓。
    张 毅 NVIDIA GPU计算专家团队工程师 盛一耀 字节跳动 机器学习零碎工程师 庞 锋 新浪微博 资深算法工程师


    采取 GPU 交换 CPU 有得多益处。首先,先后处置的算子迁徙到 GPU 上当前,能够进步算子的计算效力。
    其次,因为一切的流程都是在 GPU 上进行的,能够增加 CPU 和 GPU 之间的数据拷贝。
    最初,把 CPU 的负载迁徙到 GPU 上后,能够升高 CPU 的负载,将 CPU 用于处置其它需求很繁杂逻辑的工作。


    将全部流程迁徙到 GPU 上后,关于全部流水线能够带来近 30 倍的晋升,从而节俭计算开消,升高经营本钱。
    经过图中数据比较能够看到,在相反的办事器和参数配置下,关于 30fps 1080p 视频流,OpenCV 至多能够开 2-3 个并行流,PyTorch(CPU)至多能够开 1.5 个并行流,而 CV-CUDA 至多能够开 60 个并行流。能够看出总体机能晋升水平十分大,波及到的前处置算子有 resize、padding、normalize 等,后处置算子有 crop、resize、compose 等。
    03
    异步化
    为何 GPU 能够适配先后处置的减速需要?得益于模型计算与先后处置之间的异步化,并与 GPU 的并行计算才能相顺应。


    咱们以模型训练和模型推理的预处置异步化分别进行阐明。
    1. 模型训练的预处置异步化


    模型训练能够分为两部份,第一个是数据筹备,第二个是模型计算。
    目前主流的机器学习框架,好比 PyTorch、TensorFlow,它们在数据筹备和模型计算之间是异步的。以 PyTorch 为例,其会开启多个子过程进行数据的筹备。
    如图中所示,其包孕两个形态,即模型计算和数据筹备,二者存在时间前后瓜葛,好比当 D0 实现之后,就能进行 B0,以此类推。
    从机能角度看,咱们冀望数据筹备的速度可以跟得上模型计算的速度。但实际状况中,一些数据读取和数据预处置进程的耗时很长,致使相应的模型计算在进行前有一定的空窗期,从而致使 GPU 利用率降落。
    数据筹备能够分红数据读取和数据预处置,这两个阶段能够串行履行,也能够并行履行,好比在 PyTorch 的框架下是串行履行的。
    影响数据读取的机能要素有得多,好比数据存储介质、存储格局、并行度、履行过程数等。
    比拟之下,数据预处置的机能影响要素对比简略,就是并行度。并行度越高,数据预处置的机能越好。也就是说,让数据预处置与模型计算异步化,并进步数据预处置的并行度,能够进步数据预处置的机能。
    2. 模型推理的预处置异步化


    在模型推理阶段,其机能有两个目标,第一个是吞吐,第二个是延时。一定水平上,这两个目标是彼此互斥的。
    关于单个 query 而言,当 server 接纳到数据之后,会进行数据的预处置,再进行模型推理。所以关于单个 query 而言,一定水平上它是一个串行的进程。
    但这样做在效力上是很低的,会挥霍得多计算资源。为了进步吞吐量,得多推理引擎会采取和训练阶段同样的战略,将数据筹备和模型计算异步化。在数据筹备阶段,会积攒一定量的 query,组分解一个 batch,再进行后续的计算,以进步总体的吞吐量。
    从吞吐而言,模型推理和模型训练是对比相似的。把数据预处置阶段从 CPU 搬到 GPU 上,能够失掉吞吐上的收益。
    同时,从延时的角度上看,关于每条 query 语句,假如可以增加预处置进程所破费的时间,关于每条 query 而言,其延时也会失掉相应的缩短。
    模型推理还有一个特征是,其模型计算量对比小,由于只波及前向计算,不波及后向计算。这象征着模型推理对数据预处置的需要更高。
    3. 中心问题:CPU 资源竞争
    假定有足够的 CPU 资源用于计算,实践上预处置不会成为机能瓶颈。由于一旦发现机能跟不上,只需求减少过程做预处置操作便可。
    因此,只要当 CPU 泛起资源竞争的时分,数据预处置才可能成为机能瓶颈。
    在实际业务中,CPU 资源竞争的状况是很常见的,这会致使后续训练和推理阶段中 GPU 利用率升高,进而训练速度升高。
    跟着 GPU 算力不停减少,能够预见,对数据筹备阶段的速度要求会愈来愈高。
    为此,将预处置部份搬上 GPU,来减缓 CPU 资源竞争问题,进步 GPU 利用率,就成为了很天然的选择。
    整体而言,这类设计升高了零碎的繁杂性,将模型流水线的主体与 GPU 间接适配,关于进步 GPU 和 CPU 的利用率都能带来很大的助益。同时,它也防止了不同版本之间的后果对齐问题,增加了依赖性,合乎 John Ousterhout 提出的软件设计准则。
    04
    CV-CUDA
    把预处置以及后处置进程搬上 GPU 需求知足多个前提。
    第一是其机能最少要好过 CPU。这次要基于 GPU 的高并发计算才能。
    第二是对预处置的减速,不克不及形成对其它流程好比模型推理的负面影响。关于第二个需要,CV-CUDA 的每个算子都留有 stream 和 CUDA 显存的接口,从而能够更公道地配置GPU的资源,使得在 GPU 上运转这些预处置算子的时分,不会过于影响到模型计算自身。
    第三,互联网企业中有十分多样的业务需要,波及的模型品种得多,相应的预处置逻辑也是品种单一,因此预处置算子需求开发成定制化的,从而有更大的灵敏性来完成繁杂的逻辑。


    整体而言,CV-CUDA 从硬件、软件、算法、言语等方面对模型流水线中的先后处置阶段进行了减速,以及全部流水线的一致。
    1. 硬件
    硬件方面,CV-CUDA 基于 GPU 的并行计算才能,可以大幅进步先后处置的速度和吞吐,增加模型计算的等候时间,进步 GPU 的利用率。
    CV-CUDA 反对 Batch 和 Variable Shape 模式。Batch模式反对批处置,能够充沛发扬 GPU 的并行特性,而 OpenCV 不论是 CPU 仍是 GPU 版本都只能对单张图片进行调用。
    Variable Shape 模式是指在一个batch傍边,每张图片的长和宽能够纷歧样。网络上的图片个别长宽都是纷歧致的,主流框架的做法是把长和宽分别 resize 到同一个大小,再对同一长宽的图片打包为一个 batch,再对 batch 进行处置。CV-CUDA 能够间接把不同长和宽的图象间接放在一个 batch 中进行处置,不只能晋升效力,使用上也很便利。
    Variable Shape 的此外一层含意是在对图象进行处置的时分,能够指定每张图片的某些参数,好比 rotate,对一个batch的图象能够指定每张图片的旋转角度。
    2. 软件
    软件方面,CV-CUDA 开发了少量的软件优化办法来做进一步的优化,包罗机能优化(好比访存优化)和资源利用优化(好比显存预调配),从而能够高效地运转在云真个训练和推理场景中。
    首先是显存预调配设置。OpenCV在 调用 GPU 版本的时分,部份算子会在外部履行 cudaMalloc,这会致使耗时少量减少。在 CV-CUDA 中,一切的显存预调配都是在初始化阶段履行,而在训练和推理阶段,不会进行任何显存调配操作,从而进步效力。
    其次,一切的算子都是异步操作的。CV-CUDA 对少量kernel进行了融会,从而增加 kernel 的数量,进而增加 kernel 的启动时间以及数据拷贝擦做,进步总体运转的效力。
    第三,CV-CUDA 还对访存进行了优化,好比合并访存、向量化读写等,进步带宽的利用率,还利用 shared memory 来进步访存读写效力。
    最初,CV-CUDA 在计算上也做了得多优化,好比 fast math、warp reduce/block reduce 等。
    3. 算法
    算法方面,CV-CUDA 的算子都是独立设计的、定制化的,从而能够反对十分繁杂的逻辑完成,而且便利进行使用和调试。
    如何了解独立设计?图象处置库的算子调用有两种方式,一种是总体性的 pipeline 方式,只能获得 pipeline 的后果,好比 DALI,另外一种是模块化的独立算子的方式,能够获得每一个个算子的独自后果,好比 OpenCV。CV-CUDA 采取了和 OpenCV 相反的调用方式,在使用和调试上会对比便利。
    4. 言语
    言语方面,CV-CUDA 反对丰硕的 API,能够无缝将先后处置连接训练和推理场景。
    这些API包罗罕用的 C、C++、Python 的接口等,这使得咱们能够同时反对训练和推理场景,它还反对 PyTorch、TensorRT 的接口,在将来,CV-CUDA 还将反对 Triton、TensorFlow、JAX 等接口。
    推理阶段,能够间接用 Python 或 C++ 的接口进行推理,只有包管推理的时分将先后处置、模型、GPU 放在一个 stream 上便可。
    05
    运用案例
    经过展现 CV-CUDA 在 NVIDIA 英伟达、字节跳动、新浪微博的运用案例,咱们能够领会到 CV-CUDA 带来的机能晋升有多明显。


    首先是 NVIDIA英伟达展现的图片分类案例。
    在图片分类的流水线中,首先是 JPEG decode,其对图片进行解码;绿色部份是前处置步骤,包孕 resize、convert data type、normalize 和 reformat;蓝色部份是使用 PyTorch 的前向推理进程,最初对分类的后果进行打分和排序。


    将 CV-CUDA 与 OpenCV 的 CPU 版本与 GPU 版本进行机能比较能够发现,OpenCV 的 GPU 版本比拟于 CPU 版本能失掉较大的机能晋升,而经过运用 CV-CUDA,又能将机能翻倍。好比 OpenCV 的 CPU 算子每毫秒处置的图片数是 22 张,GPU 算子每毫秒处置的图片数是 200 多张,CV-CUDA 则每毫秒能够处置 500 多张图片,其吞吐量是 OpenCV 的 CPU 版本的 20 多倍,是 GPU 版本的两倍,机能晋升很显著。
    其次是字节跳动展现的 OCR1、OCR2、视频多模态三个案例。


    在模型训练上,能够看到在 OCR1、OCR2、视频多模态三个工作上,使用了 CV-CUDA 后获取了 50% 到 100% 的机能收益。
    为何有这么大的机能收益?实际上这三个工作对比大的一个独特点是,它们的图片预处置逻辑十分繁杂,好比 decode、resize、crop 等,并且这些仍是大类,实际上每个算子类中还可能有得多小类或子类预处置。关于这三个工作而言,其波及到预处置链路上的数据加强品种可能就有十几种,所以其关于 CPU 的计算压力十分大,假如能把这部份计算搬到 GPU上,CPU 的资源竞争就会显著降落,总体吞吐也能进步得多。
    最初是新浪微博展现的视频处置案例。


    关于视频处置流程,传统的做法是把视频帧先在 CPU 环境中解码,把原始的字节流解码成图片数据,再做一些惯例操作,好比 resize、crop 等,再把数据上传到 GPU 上做详细的模型计算。


    而 CV-CUDA 的处置形式是将 CPU 解码之后放在内存中的字节流上传到 GPU 上,而且预处置也位于 GPU 上,从而跟模型计算进行无缝连接,不需求从显存和内存之间的拷贝操作。


    图中给出了采取 OpenCV(奇数)和 CV-CUDA(偶数)各自的处置时间,蓝色指的是模型的损耗时间,橙色指的是解码的损耗时间,绿色指的是预处置的损耗时间。
    OpenCV 能够分为 CPU 解码和 GPU 解码两种模式,CV-CUDA 只采取 GPU 解码模式。
    能够看到,关于 CPU 解码的 OpenCV,OpenCV 的解码和预处置都比 CV-CUDA 的耗时高很多。


    再看 OpenCV 采取 GPU 解码的状况,能够看到,OpenCV 和 CV-CUDA 在模型和解码部份的耗时是接近的,而预处置方面依然差距很大。


    在 pipeline 总体比较上,CV-CUDA 也有很显著的劣势,一方面 CV-CUDA 更节俭 CPU 资源,也就是将 GPU 利用率打满的状况下,CV-CUDA 只需求 OpenCV 的 10%CPU 配置;同时,CV-CUDA 也更节俭 GPU 资源,在总体 pipeline 上,CV-CUDA 效力晋升70%。
    06
    将来瞻望
    CV-CUDA 在模型训练和推理阶段都能无效地解决 CPU 资源竞争的问题,从而可以进步模型训练和推理的效力。
    但如何正确了解 CV-CUDA 的劣势?需求了解其发扬作用的基本条件,而且其劣势相对于于 CPU、OpenCV 并非绝对的。
    首先, CV-CUDA 实际上也不是万灵药。好比在模型训练阶段,假如瓶颈不是在预处置上,而是在数据读取、模型推理上。这时候候,假如用 CV-CUDA 来交换原来的预处置计划,实际上也是没有任何用途的。
    另外,在使用 CV-CUDA 的过程当中,假如对预处置逻辑公道调配 CPU 和 GPU 的任务量,实际上有时分可以达到更好的机能成果。
    好比,CPU 依然能够进行图片解码和 resize,resize 之后再放到 GPU 上进行处置。
    为何把解码和 resize 放到 CPU 上做?首先,关于图片解码而言,其实 GPU 的硬解码单元是无限的。其次,关于 resize 而言,通常状况下,resize 都会把一张较大的图片,转换成一张较小的图片。
    假如在 resize 以前,把数据拷贝到 GPU 上,可能会占用得多的显存数据搬运的带宽。
    固然,CPU 和 GPU 之间的任务量详细怎么调配,仍是需求结合实际状况来判别的。
    而最首要的准则是,不要将 CPU 和 GPU 之间的计算交替交叉进行,由于跨 device 传输数据都是有开消的。假如交替过于频繁,反而可能将计算自身带来的收益抹平,进而致使机能不增反降。
    2022 年 十二 月,CV-CUDA 公布了 alpha 版本,其中包孕 20 多个算子,好比罕用的 Flip、Rotate、Perspective、Resize 等。
    目前 OpenCV 的算子更多,无数千个算子,CV-CUDA 目前只比较较罕用的算子进行减速,后续会不停减少新的算子。
    往年 3 月 CV-CUDA 还会公布 beta 版本,会减少 20 多的算子,达到 50 多个算子。beta 版本将包孕一些十分用的算子,好比 ConvexHull、FindContours 等。


    07
    序幕
    回过头来看 CV-CUDA 的设计计划,能够发现,其面前并无太繁杂的原理,乃至能够说高深莫测。
    从繁杂性的角度,这能够说是 CV-CUDA 的优点。《软件设计的哲学》提过一个判别软件繁杂性的准则——假如一个软件零碎难以了解和修正,那就很繁杂;假如很容易了解和修正,那就很简略。
    能够将 CV-CUDA 的无效性了解为,模型计算阶段与 GPU 的适配性,带动了先后处置阶段与 GPU 的适配性。而这个趋向,其实才刚刚开始。
    |《数据智能常识地图》下载|
    上下滑动????,查看《数据智能常识地图》全景图,残缺版请关注大众号“大话数智”下载
    点击链接,查看详情引见并下载:Redirecting...


    |DataFun新媒体矩阵|


    |对于DataFun|
    专一于大数据、人工智能技术运用的分享与交流。发动于2017年,在北京、上海、深圳、杭州等城市举行超过100+线下和100+线上沙龙、论坛及峰会,已约请超过2000位专家和学者参预分享。其大众号 DataFunTalk 累计出产原创文章900+,百万+浏览,16万+精准粉丝。

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    中级会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题35

    帖子89

    积分307

    图文推荐