了解华为的生态已经两年有余,用CANN做过两个模型的转换,跑过推理测试,但是感觉还是对CANN框架一知半解,恰巧看到2022年度第三季度训练营开班,赶紧报名参与上车。
本次课程是进阶版第一节正式课,主要讲解的是DVPP模块,可以从(1)上【CANN训练营第三季】- AI目标属性编辑应用(上)_哔哩哔哩_bilibili(2)【CANN训练营第三季】- AI目标属性编辑应用(下)_哔哩哔哩_bilibili下观看学习。
从这里可以看到完整版本的课件CANN训练营第三季_AI目标属性编辑应用-昇腾社区 (hiascend.com)
以下是本次课程的学习笔记。学习笔记中图像为视频课程截图,如果想浏览课程大体内容可以继续观看,但是截图清晰度不好,如果有深入学习需求强烈大家建议看原始视频。本次课授课老师是小虎老师。老师从昇腾生态逐步深入到硬件以及软件栈,最后引入DVPP模块,逐步深入。
目录
一、生态介绍
二、数据预处理模块
三、基本概念及接口
四、DVPP接口
五、预处理案例分析
一、生态介绍
本次课程主讲数据预处理,主讲老师逐层深入,首先介绍了华为的全栈系列产品,如下图所示,华为提供不同计算能力的硬件平台,在此基础上提供统一异构计算平台释放硬件能力,可适配华为的MindSpore训练框架以及Pytorch、TensorFlow等其他第三方框架,继续往上走上层是应用使能,华为提供ModelArts一站式云平台,以及基于MindX的深度学习使能、智能边缘使能,优选模型库以及行业SDK,最上层是行业使能,赋能不同的行业应用满足行业需求。
华为提供各种不同算力的服务器,最底层依赖两款芯片,一款是昇腾910,一款是昇腾310,最新发布的还有昇腾310P
下表对华为的硬件做了一个简单的汇总,如有错误请各位指出。
昇腾310处理器是基于达芬奇架构的芯片,每颗芯片集成了2个AI Core负责计算密集型的矩阵运算。CPU子系统集成8个ARM A55,其中4个是AI CPU负责不适合跑在AI Core上的算子承担非矩阵类的复杂运算;4个事控制CPU(Control CPU)负责任务调度。还有一个专门的硬件加速的图像处理单元,也是本次课程的核心。
数据预处理的图像处理专用处理单元,如何调用底层资源呢,势必少不了软件的帮助。ACL提供了这个功能。ACL是昇腾平台上开发深度神经网络推理应用的基于C语言的API库,支持Python接口。其基本功能是运算资源的管理以及内存管理,关键的功能是数据预处理、DL推理以及算子加速计算。
前面介绍了这么多背景知识,接下来到了硬核知识讲解部分。
二、数据预处理模块
数据预处理一般是指视频图像的编解码、色域转换、图像分辨率转换、归一化等操作。
CANN提供了两种数据预处理的方式,其中AIPP是跑在AI Core上的(也有部分跑在AI CPU上),DVPP是跑在专门的硬件加速的预处理单元上。
下图演示了DVPP和AIPP在开发过程中位置,其中DVPP使用JPEGD模块对图像进行解码(注意输出分辨率有宽高对齐限制的,JPEG后面的D表示Decode解码),然后使用VPC模块进行缩放,最后调用AIPP进行色域转换以及对齐,此时的数据可以输入到网络进行模型推理。
AIPP分为静态AIPP和动态AIPP,静态AIPP中预处理参数都是固定的,写死在config配置文件内,动态AIPP配置文件只限制了输入最大图像的大小,在推理之前设置预处理参数。
DVPP中首先使用JPEGD、VDEC、PNGD等模块进行解码,然偶转换到VPC模块进行预处理,最后使用JPEGE(JPEG后面的E表示Encode编码)、VENC模块进行编码输出图像。这几个模块对图像分辨率都有要求,开发时尤其注意最大分辨率。
昇腾310芯片上DVPP不支持色域转换,因此色域转换需要使用AIPP进行。
注意JPEG与VPC模块宽高对齐要求不同,昇腾310P上JPEGD对齐要求是64*16,昇腾310上JPEGD的对齐要求是128*16。
三、基本概念及接口
在介绍基本概念之前,先介绍一下什么是Host和Device,后续文档和课程中会频繁的用到这两个概念。Host表示宿主机或者服务器,Device表示昇腾310芯片
使用ACL开发应用程序的时候,一般的操作都是先初始化,然后执行所需的代码,比如预处理以及推理,推理结束拿到数据之后释放ACL申请的内存Release,这里叫去初始化Finalize。这是一套固定的操作模式。
介绍一下Context以及Stream的概念,这个Context必须与用户线程绑定,一个用户线程对应一个Context,一个Context必须运行在唯一的Device上面,一个Device可以运行多个Context。每个Context里面有一系列的Stream,每个Stream具有严格的顺序,多个Stream可以并行执行。
这里必须注意,Context以及Stream推荐显示的创建,后续还可以使用进行异步操作,提升代码的可读性以及可维护性。也就是说创建Context以及Stream的时候必须显示调用CreateContext以及CreateStream接口。
ACL中的异步操作,有一个同步等待接口,SynchronizeStream接口,等待异步操作执行完毕之后继续执行。
数据类型操作接口,也就是说替代了结构体对象的直接赋值,采用接口的形式赋值以及取值,减少兼容性问题。
四、DVPP接口
这一节讲解的是DVPP模块的相关接口,包括DVPP接口、JPEGD以及VPC、PNGD等接口,小虎老师逐步讲解了接口协议并针对sample里面的演示代码进行了讲解。sample代码可以看这里:cplusplus/level2_simple_inference/0_data_process · Ascend/samples - 码云 - 开源中国 (gitee.com)
这一节最大的感受就是:流程化(严格遵守固定的流程开发)以及限制(图像宽高分辨率限制,以及不同硬件上的使用限制),使用的时候一定要详细阅读接口协议文档说明。简介-图像/视频数据处理-应用开发(C&C++)-推理应用开发-6.0.0.alpha003-CANN社区版-文档首页-昇腾社区 (hiascend.com)
gitee上samples中提供了丰富的数据预处理样例可以参考。
在看社区文档的时候,尤其要注意,V1和V2版本差异
五、预处理案例分析
本节开始以真实案例讲解DVPP的使用操作
最后小虎老师讲解了一个案例,StarGAN来说明整个流程,这个案例在samples里面没有,可以从Model Zoo中搜索并下载ModelZoo-昇腾社区 (hiascend.com),基本都是固定的常规操作,尤其要注意一点:数据排布格式,AIPP输出的数据排布格式是NHWC
- 模型转换是否开启AIPP功能,执行推理业务时,对输入图片数据的要求:
- 模型转换时开启AIPP:图像选择XRGB8888_U8或RGB888_U8,使用该种配置转换后的模型,在进行推理业务时,输入图片数据要求为NHWC排布。
- 模型转换时没有开启AIPP,模型转换完毕,在进行推理业务时,输入图片数据要求为NCHW排布,因此需要用户自行把NHWC排布的原始图片数据转换为NCHW排布。
在华为云上有针对Atlas200、300以及500应用的AIPP样例,使用时可以参考。
AIPP配置-华为云 (huaweicloud.com)
到此进阶版课程完结,本次课程主要是从DVPP为主线路,讲解华为的生态以及模型适配的全过程,强烈建议大家移步B栈观看视频学习。