经验分享|昇思MindSpore蒋磊:追风赶月莫停留,平芜尽处是春山
经验分享|昇思MindSpore蒋磊:追风赶月莫停留,平芜尽处是春山
本期分享来自蒋磊同学,开源之夏中的开发项目是【KubeEdge-Sedna集成昇思MindSpore】。

01、项目介绍
1.项目名称
KubeEdge-Sedna集成昇思MindSpore
2.项目开发者
蒋磊
3.项目导师
刘伟龙
4.项目要求
1. KubeEdge-Sedna集成昇思MindSpore
2. 实现基于昇思MindSpore框架的增量学习Demo
3. 提出KubeEdge-Sedna集成昇思MindSpore的Proposal
5.项目链接
项目详情:
https://summer-ospp.ac.cn/#/org/prodetail/2298a0083
Issue:
https://github.com/kubeedge/sedna/issues/307
Proposal Pull Request:https://github.com/kubeedge/sedna/pull/341
Implementation Pull Request:
https://github.com/kubeedge/sedna/pull/376
项目演示项目演示@KEAW’22 [B 站直播回放] [4]:https://www.bilibili.com/video/BV12W4y1p7sf
6.项目成果
由于下列成果,蒋磊同学荣获KubeEdge社区暑期成就奖2022 Most Promising奖项,并在350位结项同学中脱颖而出获得开源之夏2022总评选优秀学生荣誉。**项目成果:**Sedna集成昇思MindSpore项目顺利合入分布式协同AI框架KubeEdge-Sedna。**学习能力:**具有较强的学习能力,从一个没有Sedna、昇思MindSpore和KubeEdge经验的初学者,成功设计基于昇思MindSpore和Sedna增量学习的样例,满足在KubeEdge端到端运行要求。**响应和主动性:**能及时响应,并主动汇报进度,不懂之处也会先尝试提炼自己的理解和验证再积极询问导师。**开源贡献:**蒋磊同学在知乎专栏分享KubeEdge-Sedna搭建指南--从零开始边云协同应用 [5]。也将集成 TinyMS 作为未来计划并积极与导师沟通。
02、项目开发情况
KubeEdge-Sedna Lib集成昇思MindSpore框架方案
PR 链接:
https://github.com/kubeedge/sedna/pull/341

图一 Sedna lib 框架
上图是Sedna lib框架。当运行自己的Model时,需要构建一个Estimator类,这个类封装了Model的训练,推理,评估,保存等一系列函数。当Model调用Sedna提供的增量学习API时,Sedna lib会进行一系列初始化工作。lib会先进行增量学习Job的初始化,在 set_backend( )函数识别到具体框架类型时,再进行具体框架Backend的初始化。
因此如果要集成昇思MindSpore框架,我们需要:
1.实现与框架对应的Backend,具体作用是解析特定框架某些比较特殊的参数
2.在set_backend( )中完成对应框架的识别

基于 MindSpore 框架实现的增量学习 Demo
PR 链接:
https://github.com/kubeedge/sedna/pull/376

图二 Demo 所需组件
本Demo基于MobileNetV2实现了狗和牛角包分类的任务。MobileNetV2使用了深度可分离卷积,使得其参数大大减少,能够在CPU上完成相对快速的训练和推理过程,这使得我们可以快速跑完Demo中的训练流程。
(1)在构建Demo之初,我们需要在本地调通Model,保证其能够正常运行。在这个Model 之上需要构建一个estimator类,该类封装了Model的训练,推理,评估,保存等一系列函数,进而才能调用sedna lib 提供的一系列增量学习接口。本地模拟K8S环境进行 Debug 的一个技巧是借助IDE的Run/Debug Configuration来配置环境变量,以实现与在容器中具有相同的环境变量。

(2)以mindspore/mindspore-cpu:1.7.1为基础镜像,创建支持sedna和模型运行依赖的docker环境。接着部署dataset,initial model, deploy model, 以及Sedna定义的增量学习的custom resource。这时整个增量学习Demo的所需的pod就已经开始运行了,我们可以通过云端kubectl get pods -n sedna指令查看pod状态,或者在边端查看容器日志来得到更详细的信息。
这里我们以两个节点组成的集群为例,lenovo 代表的是云端节点,node01代表的是边端节点。在云端节点正常部署demo时我们会看到如下 pod:

增量学习的训练阶段需要有新的数据,同时在Sedna中触发增量学习的训练阶段需要满足其trigger的条件。Demo中定义了trigger要求数据集至少有50个样本才能开始训练。我们部署数据集的CRD时指定了其在宿主机上的url,通过增加该文件中的数据到满足trigger的条件即可触发训练阶段。此处增加node01上数据集的大小,我们查看本地 lc 日志可以发现训练trigger已经被触发。
开始训练阶段:

node01 训练容器日志:

对训练出来的模型和部署的模型进行准确率评估:

此处评估容器检测到,由于增量后的模型在准确率评估上和运行中的模型比较未达到部署要求,Sedna并不会进行模型更新,直到新一轮增量训练满足部署要求。
03、随访
1.参与开源之夏
**ospp:**请简单介绍一下自己,并说一下自己的开源经历吧。
**蒋磊:**在接触开源之夏之前,我主要是在github上去了解和使用各大社区以及一些学生组织的开源项目。我自己也会把课程项目或者平时写的小Demo放到github上去。在本次开源之夏活动中,我才真正学习到给一个开源项目做贡献的工作流是怎样的。
**ospp:**请问你是怎样了解到开源之夏的?
**蒋磊:**我在2021年就有关注到开源之夏活动,当时是朋友推荐的。
**ospp:**在开源之夏2022活动中,你荣获了优秀学生最具潜力奖,你有什么经验想要分享给大家吗?
**蒋磊:**希望大家在面临项目开发困难的时候多加思考,带着一定的思考结果跟老师和同学交流。这会很大程度上帮助到自己开发。
**ospp:**在校期间你有着丰富的项目经验,请问这对你此次参与的项目有什么帮助吗?
**蒋磊:**之前简历上的项目其实都比较普通,这次开源之夏项目算是目前我简历上含金量最高的项目,同时参与该项目也结识到了很多来自各个高校的研究生以及诸多工业界老师。
2.参与开源社区
**ospp:**在项目进行过程中有没有印象深刻的经历?社区和导师为你提供了怎样的帮助?
**蒋磊:**对于开发Demo这一块印象比较深刻。当时难点在于我对增量学习和昇思MindSopre框架不太熟悉,所以开发起来比较困难。在社区群里询问社区老师的时候他们总能给出很准确的解答,来帮助我构建Demo开发的框架。同时我的导师刘伟龙老师在Demo任务选择以及MindSpore API的问题上也给了我很多帮助。
3.收获与寄语
**ospp:**开源之夏旨在培养和发掘更多优秀的开发者,通过这次的活动你有什么意想不到的收获和成长吗?
**蒋磊:**最意想不到的收获在于了解到了云原生+AI 里的各种学习范式,其中重点关注了终身学习,打算后续深入了解一下。
**ospp:**对于即将到来的开源之夏 2023,你有什么想对学弟学妹们说的吗?
**蒋磊:**开源之夏提供了一个很好的参与开源社区项目开发的机会。希望大家能认真对待每一个项目,努力结项,丰富自己的简历。
04、小结
当时五月份在OSPP官网上浏览项目时,因为我是一个大二的学生,只有一些深度学习方面的基础知识,并没有特别熟悉的子方向。在经过充分调研后,我选择了KubeEdge社区的Sedna子项目。一方面是当时做过一个在边缘设备上运行口罩检测算法的小项目,对边缘计算有一点了解,另一方面在充分了解了云原生+AI 后发现这个方向有很多非常实际的业务和需求,能够极大地扩展边缘计算项目的能力。
整个开发过程其实coding时间不算长,几乎70%的时间都在学习和调试。最大的收获在于对基于K8S的KubeEdge提出的“云原生边缘计算”这个概念有了一个基础认知,社区Sedna子项目真的是一个相当强大的项目,同时也见识到了很多硕士生以及博士生的工作质量,认识到了KubeEdge社区相当多的大佬。
以上是本次开源之夏项目经验分享,读者也可以通过KEAW'22学术研讨会演示视频了解更多项目细节。后续会有更多案例集成到 KubeEdge-Sedna,敬请期待!
Reference
[1] KubeEdge:https://github.com/kubeedge/kubeedge
[2] KubeEdge-Sedna:https://github.com/kubeedge/sedna
[3] KubeEdge-Ianvs:https://github.com/kubeedge/ianvs
[4] KubeEdge-Sedna 集成 MindSpore [项目演示]. KEAW’22:
https://www.bilibili.com/video/BV12W4y1p7sf
[5] KubeEdge-Sedna 搭建指南-从零开始边云协同应用: