西交智能基座报告讲稿
大家好,我是贺浩庭,很高兴能为大家做这次分享。今天我和邹润霖同学会为大家带来昇腾众智开发项目上的心得以及一些技术知识
首先由我为大家讲第一个部分
我介绍一下我自己,我专业是软件工程。获得过互联网+国赛银奖,特等学业奖学金,众智模型金质量奖等。在研究生期间,多次参与华为项目,从一开始的成员到后面的负责人,在项目中不断成长。
我和CANN结缘之路,可以从初始的智能基座课程算起,再到昇腾开发板推理应用开发,再到昇腾众智项目,到最后积累了一定经验,参与互联网+CANN产业赛道,获得国赛银奖的好成绩。
接下来我讲讲怎么去入门华为的AI应用开发项目,通过什么渠道或是方式去学习。首先是参与CANN训练营,每年CANN都会推出好几期新的训练营系列活动,参与课程并完成小作业可以有效提高我们对AI开发的动手能力。训练营内容是很丰富的,可以满足不同层级的开发者需求。
CANN训练营提供了丰富了视频课程,这些课程会讲解完成项目开发的一般步骤,十分通俗易懂,比如准备工作中需要数据集上传OBS以及安装pycharm插件modelarts等。课程老师还会实际在编辑器中去演示操作步骤,适合初次入门的同学。
CANN训练营还提供了课程作业供我们进行练习,实际体验整个项目的开发流程。它还提供了实际案例,比如基于Atlas 200DK的智能小车组装与实现,可以帮助我们快速入门。
其次可以通过官方文档或者Sample案例,让自己快速了解昇腾各个功能和特性的使用方式,解决遇到的具体问题。比如,通过性能优化的相关文档,大部分模型性能优化的问题都可以解决;通过Sample案例,实际动手完成自己的应用开发。
最后,如果自己还解决不了的,推荐求助昇腾社区,比如求助于仓库issue或者社区论坛FAQ。可以先尝试搜索issue看有没有相同问题(大概率你会遇到的问题之前也有人遇到过了),如果没有可以自己提交,但是需要注意如何去描述清楚问题,这样也有利于别人帮你去解决。我们要注意提出的Issue标题格式,并描述清楚是什么问题,是功能还是性能还是精度问题,设置训练任务的时候需要勾选Debugger选项,并且提供调试日志。
【自由讲解范例ISSUE】
因为有了之前在CANN上的知识和实践积累,我也有能力去参与到昇腾模型众智项目,这个众智项目主要是将开源模型迁移到昇腾平台,丰富昇腾Modelzoo社区。我们一共做过三期模型迁移项目,其中我参与的主要是前两期。
众智项目主要是如下几个关键步骤,首先是复现论文精度,其次是NPU的功能打通,以及NPU性能和精度调优。在这几个步骤中,大家遇到的问题可能主要在代码修改和性能调优上。接下来我会分享我在项目中遇到的问题,以及我是如何去解决它们的,我还会分享一些模型调优的经验,希望会对大家有所帮助。
我们一期项目的概况如表格所示,BSRN和SRDRM模型会相对困难一点。在我们完成项目的过程中,每周都会进行工作总结,及时反馈进度。我们的所有项目均在项目交付截至日期前顺利交付,并且一次性通过PR检查,并合入到开源仓库当中。最后我们提交了模型开发交付文档,模型代码,模型训练日志等交付材料。下面是我们的不同项目时期的交付件:
在GPU复现阶段,我们需要准备数据集,训练代码,编写训练脚本,训练打屏日志,训练模型权重ckpt以及复现README文件,NPU代码打通阶段需要迁移后的代码,requirements.txt依赖文件,编写NPU训练脚本以及readme文件。PB转OM阶段需要我们提供PB固化代码,推理应用开发阶段需要我们提供推理应用代码。
那么编写什么样的训练脚本,如何去编写它呢?我们需要在test目录下建立两个脚本,train_full_1p.sh进行完整的训练,得到的是训练的精度结果,而train_performance_1p只进行一个epoch的训练,目的是测试NPU的训练性能。
编写训练脚本时,为了对日志文件进行处理,我们需要掌握linux 常用的shell命令。这里我简单列了一些常用的。
【自由讲解shell命令】
在一期中, 我做的第一个迁移任务是tensorflow模型迁移。这个模型有两个大难点。第一个是训练周期极长,一次训练大概要一周时间,很耽误任务进度,对调试影响也很大,因为得到训练指标数据真的很慢。我记得当时训练的时候还要等待代金券的审批,这个也很麻烦。第二个难点,因为它是图像超分辨模型,所以该模型支持动态shape,也就是说它支持不同大小图片同时作为输入。这个应该是算子的问题,而且训练时也没有任何报错,只是训练卡住了,我记得之前我们在这个问题上卡了很久,不知道出了什么问题。提了issue之后,华为工程师在算子上面修复了这个bug,我们才真正解决这个问题。
我们的二期一共做了4个项目,分别将图像分类的Twins-PCPVT和ConvNext,实现语义分割的EfficientPS,以及姿态估计的centroids-reid网络迁移到了华为NPU上。如表格所示我们成功在交付日期前完成了所有的开发流程,且完成质量较高,右边是我们的开发成员以及分工情况。
在二期中,我参与的是TwinsPCPVT的模型迁移,在这个项目的代码修改中,我们遇到了torch版本问题,以及第三方库合并问题。amp在1.6之后才内置于pytorch,所以只能用原生apex库进行代替;timm库一些接口默认使用的是cuda,而不是npu接口。所以还需要修改第三方库的源代码,并把它们的源码加入仓库。
性能调优上,遇到了NPU上性能比GPU差的问题。我使用了如下几个调优方法:第一个是使用NPU版本的优化器FusedAdam代替原来的adam优化器。第二个是,如果你增大batchsize的话,一定要同比例地增加学习率,这里还需要注意多卡的因素。学习率对训练的影响比较大,是很重要的参数。第三个是使用NPU亲和函数代替原生函数。最后给大家讲一个小技巧,可以同时在pytorch和npu上同时使用profilling工具进行性能测试,它会可视化的显示耗时大的算子,一对比你就可以发现究竟是哪个算子导致了NPU上的性能下降。
第三期模型迁移项目与前几期所不同的是,我们需要额外增加一个迁移步骤:AI框架迁移,把pytorch或是tensorflow的模型转换为mindspore下的模型。右图是pytorch与mindspore同一类型算子的对照API。三期模型的难点在于需要重构模型代码,将模型框架替换为mindspore框架,这个代码量还是比较大的。另外如果模型使用了第三方timm库,我们也需要对其源代码进行分析解构,使用MindsporeAPI进行重建。还有一个更难以解决的问题为如果原模型对应的某个API,在MindSpore没有对应的支持接口,我们需要使用目前MindSpore已有的原子算子接口来编写该新算子。比如tensorflow有一个embeddinglookup_sparse函数实现稀疏矩阵的embeddinglookup操作,mindspore没有相同功能的函数,我们就得把这个算子拆解成不同功能用有的方法重新写一下这个算子
通过参与这些项目我也获得了很多奖项,比如昇腾众智开发者,昇腾众智金质量奖等。我还获得了2022年度昇腾社区优秀开发者的称号并在2023年昇腾开发者峰会发表主题演讲。我们还将CANN平台使用的经验和优势应用在了互联网+华为命题产业赛道当中,并取得了省赛金奖,国赛银奖的好成绩,接下来有请邹润霖同学介绍昇腾Atlas开发版的推理应用开发。
- Post title:西交智能基座报告讲稿
- Post author:sixwalter
- Create time:2023-08-05 11:14:26
- Post link:https://coelien.github.io/2023/08/05/jobs/华为报告2讲稿/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.