作者:王磊
更多精彩分享,欢迎访问和关注:https://www.zhihu.com/people/wldandan
在上一篇【MindSpore易点通机器人-02】设计与技术选型,我们介绍了MindSpore易点通机器人整体的设计,本篇将会向大家介绍进入迭代0所需要的准备工作。在03-迭代0:机器学习项目开始前要做哪些准备工作?中,提到了迭代0中需要准备的内容:
- 选择计算资源
- 搭建开发环境
- 建立版本控制
- 搭建机器学习流水线
- 安装Jupyter Notebook(包含在开发环境搭建中)
从MindSpore易点通机器人这个项目出发,按照实际的需求依次完成以上准备内容。
选择计算资源
在机器学习的流程中,开发者需要在本地进行网络的开发调试,在CI上完成集成和部署,在训练流水线上完成持续训练和模型验证,在生产环境完成部署推理。因此,在这些不同的环境中,可能需要不同类型的计算资源。
- 开发环境:开发者需要在开发环境运行MindSpore GPU版本来完成模型的开发和功能调试,因此在计算资源上通常需要Nvidia的GPU支持。
- CI/CD:运行MindSpore易点通机器人的集成和部署任务,普通的x86 CPU资源即可,在云上可以考虑容器集群,如华为云的CCI/CCE。
- 持续训练流水线(CT):MLOps流水线需要完成模型的训练、验证等任务,本地运行完整训练流水线选择消费级GPU,云侧使用ModelArts提供的昇腾或者GPU集群,并且需要多卡完成分布式训练以加速训练过程。
- 生产环境:需要昇腾310完成推理,可以部署在ModelArts或者CCE上。
训练和部署的具体资源数量可以根据实际的测试验证来选择规格。
搭建开发环境
开发环境准备涉及Python环境准备、MindSpore开发相关依赖安装、IDE安装配置等工作。其中Python的环境可以基于Miniconda完成,可以很方便的完成Python版本切换。对于MindSpore框架的开发,当前也有一系列自动化的脚本,帮助开发者快速完成安装配置工作。其它的依赖及IDE安装配置,都可以在MindSpore易点通机器人代码仓的README
找到。
开发所需的具体的组件及作用如下:
- MindSpore GPU版本:用于本地训练和调试模型。
- MindInsight:用于本地的精度调优。
- XAI:模型可解释性评估。
- MindArmour:可靠性和安全性工具。
- Serving:云侧部署工具。
- Lite:端侧(IDE)部署工具。
- jupyter Notebook:用于前期的技术探索。
- MindSpore Dev Toolkit:基于PyCharm IDE,增加智能编码,搜索等功能。
建立版本控制
版本控制包括三个部分,一个代码的版本控制,这部分通过gitee来完成,另外的包括数据和模型的版本控制,我们选择对象存储服务来承载,保证数据和模型的一对一的一致性,同时,对象存储服务也可以管理数据和模型的元数据信息(如版本等)。MindSpore易点通机器人项目使用了华为云的对象存储服务(OBS)作为训练数据和模型的版本管理工具。OBS是一个基于对象的存储服务,适合训练数据这种大规模但碎片化的类型的数据存储,同时不用担心扩容和数据可靠性问题。
OBS的使用很简单,通过华为云的Console选择OBS服务后,直接创建标准的OBS桶即可。训练流水线使用的Argo工具,可以在配置文件中直接对接OBS读写训练数据和模型。在OBS桶的概览中可以看到相关的连接信息,结合华为云用户的AK/SK完成读写操作。
搭建机器学习流水线
MindSpore易点通机器人的MLOps流水线包含两个部分,CI/CD流水线以及持续训练流水线,其中本地我们基于WSL+Ubuntu+Minikube搭建K8S集群,在K8S集群上构建CI/CD流水线(Jenkins)以及持续训练流水线(参考MindSpore DX Sig的 MLOps-Tool项目)。
整个MLOps流水线运作的流程如下:
- 训练流水线
- OBS上上传原始数据,触发训练。
- 训练首先处理数据,将处理完的数据上传到OBS桶中。
- 而后开始模型的训练,使用刚处理完的数据作为输入,产出模型,同样归档OBS桶。
- 进行模型评估,并行完成精度、可解释性和可靠性评估。
- 给出总结,并触发CI/CD流水线。
- CI/CD流水线:逐次执行如下任务
- 代码检查。
- 单元测试。
- 接口测试(部署到云上NLP服务的Rest接口)。
- 从OBS下载本次训练的模型,打包成Docker镜像。
- 完成生产环境部署。
在代码仓库的Workflow目录给出了当前初步的训练例子的编排配置,使用argo summbit mnist-train-eval.yaml
提交例子训练任务,从Argo的UI中看到运行的结果。
持续训练流水线完成时,会触发持续集成和部署流水线,由代码仓的Jenkinsfile基于Pipeline as Code完成初始流水线的构建。
总结
迭代0主要看重端到端流程的打通,以保证后续功能的持续交付。迭代0的准备工作完成后,我们就可以开始下一步的训练数据准备工作了。