写点什么

昇腾 CANN DVPP 硬件加速训练数据预处理,友好解决 Host CPU 预处理瓶

  • 2023-11-09
    广东
  • 本文字数:2025 字

    阅读完需:约 7 分钟

昇腾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 的预处理过程:


 # Data loading code    traindir = os.path.join(args.data, 'train')normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])    train_dataset = datasets.ImageFolder(        traindir,        transforms.Compose([            transforms.RandomResizedCrop(224),            transforms.RandomHorizontalFlip(),            transforms.ToTensor(),            normalize,        ]))
复制代码


大家是不是对这些接口功能很熟悉?实际上,NPU 上的 DVPP 也能进行类似处理,诸如图片解码、图片缩放、翻转处理等。DVPP 是 NPU 上专门用于数据预处理的模块,跟 NN 计算是完全独立的。那么,如何让 DVPP 接管 torchvision 的预处理逻辑呢?很简单,两行代码轻松搞定:


import torchvision_npu  # 导入torchvision_npu包    # Data loading code    traindir = os.path.join(args.data, 'train')    normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])    torchvision_npu.set_image_backend('npu')  # 设置图像处理后端为npu    train_dataset = datasets.ImageFolder(        traindir,        transforms.Compose([            transforms.RandomResizedCrop(224),            transforms.RandomHorizontalFlip(),            transforms.ToTensor(),            normalize,        ]))
复制代码


是不是很方便?AI 算法工程师不需要修改 torchvision 的处理流程,不需要了解 DVPP 接口实现,也不需要去写 C/C++代码,而这些全都是 torchvision_npu 的功劳。torchvision_npu 中重新实现了 functional.py,在每个预处理接口中,判断如果是 npu 类型的数据,则走 npu 的处理逻辑:


if img.device.type == 'npu': _assert_image_npu(img) return F_npu.resize(img, size=size, interpolation=interpolation.value)
复制代码


functional_npu.py 内部调用 npu 的 resize 算子进行处理,接着通过 AscendCL 接口,调用 DVPP 硬件处理:

return torch.ops.torchvision.npu_resize(img, size=sizes, mode=mode)


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 的产品竞争力,满足更广泛的业务场景诉求。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 6
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
昇腾CANN  DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶_人工智能_华为云开发者联盟_InfoQ写作社区