昇腾 CANN DVPP 硬件加速训练数据预处理,友好解决 Host CPU 预处理瓶
本文分享自华为云社区《昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈》,作者: 昇腾 CANN 。
随着人工智能的快速发展,越来越多的应用场景需要使用机器学习和深度学习模型。AI 网络模型的训练一般分成两个关键部分,一个是训练数据预处理,一个是模型训练,如何提升两者的处理性能成为提升模型训练性能的关键。一般情况下,数据加载预处理由 host CPU 处理,而模型训练计算是在 NPU 或 GPU 上处理的,两者一般并行执行,因此训练一次迭代的时间通常是两个处理时间的最大值。
在 NPU/GPU 上进行模型训练计算,为了充分使用计算资源,一般采用批量数据处理方式,因此一般情况下为提升整体吞吐率,batch 值会设置的比较大,常见的 batch 数为 256/512,这样一来,对数据预处理处理速度要求就会比较高。对于 AI 框架来说,常见的应对方式是采用多个 CPU 进程并发处理,比如 PyTorch 框架的 torchvision 就支持多进程并发,使用多个 CPU 进程来进行数据预处理,以满足与 NPU/GPU 的计算流水并行处理。
然而,随着 NPU 算力和性能的倍速提升,host CPU 数据预处理过程逐渐成为性能瓶颈。模型端到端训练时间会因为数据预处理的瓶颈而拉长,这种情况下,如何解决性能瓶颈,提升端到端模型执行性能呢?
下面来看一个 torchvision 的预处理过程:
大家是不是对这些接口功能很熟悉?实际上,NPU 上的 DVPP 也能进行类似处理,诸如图片解码、图片缩放、翻转处理等。DVPP 是 NPU 上专门用于数据预处理的模块,跟 NN 计算是完全独立的。那么,如何让 DVPP 接管 torchvision 的预处理逻辑呢?很简单,两行代码轻松搞定:
是不是很方便?AI 算法工程师不需要修改 torchvision 的处理流程,不需要了解 DVPP 接口实现,也不需要去写 C/C++代码,而这些全都是 torchvision_npu 的功劳。torchvision_npu 中重新实现了 functional.py,在每个预处理接口中,判断如果是 npu 类型的数据,则走 npu 的处理逻辑:
functional_npu.py 内部调用 npu 的 resize 算子进行处理,接着通过 AscendCL 接口,调用 DVPP 硬件处理:
return torch.ops.torchvision.npu_resize(img, size=sizes, mode=mode)
下面来看下替换之后的性能如何。以 ImageNet 中最常见的分辨率 375*500 的 jpeg 图片为例,CPU 上执行预处理操作需要 6.801ms:
使用 DVPP 不但能加速数据预处理,还能异步执行 host 下发任务和 device 任务,整个流程只需要 2.25ms,单张图片处理节省了 60%+的时间。
在 ResNet50 训练过程中,512batch 数据处理只需要 1.152 s,预处理多进程处理场景下性能优势更加明显。
基于 Atlas 800T A2 训练服务器,ResNet50 使用 DVPP 加速数据预处理,单 P 只需要 6 个预处理进程即可把 NPU 的算力跑满;而使用 CPU 预处理,则需要 12 个预处理进程才能达到相应的效果,大大减少了对 host CPU 的性能依赖。
典型网络场景,基于 Atlas 800T A2 训练服务器,在 CPU 预处理成为性能瓶颈的情况下,使用 DVPP 预处理加速即可获得整网训练速度显著提升,其中 ShuffleNetV2 整网性能提升 25%,MobileNetV1 提升 38%。
预处理使用独立的硬件加速器 DVPP 加速,可以有效降低对 Host CPU 的依赖,避免 CPU 性能受限导致 NPU 性能无法发挥。同时使用 NPU 上独立的 DVPP 硬件加速器进行预处理,可以与 NN 并行处理互不影响,数据在 device 内可以自闭环。DVPP 预处理加速是在训练场景下的第一次使能,补齐了 NPU 训练预处理性能短板。
昇腾 CANN 内置的预处理算子是比较丰富的,后续在继续丰富 torchvision 预处理算子库的同时,也会进一步提升预处理算子的下发和执行流程,让流水处理的更好,减少数据处理的时间,持续提升昇腾 CANN 的产品竞争力,满足更广泛的业务场景诉求。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/257267f43526735d73d5e16a2】。文章转载请联系作者。
评论