首页 > 其他分享 >昇腾黑科技揭秘,DVPP硬件加速训练数据预处理

昇腾黑科技揭秘,DVPP硬件加速训练数据预处理

时间:2023-11-09 11:38:09浏览次数:46  
标签:torchvision DVPP CPU transforms npu 硬件加速 预处理

本文分享自华为云社区《昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈》,作者:昇腾CANN。

在NPU/GPU上进行模型训练计算,为了充分使用计算资源,一般采用批量数据处理方式,因此一般情况下为提升整体吞吐率,batch值会设置的比较大,常见的batch数为256/512,这样一来,对数据预处理处理速度要求就会比较高。对于AI框架来说,常见的应对方式是采用多个CPU进程并发处理,比如PyTorch框架的torchvision就支持多进程并发,使用多个CPU进程来进行数据预处理,以满足与NPU/GPU的计算流水并行处理。


昇腾黑科技揭秘,DVPP硬件加速训练数据预处理_硬件加速

然而,随着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)


昇腾黑科技揭秘,DVPP硬件加速训练数据预处理_数据预处理_02

下面来看下替换之后的性能如何。以ImageNet中最常见的分辨率375*500的jpeg图片为例,CPU上执行预处理操作需要6.801ms:


昇腾黑科技揭秘,DVPP硬件加速训练数据预处理_硬件加速_03

使用DVPP不但能加速数据预处理,还能异步执行host下发任务和device任务,整个流程只需要2.25ms,单张图片处理节省了60%+的时间。

昇腾黑科技揭秘,DVPP硬件加速训练数据预处理_预处理_04

在ResNet50训练过程中,512batch数据处理只需要1.152 s,预处理多进程处理场景下性能优势更加明显。

昇腾黑科技揭秘,DVPP硬件加速训练数据预处理_预处理_05

基于Atlas 800T A2 训练服务器,ResNet50使用DVPP加速数据预处理,单P只需要6个预处理进程即可把NPU的算力跑满;而使用CPU预处理,则需要12个预处理进程才能达到相应的效果,大大减少了对host CPU的性能依赖。

典型网络场景,基于Atlas 800T A2 训练服务器,在CPU预处理成为性能瓶颈的情况下,使用DVPP预处理加速即可获得整网训练速度显著提升,其中ShuffleNetV2整网性能提升25%,MobileNetV1提升38%。

昇腾黑科技揭秘,DVPP硬件加速训练数据预处理_预处理_06

预处理使用独立的硬件加速器DVPP加速,可以有效降低对Host CPU的依赖,避免CPU性能受限导致NPU性能无法发挥。同时使用NPU上独立的DVPP硬件加速器进行预处理,可以与NN并行处理互不影响,数据在device内可以自闭环。DVPP预处理加速是在训练场景下的第一次使能,补齐了NPU训练预处理性能短板。

昇腾CANN内置的预处理算子是比较丰富的,后续在继续丰富torchvision预处理算子库的同时,也会进一步提升预处理算子的下发和执行流程,让流水处理的更好,减少数据处理的时间,持续提升昇腾CANN的产品竞争力,满足更广泛的业务场景诉求。

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

标签:torchvision,DVPP,CPU,transforms,npu,硬件加速,预处理
From: https://blog.51cto.com/u_15214399/8274482

相关文章

  • postman Pre-request Script(预处理)post请求获取sign(接口鉴权)
    背景请求业务接口时需要先调用auth应用的鉴权接口获取sign(类似其他系统登录接口返回的token),否则会提示:鉴权失败,从而导致业务接口无法使用。获取sign接口请求参数为业务接口的请求参数,所以Pre-requestScript(预处理)post请求内的body为变量。一、Pre-requestScript(预处理)......
  • #pragma message 预处理指令
    #pragmamessage是一个预处理指令,用于在编译过程中向程序员发出消息或警告。这个指令通常用于在编译时向开发者提供一些有用的信息。使用场景:编译时提示版本信息、时间信息、等等#pragmamessage("Yourmessagehere")//编译时就可以输出"Yourmessagehere" 示例代码:#......
  • 从数据预处理到模型部署
    近年来,人工智能技术的高速发展备受瞩目,而其中的一个关键领域就是机器学习模型的开发和部署。越来越多的企业和组织开始投入巨资进行模型开发和部署,以提升自身业务的智能化水平。为了帮助大家更好地理解和掌握模型开发与部署的相关知识,我们特地整理了本次直播的关键内容,带大家深入探......
  • 机器学习——数据预处理(读这一篇就够了!)
    为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始,而不是从那些准备好的张量格式数据开始。 下面我们将简要介绍使用pandas预处理原始数据,并将原始数据转换为张量格式的步骤。1.读取数据集举一个例子,我们首先创建一个人工数据集,并存储在CSV(逗号分隔值)文件 .......
  • 【科研02】【代码复现】【代码分享】TransUnet-RoadExtract 道路提取【数据预处理-ras
    目录1.数据处理dataprocess1.1.类型转换RastertoPng1.2.边缘填充Resize1.2.1.填充Resizeimage1.2.1.填充Resizelabel1.3.批量裁剪Clip1.4.波段缩减3bandsto1band1.5.筛选图像Choose1.6.转换格式Transformtonpz1.7.读取列表ReadFilesToList1.数......
  • C语言预处理和宏
    C语言预处理和宏预处理命令预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。这些在编译之前对源文件进行简单加工的过程,就称为预处理。预处理阶段的工作:把代码当......
  • C语言 - 预处理
    C预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把C预处理器(CPreprocessor)简写为CPP。所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符......
  • C语言 - 预处理器
    C预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把C预处理器(CPreprocessor)简写为CPP。所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符......
  • dotnet 8 WPF 支持在 RDP 远程桌面状态下启用渲染硬件加速
    本文将和大家介绍在dotnet8里WPF引入的新功能之一,在RDP远程桌面状态下启用渲染硬件加速在dotnet8之前,在用户进行RDP远程桌面时WPF应用将默认关闭硬件渲染加速以获得更好的兼容性。随着系统层的渲染架构的优化,比如在WDDM驱动模型里面,进行远程桌面的硬件加速已经是......
  • 《动手学深度学习 Pytorch版》 8.2 文本预处理
    importcollectionsimportrefromd2limporttorchasd2l解析文本的常见预处理步骤:将文本作为字符串加载到内存中。将字符串拆分为词元(如单词和字符)。建立一个词表,将拆分的词元映射到数字索引。将文本转换为数字索引序列,方便模型操作。8.2.1读取数据集本文......