写点什么

十分钟带你了解 CANN 应用开发全流程

发布于: 1 小时前

​​​​​​​摘要:CANN 作为昇腾 AI 处理器的发动机,支持业界多种主流的 AI 框架,包括 MindSpore、TensorFlow、Pytorch、Caffe 等,并提供 1200 多个基础算子。


2021 年 7 月 8 日,第四届世界人工智能大会在上海召开。华为轮值董事长胡厚崑在开幕式发表演讲,其中提到:华为推出了异构计算架构 CANN(ComputeArchitecture for Neural Networks),CANN 作为昇腾 AI 处理器的发动机,支持业界多种主流的 AI 框架,包括 MindSpore、TensorFlow、Pytorch、Caffe 等,并提供 1200 多个基础算子。同时,CANN 具有开放易用的 ACL(Ascend ComputingLanguage)编程接口,并提供了网络模型的图级和算子级的编译优化、自动调优等功能。CANN 对上支持多种 AI 框架,对下服务 AI 处理器与编程,是提升昇腾 AI 处理器计算效率的关键平台。


如何理解 CANN,如何使用 CANN,特别是如何基于 CANN 开放易用的 ACL 编程接口实现神经网络的快速部署呢?


相信我们大部分开发者对于训练一个模型并不陌生,但对于将该模型部署到边缘侧,做成一个应用落地,去产生价值(或者叫帮你赚钱?),可能就不是特别清楚了。但,一旦谈到可以帮你去帮你赚钱,我相信你一定会感兴趣的,对吗?


什么?赚钱!说到这个事儿,我就知道你不困了哈!


我们发现在昇腾社区上已经提供了不少可在线体验的案例,这些案例不但可以在线体验效果,还可以进行在线实验,同时开放了源代码,可以通过开源社区提供的资源进行学习并给基于这些案例进行二次开发,真真正正的体验、学习、开发三步走啊!


那么我们选择一些有意思的案例带大家学习下基于 CANN 的昇腾 AI 应用开发过程,今天要给大家介绍的就是这个能够吸引到你的卡通图像生成应用,无论是漂亮的小姐姐还是可爱的小萌宠都能帮你秒级生成,如下图,选择预置图片或者是上传自己的私照,点击“立即生成”即可体验。



首先介绍下如何找到该应用:

进昇腾社区https://www.hiascend.com/



开发者->应用案例,Ok,你已经可以看到那个狗狗了,案例标题是“卡通图像生成”,点击进去你就看到了。



体验就不说了,左边选择需要处理的图片,也可以上传自己的图片,然后点击生成就可以了,图片会上传到华为云昇腾 AI 计算资源上,推理后再回传到前端展示,相隔千里却仍能提供秒级体验,这里要给个大赞!

那么接下来言归正传,带你了解基于 CANN 的应用开发流程。完整开发流程如下:



0) 工程准备

硬件:服务器及推理卡准备就绪, 安装操作系统,配置网络。

训练后的模型:Caffe、MindSpore、TensorFlow 模型;

1)模型转换

离线模型:Ascend310 算子列表, ATC 转换工具。

2) 算子开发及调试

自定义算子开发:TBE DSL,TBE TIK 等算子开发工具。

3) 业务开发及调试

ACL 接口:资源初始化,数据传输,数据预处理,模型推理,数据后处理等。

4)性能调优

性能优化:瓶颈分析,内存优化,模型优化等。


看起来还挺复杂的,对吧??但是我们呢,是来解决主要矛盾的(先完成应用开发),其他的优化过程(精度、性能等)留着以后慢慢消化,来日方长,不是么?


废话不多说了,假定模型我们已经有了,也符合我们的需求,模型呢也是昇腾 AI 处理器已经支持的模型(无需做算子开发),我们现在要做的就是理解模型,分析其前处理过程(给模型准备数据),后处理过程(结果展示),进行模型转换得到离线模型,然后就是代码开发了(其实就是调用 CANN ACL 的各种 API 完成模型加载、推理的过程而已),这里选用 python,CANN 的 pyACL 用起来。


总结一下,在本例中我们只需要搞定如下过程:

1. 理解模型 2. 模型转换 3. 基于 CANN ACL 接口进行代码开发

1. 理解模型


YangChen、Yong-Jin LIU 等人提出的算法 CartoonGAN:Generative Adversarial Networks for Photo Cartoonization 基于 GAN 网络,迭代训练生成器和判别器,由判别器提供的对抗性损失约束,最终将自然图片转换为具有卡通风格的图片,效果惊艳。


下图为卡通图像生成的整体框架:


以 GenerativeAdversarial Networks(GAN)为基础,其架构包括一个生成器(Generator)和一个判别器(Discriminator),通过迭代训练两个网络,由判别器提供的对抗性损失约束,最终使得网络能够将自然图片转换为具有卡通风格的图片结果,并且保持原图片的内容信息。



图 1 卡通图像生成整体架构


生成器结构

生成器采用自编码器,为全卷积结构,包括编码器如图 3,解码器如图 4。



图 3 编码器结构


图 4 解码器结构


编码器输入为真实图片,其架构由 7×7 的卷积核,步长为 1 的卷积层开始,随后紧跟两个步长为 2 的降采样块,进行特征提取,对风格图片生成有用的信息将在这个过程中被提取。然后紧接 4 个残差块(Residual Block),用来重建内容特征。


解码器架构由 5 个残差块开始,通过两个上采样块(步长为 2)来实现对不同风格特征的重建,最后在添加一层使用 7×7 卷积核、步长为 1 的卷积层,得到最终输出生成的卡通图片结果。


由于当前我们的目标是将训练好的模型做成一个 AI 应用,所以这里只需要了解生成器就够了,从上面的结构中可以看出,该模型的输入是图像,输出也是图像,那么预处理和后处理过程呢?


原始模型预处理和后处理

在 Github 能够找到其测试脚本:https://github.com/taki0112/CartoonGAN-Tensorflow/tree/890decc647fbfd90a5314290b2771c496562ada8

结合前面的理解,并通过对测试脚本的研读,能够理解其图像预处理和后处理的方法



昇腾 CANN 软件栈提供了两套专门用于数据预处理的工具,其中一套叫做 AIPP(AI Preprocessing) ;另一套叫做 DVPP(Digital Vision Preprocessing)。


DVPP 是 CANN 软件栈中的数字视觉预处理模块,昇腾 310 AI 处理器支持抠图缩放、jpeg 编解码、视频编解码、png 解码等功能。详细请参考昇腾社区文档:

https://support.huaweicloud.com/devg-cannApplicationDev330/atlasapi_07_0131.html


AIPP 用于在 AI Core 上完成图像预处理,包括色域转换(转换图像格式)、图像归一化(减均值/乘系数)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等,静态 AIPP 可以在 ATC 模型转换时通过设置参数完成,比较方便。详细请参考昇腾社区文档:https://support.huaweicloud.com/tg-cannApplicationDev330/atlasatc_16_0015.html


在这里,我们假设你已经了解了 DVPP 和 AIPP,那么基于对原始模型的理解,在图像预处理时 DVPP 和 AIPP 如下分工(分工的原则:DVPP+AIPP 的处理要等价于原始模型的预处理过程):


DVPP:

1.解码:JPEG 图片先解码为 YUV420SP,输出宽 128,高 16 对齐,例如:若输入原始图像大小为(500, 375) 经过解码后图像大小变为(512, 384)

2.图像缩放:使用 DVPP 的 VPC 接口将图像缩放为模型要求的大小(256,256),要求宽 16,高 2 对齐,将(512,384)图像中的有效数据(500,375)缩放到(256,256)


注:这里也可以考虑等比例缩放,但由于等比例缩放要涉及到用 AIPP 裁剪,后期再讲。


AIPP:

1.色域转换:YUV->RGB

2.图像标准化,AIPP 配置 mean_chn=[127.5,127.5,127.5]min_chn=[0.5,0.5,0.5] var_reci_chn=[0.007874,0.007874,0.007874]


2)后处理

根据原始模型图像后处理流程,将图像像素转换到[0,255],然后进行保存。该过程直接使用 scipy 库实现。

2. 模型转换


原始网络模型是 TensorFlow 框架模型,而昇腾 CANN 软件栈需要的模型是.om 离线模型,因此,需要通过 ATC 模型转换工具将.pb 文件转换为 Ascend 310 处理器支持的 Davinci 模型文件。


ATC 模型转换指令:

atc --output_type=FP32 --input_shape="train_real_A:1,256,256,3"--input_format=NHWC --output="./cartoonization"--soc_version=Ascend310 --insert_op_conf=./insert_op.cfg --framework=3--model="./cartoonization.pb" --precision_mode=allow_fp32_to_fp16


重要参数说明:

--model:原始模型文件路径与文件名。

--output:转换后的离线模型的路径以及文件名。

--precision_mode=allow_fp32_to_fp16:设置网络模型的精度模式,优先保持原图精度,如果网络模型中算子支持 float32,则保留原始精度 float32;如果网络模型中算子不支持 float32,则直接降低精度到 float16。

--insert_op_conf:插入算子的配置文件路径与文件名,例如 AIPP 预处理算子。


AIPP 配置文件,根据原始模型需处理进行 AIPP 文件配置,本模型的配置文件见下图:



更多参数介绍可阅读:https://support.huaweicloud.com/atctool-cann502alpha5infer/atlasatc_16_0037.html

3. 应用开发


应用采用了下图所示的模块化设计,通过各模块之间的协调配合完成一张图片的推理输出。



其中各个模块的主要功能点如下所示:


1.运行资源申请;

2.加载模型文件,申请模型输入输出内存;

3.数据获取,获取要进行推理的原始图像;

4.数据预处理,模型的输入图像进行预处理;

5.模型推理,将预处理后的数据输入到模型进行推理;

6.推理结果解析,将推理结果进行后处理。


源码就不在这里 show 了,昇腾社区提供了更好的学习路径,可以直接通过在线实验学习开发过程,直接点击右上侧的在线实验,即可免费体验。



体验完毕后,大家还可以移步开源仓库去获取源码,如果有任何问题,鼓励大家去提 issue 与开发人员直接交流。

https://gitee.com/ascend/samples/tree/master/python/contrib/cartoonGAN_picture

相关链接


模型论文参考链接如下:

https://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_CartoonGAN_Generative_Adversarial_CVPR_2018_paper.pdf

原始模型部署链接如下:

https://gitee.com/syz825211943/cartoonization

相关源码可以在开源仓库如下地址中获取:

https://gitee.com/ascend/samples/tree/master/python/contrib/cartoonGAN_picture


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

发布于: 1 小时前阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
十分钟带你了解CANN应用开发全流程