2022开源之夏 昇思MindSpore社区活动经验分享

举报
Super_WZB 发表于 2022/11/04 22:31:29 2022/11/04
【摘要】 我首先会对本次活动和参与的社区进行简单的介绍,接着详细介绍项目申报和撰写项目申请书的相关经验,再以我本次参与的CPU算子开发项目为例介绍项目开发经验,然后介绍一下我基于本次“开源之夏”活动所做的拓展与应用,最后对本次活动的个人收获进行总结。

一、前言

经过大概3个月的开发,2022年的开源之夏活动迎来了尾声,在这次活动中我选择申请了昇思MindSpore社区中的CPU算子开发项目,完成了ParallelConcat算子的开发工作。此次活动共计收到385所高校915名同学累计1319份申请,而最终中选人数仅有449人,从以上数据可以看出“开源之夏”活动在深受广大学生开发者喜爱的同时竞争也十分激烈,作为成功入选的开发者,我很荣幸能够获得本次参与活动的机会,也顺利完成了自己在申请项目时所作的规划,提前完成了项目验收而在整个活动过程中我同样遇到了一些困难也总结了一些参与活动与开发项目的经验,为了帮助各位在今后的活动中脱颖而出并且顺利完成开发,我将在本文中详细的介绍如何撰写项目申请书并做好开发规划,同时也将以自己的一些实例来倡导大家不仅局限于项目开发,更应积极响应“开源之夏”活动所推崇开源互助,推动社区发展的精神,为我国开源软件的发展与推广尽一份力。

接下来我首先会对本次活动和参与的社区进行简单的介绍,接着详细介绍项目申报和撰写项目申请书的相关经验,再以我本次参与的CPU算子开发项目为例介绍项目开发经验,然后介绍一下我基于本次“开源之夏”活动所做的拓展与应用,最后对本次活动的个人收获进行总结。


二、活动介绍

1. 开源之夏介绍

开源之夏(英文简称 OSPP)是开源软件供应链点亮计划的系列暑期活动,它由中国科学院软件研究所与openEuler社区共同举办,旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展,培养和发掘更多优秀的开发者。活动联合国内外各大开源社区,针对重要开源软件的开发与维护提供项目任务,并面向全球高校学生开放报名


2. 昇思MindSpore介绍

MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标,其中易开发表现为API友好、调试难度低,高效执行包括计算效率、数据预处理效率和分布式训练效率,全场景则指框架同时支持云、边缘以及端侧场景Mindspore欢迎每一个开发者都参与的社区里,为全场景AI框架MindSpore添砖加瓦!具体了解可以点击一下链接进行跳转:

Mindspore 官网 :可以全方位了解MindSpore,包括安装、教程、文档、社区、资源下载和资讯栏目等。

MindSpore 代码

MindSpore Giteefork仓库后即可随时跟踪MindSpore最新进展,参与issues讨论提交代码

MindSpore Github GiteeMindSpore代码镜像,习惯用github的开发者可以在这里进行MindSpore的学习

MindSpore 论坛在论坛中与其他开发者交流,共同学习,共同成长

针对本次开源之夏活动,昇思MindSpore社区共设置了21个项目(包含1Kube-Edge社区集成项目),难度包含基础与进阶,适合不同层次的同学参与。每个任务均有专业导师提供1v1专业指导,开发者可以登录项目页了解详细信息,也可以直接联系项目导师进行咨询。


3. CPU正向算子开发介绍

算子是MindSpore深度学习框架中的一个基本组件,例如常见的卷积操作、激活函数、全连接、批归一化等,示例可见官网MindSpore框架中的算子包括算子前端和算子后端,算子前端是指提供用户使用的低阶算子Python API,后端指对用户不可见的算子底层实现逻辑。MindSpore支持CPUGPUAscend三种硬件设备。其中,Ascend是指昇腾AI处理器,根据设备差异有多个不同的算子后端实现,运行在Ascend上的包括AI CPU算子和AI Core算子。

CPU算子开发的目的,就是要在MindSpore框架中通过调用算子API来使用运行在CPU硬件平台上的相应算子。

(1) CPU正向算子开发的整体流程如下:


(2) CPU正向算子开发涉及文件如下:

(3) CPU正向算子开发目标:

MindSpore CPU算子开发的基本目标是与友商竞品完成对齐,包括功能、规格、精度和性能等方面。如果前端用户资料不足以明确算子功能或其他相关信息,可参考PyTorchTensorFlow的算子实现,具体资料和源码链接如下:

PyTorch官方文档:https://pytorch.org/docs/stable/index.html

PyTorch中文文档:https://pytorch-cn.readthedocs.io/zh/latest

PyTorch官方源码:https://github.com/pytorch/pytorch

TensorFlow官方文档:https://tensorflow.google.cn/install

TensorFlow中文文档:https://tensorflow.google.cn/

TensorFlow官方源码:https://github.com/tensorflow


三、 项目申请经验总结

1. 项目选择

本次“开源之夏”活动一共有来自124个社区的共计502个项目,覆盖了人工智能、数据库、操作系统等众多计算机前沿研究领域,而各个项目所需的知识储备和技术也都各有差异,因此作为开发者,我们需要根据自己的研究方向与开发能力进行项目选择,毕竟有一个好的开始就成功了一半,而我建议大家从以下几个角度进行分析,最后综合考量以选择出最适合自己的项目。

(1) 研究方向

依据本次活动的公示数据,参与“开源之夏”活动的同学46.28%是有明确研究方向的硕士、博士研究生,而剩余53.72%的专科/本科在读学生一般也都是有着自己学习规划的同学要想在本次活动中申请到项目,第一件需要考虑的事情就是这个项目是否属于自己所研究的方向,其中涉及到几点原因:

做了要有用:参与活动最重要的还是要提升自己的能力并且能够对自己将来的研究工作有所帮助,因此选择和自己研究领域相关的项目会更有意义和价值,今后在求职时也会更有含金量和说服力。

②选了要能做:虽然目前只是在介绍如何申请,但是同样也要考虑到申请成功后自己的能力是否能够完成项目,如果最后中标了却无法完成,那一方面是浪费了主办方和其他同学的机会,另一方面也会损害个人信誉,因此最好选择自己擅长领域的项目,这样会对项目更加熟悉,开发也会更加顺利。

③投了要能中:最直白的一点,申请项目实际上是一个竞争的过程,需要与其他申请同一项目的同学进行PK,而导师在众多简历中进行筛选时肯定也是最看重开发者在项目相关领域的经验和成就,毕竟导师肯定是把项目能够顺利完成放在第一位的,因此相较于领域小白,导师会更倾向于具有一定基础的开发者,所以开发者在申请时选择自己有一定研究基础的项目会更加容易中标。

(2) 开发能力

在确定了自己想要申请的研究方向后,开发者需要对自己的开发能力进行一定的评估,以此筛选出自己力所能及或者即使当前能力不够但是通过学习能够在规定期限内完成的项目,而对于开发能力的分析也分为下几点:

①编码能力:作为开源项目,无论前期如何分析和设计,最终还是要用代码将自己的逻辑和思路实现出来,因此必须有充足的编码能力,而这其实也就是自己熟悉的开发语言和算法进行项目筛选,选出自己能够实现的项目。

②解题能力:在活动的开发过程中会遇到非常多的问题,而虽然每个项目都设置有导师,其也不可能一天24小时为我们解答问题,因此大部分的问题还是需要开发者自己进行解决,而这就要求我们具有独立自主的解题能力,一方面是对项目任务的解题分析,另一方面是遇到问题后自己debug和求解的能力。

(3) 社区熟悉度

本次活动一共有124个社区,大部分同学是无法对每个社区都很熟悉的,而对于这种开源社区的项目来说往往不是熟悉其使用的编码语言就能完成的,因为其中可能涉及到非常多社区中特有的软硬件知识以及编码逻辑,因此开发者需要从以下几个方面分析自己对于一个社区的熟悉度:

①清晰社区编码规约:不同社区所使用的编码语言和编码规范都不相同,只有熟悉社区编码规约才能够在开发时更加顺利,避免出现重复推倒重写的风险。

②掌握社区求助渠道:对于大部分开源社区而言,其发展程度可能还有所欠缺,因此在开发时遇到的很多问题可能很难通过百度或者询问其他开发者来得到解决,这时候就要求开发者能够掌握一种或多种求助渠道,比如社区内部开发工程师的帮助或者社区自有的沟通的论坛等。

③相关社区开发经验:在“开源之夏”活动申请项目时最好还是能够具有一定所申请社区的项目开发经验,这样一方面可以增强自己的竞争力,另一方面也是为自己的开发过程作保障。

(4) 导师实力

“开源之夏”活动中的每个项目都配备有一名导师,而在开发过程中开发者遇到问题后能够最先询问的人就是导师,因此一位实力雄厚导师也是确保项目能够顺利完成的关键,而大家也可以通过以下渠道对导师的资历进行一些分析与调研:

①个人主页:对于一些非常有名的导师和领域大牛,大家可以通过查询其个人主页或学校、学院中的教师介绍界面来了解其研究方向和成果。

私聊沟通对于一些学生导师,其往往不会有个人主页,但我们这时候也可以通过添加导师的联系方式来向他咨询一些与项目相关问题与指导,同时也可以在交流中了解一些导师以往的科研和项目经验。

4. 项目申请书

项目申请书是导师筛选开发者最直接的依据,同时在项目申报结束后组委会也会将申报结果和项目申请书进行公示,因此只有写好项目申请书才能增加自己申报的成功率同时在中标后也能够服众。下面我将我本次撰写的项目申请书为例向大家介绍一下项目申请书需要包含哪些内容,大家也可以参考我的大纲和结构进行撰写,而具体的内容大家可以下载文章附件中的项目申请书。

(1) 项目概述

项目申请书首先需要对自己所申请的项目进行一个简单的介绍,其包括“开源之夏”活动的介绍,所申请社区的介绍以及自己想申请项目的介绍,表明自己清楚所申请项目需要做什么,也清楚自己要干什么这一部分的作用是向导师和组委会展示自己对于所申请项目的理解和了解

(2) 项目分析

在说明自己清楚了项目的开发目标后,就需要对项目开发进行分析:

做什么:阐述项目功能需求;

明确开发内容需要写哪些文件列举清单(可参考下图)


②怎么做:项目开发所需的环境配置;

针对需求明确项目的输入和输出

实现算法(绘制一张流程图来直观展现,可参考下图

③举例子:其他友商或现有社区内如何实现相似的项目需求可参考下图

(3) 项目开发计划

完成了项目初步分析后,为了向导师和组委会展示自己对于项目的了解以及具备足够的开发能力,我们可以对待开发文件进行逐一分析,阐述每一个文件的开发方法可参考下图,最好能够结合现有的例子或者伪代码来进行讲解,表明自己具有充分的分析准备和足够的能力完成此次项目。

(4) 项目时间规划

在阐明自己具有能力完成项目后还需要表明自己具有充足的时间进行开发,同时要具有明确的开发时间规划可参考下,表明自己的规划管理能力,增强导师与组委会对你信任度:

开发阶段

开发时间

开发内容

资料准备阶段

06.16-06.23

在之前研究的基础上,再次仔细查阅友商TensorFlow中ParallelConcat算子源码,确定算子实现逻辑,查阅MindSpore库中现有Concat算子所调用的所有函数,并逐一查阅使用方法。

算子开发阶段





06.24-06.30

①编写Python侧前端接口文件,着重完善算子文档注释,丰富算子功能描述以及特性介绍,并增添算子样例以及报错信息。

②将Python侧Infer函数迁移到C++侧,编写Infertype和InferShape函数,完成对于输入 "values" 中Tensor的dtype和shape的检验,并推导出输出 "y" 的dtype和shape。

07.01-07.07

编写C++侧CPU Kernel底层函数,参照Concat算子的CPU Kernel底层实现完成ParallelConcat算子的底层计算代码。

07.08-07.14

为ParallelConcat算子适配动态shape计算功能,需要参照Concat算子的对应实现方式,增加对于dynamic状态的判断代码。

07.15-07.21

查阅TensorFlow友商源码中关于ParallelConcat反向实现的代码,学习其实现逻辑并在MindSpore端利用现有算子进行拼接或调用反向单算子实现算子反向计算。

07.22-07.28

完整编译代码,由于C++代码无法调试,故需要在代码中添加输出信息来做人工调试,具体为在关键的变量或方法前后增加std::cout输出变量数值,逐行检查并调试代码。

代码测试阶段


07.29-08.04

编写ST测试代码,并将代码提交到PR进行门禁测试,根据门禁测试中的Check_ClangFormat、Check_Cppcheck、Check_Cpplint和Check_Pylint报错信息修改代码,使代码符合验收规范。

08.05-08.11

依照MindSpore CPU算子测试模板编写operations测试用例,测试算子正反向运算是否能够通过,通过后还需要将MindSpore计算结果与TensorFlow友商对标算子的计算结果进行对比,32位误差应小于10e-3,64位误差应小于10e-4

交付件阶段



08.12-08.18

完成算子接入设计文档、doctest和算子接口注释网页自验证,依据代码测试结果填写Pynative和Graph两种模式下的测试报告,撰写测试用例描述文件并附上测试结果截图。

08.19-09.25

提交交付件等待审核,依据审核意见修改代码和交付件,代码修正完成后更新交付件并重新跑门禁

09.26-09.01

门禁通过后等待测试用例审核结果,若出现问题则依据报错信息或修改意见修改代码并重复审核过程,若无误则进入下一阶段

转测验收阶段




09.02-09.08

等待转测人员测试结果,若出现问题,则依据转测人员反馈的报错Issue复现错误,之后重复调试代码,直至解决问题。完成后更新交付件并重跑门禁。

09.09-09.15

依据转测情况,若仍然存在错误则重复上一周的工作,若未出现问题则进入下一步。

09.16-09.22

依据转测情况,若仍然存在错误则重复上一周的工作,若未出现问题则进入下一步。

09.23-09.30

等待转测结果,若通过则重跑门禁,保证24小时内的门禁通过结果后合入代码。

结项审核阶段

10.01-10.31

配合组委会要求提交结项材料,等待结项审核结果,

结项项目公示

11月上旬

等待结项公示,提交审核材料。

(5) 项目自荐书

撰写完以上内容后,导师和组委会对于你的开发计划和安排已经有了充分了解,同时也对你实现项目的可能性有了一定的评判,而这些都是围绕项目展开的分析,他们对申请者的个人能力和研究经历还是一无所知,因此大家可以撰写一份项目自荐书,在文中简要介绍一下自己想要参与项目的动机以及自己以往的项目和竞赛经验,这一部分其实就和简历一样是展现自己(秀肌肉)的部分,大家要在这一部分尽可能的展示自己与本次项目相关的开发和科研经历,同时将能够充分表现自己个人能力的奖项和荣誉称号列举出来,加强导师和组委会对你的影响,以此提高中标的几率。

(6) 参考文献

最后和撰写论文一样,需要列举文中用到的参考文献(可参考下图),一方面可以证明项目申请书的原创性,一切都是有所依据可查可鉴,另一方面可以展现出对于项目分心所做的准备足够充分。

5. 项目导师

在确定了自己想要选择的项目并撰写好项目申请书后,我们就要积极的通过官网上给出的邮箱联系导师,将自己写好的项目申请书发给导师,一方面表明自己的选择意愿,另一方面也可以刷个脸熟。同时如果导师对你产生了兴趣或者有选择你的意愿就可以尝试与导师添加微信或qq进行更加频繁深入的交流,沟通项目的实现,这样可以极大的增加中选的可能性,因为在项目申报阶段结束后是由每个项目的导师先进行个人排序,之后组委会再进行资质审核,因此实际上大部分情况下项目的中选与否掌握在导师的排序上,因此一定要让导师清楚自己的开发能力,主动争取机会。

并且如果导师已经有了自己的意向人选,他也可能会向我们表明情况(如下图所示),这样的话我们就可以抓紧时候申请其他项目,省下一个申请项目名额。

6. 项目志愿排序

“开源之夏”活动最多申请三个项目,而在申请时我们是可以调整申请顺序的,这个和高考填报志愿差不多,如果我们的三个志愿有多个中选,则最终获得志愿排序最高的项目,同时同一个项目也会按照导师提交的排序进行筛选,取最高排序且未获得其他项目的开发者中选。因此可以看出大家最好是把自己最有把握的项目放在高位,同时一定一定一定要提前联系导师,无论是表现也好刷脸熟也好,导师的排序对于项目的中选而言非常重要。


四、 全流程开发经验总结

本章将结合本次CPU算子开发项目,简要阐述项目开发流程,大家可以进行参考,具体内容同样可以下载文章附件进行查看

1. 项目调研

(1) 功能分析

该算子的功能为沿着第一个维度上拼接包含N张量的列表(所有张量的第一维度必须为1)。ParallelConcat算子和Concat算子的功能非常类似,而ParallelConcatConcat之间的区别就在于,Concat要求在操作开始之前计算所有输入,但不要求在构图期间知道各个输入TensorshapeParallelConcat算子会在输入Tensor可用时将其片段先行复制到输出中,在某些情况下这样可以提供性能优势。

(2) 昇思MindSpore分析

1) 该算子的前端接口如下

昇思 Mindspore ParallelConcat 算子 接口 文档

2) 算子输入与输出

1667571497038.jpg

上图为ParallelConcat算子的输入与输出信息,从官方文档可知算子的输入和输出存在以下要求:

输入 "values" 为一个元组tuple或者列表list

输入 "values" 的长度必须大于等于1,不能为空。

"values" 中的元素均为Tensor类型并且必须具有相同的数据类型和shape

"values" 中的所有Tensor的第一个维度必须为1

输出 "y" 也是一个Tensor并且与输入 "values" 具有相同的数据类型。

输出 "y" 的第一个维度取决于输入"values" 的长度。

输出 "y" 的其他维度与输入 "values" 中任Tensor的其他维度相同。


3) 算子实现逻辑

在清楚了算子的功能和对于输入输出的限制后,可以简要概括算子的实现逻辑如下:

Python侧前端接口获取输入 "values"

C++侧接口的InferType函数中对输入 "values" 的类型和数据类型进行校验:如果输入 "values" 中不全为Tensor或存在数据类型不完全一致的情况则抛出异常;若无异常则推导出输出 "y" 具有和输入 "values" 一样的数据类型。

C++侧接口的InferShape函数中对于输入 "values" shape进行校验:首先获取输入 "values" 的长度N以及其中第一个元素(Tensor[0])的shape并判断其第一个维度是否为1再遍历输入 "values" 中剩余的所有Tensor12N-1)的shape,将其与Tensor[0]shape进行对比,如果存在任TensorshapeTensor[0]shape不相同的情况则抛出异常;如果无异常则将输入 "values" 的长度N作为输出 "y" shape的第一个维度的大小(N,),同时将Tensor0shape除去第一维后的剩余维度(,*)作为输出 "y" 的后续维度。最后判断当前算子是否处于动态shape推导阶段,如果是则需要获取获取输入 "values" 的最大shape和最小shape,并且同时返回推导出的输出 "y" shape (N*…)和最大最小shape;如果不是则直接返回输出 "y" shape(N*…)

C++侧的cpu_kernel底层函数中获取输出 "y" 的内存地址out_addr和输入 "values" 中每个Tensor的内存地址列表input_addr_list,之后遍历每一个输入"values"中的Tensor,并将其数值复制到out_addr中,最后返回输出 "y" 的内存地址。此时输出 "y" 为一个Tensor,其dtype为输入 "vlaues" 中任Tensordtype,其shape第一维度为 "values" 的长度,剩余维度与 "values" 中任Tensor的其他维度相同,数值为输入 "values" 中所有Tensor在第一维度拼接后的结果。

(3) 友商源码分析

1) 算子功能

沿第一维连接 N 张量的列表。接口文档如下:

2) 算子输入与输出

可以看出TensorFlow的输入和输出均与MindSpore一致,额外的输入Shape实际上也不是必须的参数。

3) 算子源码实现

由于算子源码包含多个文件,并且代码量较大,故此处只列举核心代码,其余代码可参考TensorFlow 官方代码仓库

① 算子前端Python接口定义文件:

② 算子C++侧输出推导文件

③ 算子底层实现文件

④ 算子反向实现文件

经查阅文档和源码,ParallelConcat算子无反向


2. 项目开发

(1) 明确开发任务

(2) 配置开发环境

昇思 MindSpore 官方 CPU 算子开发文档:

(3) 编写开发代码

算子python侧前端接口开发

① mindspore/ops/operations/array_ops.py文件

• 定义算子名:

• 编写初始化_init_方法:

② mindspore/ops/operations/_init_.py文件

• 导入算子接口。

3. 项目验收

(1) 本地自验

(2) 门禁测试

(3) 交付转测

四、 拓展与应用

实际上本次“开源之夏”活动旨在宣传开源精神,让更多人加入到开源社区中,因此不仅仅是开发项目,我在完成开发后还将自己在活动中学习到的技术和知识应用到了其他的开发和竞赛项目中并且进行了一些经验分享活动,这样一方面学以致用,拓展本次“开源之夏”活动的学习内容,另一方面也是真正的发扬开源精神,对昇思MindSpore社区更是对“开源之夏”活动进行宣传,吸引更多开发学生开发者加入社区进行开发,吸引更多企业入驻社区进行实践应用。

1. 相似项目开发

我与实验室的组员们一起申请了昇思MindSpore发布的众智项目,一共完成了48GPU算子,29Onnx模型推理的开发工作。并且由于具有“开源之夏”的算子开发经验,我被指定为GPU算子开发项目的组长,在3个月的时间内组织25名同学完成了开发工作,并且由于开发速度快收到了华为GPU算子项目FO的感谢信。

2. 竞赛实践推广

在开发本次昇思MindSpore CPU算子的过程中,我不仅对于算子的开发有了深入的了解,对于MindSpore深度学习框架我也进行了一定的研究,尝试使用MindSpore复现了一些经典网络并成功进行了训练和测试。在具备了这样的开发能力后,我组织团队参与了今年第八届中国国际“互联网+”大学生创新创业大赛产业命题赛道(华为命题)我们使用昇思MindSpore深度学习框架和昇腾Ascend开发者套件搭建了《基于MindSpore深度学习框架的农作物分子设计育种表型预测系统》

此项目最终获得了湖北省金奖和国赛入围奖,向各位参赛同学和评委展现了国产深度学习框架的易用性以及国产计算硬件的高效性,推广了昇思MindSpore社区。

3. 开发经验分享

在以上的项目开发和竞赛过程中,我将自己的经验进行了总结并且撰写了多篇开发技术文档发布在CSDN知乎和华为云论坛中,目前已经累计获得了超过3000次的阅读量:

同时依托于参与“开源之夏”活动进行的一系列宣传推广,我也受昇思MindSpore社区邀请进行了网络直播分享,进一步推广了本次活动以及昇思MindSpore社区:

五、 收货与成长

在本次“开源之夏”活动中我完成了ParallelConcat算子的开发工作,我在活动过程中除了开发能力得到了显著提升之外,个人对于问题的求解能力也得到了系统性的锻炼。并且不仅仅局限于项目开发,我还将此次活动真正想要宣扬的开源精神进行了推广,以项目开发、竞赛实践和经验分享的形式宣传了昇思MindSpore社区以及“开源之夏”活动

综合来说在此活动中我的收获良多,回望这个月的经历,我看到了自己步步的成长,从一个AI小白进化成了一名资深开发者,具有了领导团队的能力,在真正领悟开源精神真谛的同时也认识到推动国产软硬件发展的重要性,希望大家也能够参与到“开源之夏”活动中来,一起为我国开源社区发展做贡献。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。