本篇是关于自身在机器学习这块工作经验的思考总结

我希望构建一个机器学习云开发平台,目标在于解决以下问题:

  • 团队协作:项目管理,技术&业务的共享如何体现在实际解决问题的过程中;
  • 资源调度:数据处理、模型训练;
  • 模块共享:低代码甚至无代码;
  • 快速开发:快速试错、实践、测试、部署;
  • 需求->开发的闭环

背景

自17年毕业以来,我从事于游戏行业的风控领域,主要涉及的系统的是风控和画像这两块。尽管我从团队初始建立的时候就定义了各种服务模板以及脚手架,但在数据处理、模型构建、管理这块我并没有着重去管控,仅仅是设定了一些服务的标准(初始阶段需要的是快速响应需求),如今随着业务场景和团队成员的增加,有如下问题需要考虑:

  1. 脚本模块共享问题,团队成员长期开发积累的技术脚本、模型等是否可以模块化用于给其他成员共用;
  2. 不同数据及不同模型快速试验的的效率问题,我理想的解决方案是类似工作流那样自由组合脚本,从数据提取到模型构建再到模型管控以作业流的形式来完成(这也意味着只要公有模块覆盖面足够广,就可以进行组件拖拽式开发);
  3. 模型测试管理问题,每个模型有哪些版本?怎么快速测试?分别被哪些服务使用以及如何快速上线;
  4. 资源调度问题,公司的数据存于云商,本地开发涉及的资源问题如何解决。

一站式机器学习云研发平台

目标

上面提到的问题可能也和大数据计算领域有些交集,毕竟都涉及到了 ETL,这些问题实际上涵盖了一个数据模型从开发到上线完整的生命周期。对于上述的需求,其实我们可以分别拆开来看看会衍生出怎样的目标:

  • 第1、2两点在我看来可以归纳为一个问题,模块需要抽象,然后让开发者可以自由地从模块仓库选取自己需要的模块进行组合,最终形成一个从数据提取到模型构建再到模型管控的工作流;一个项目可以有多个工作流,工作流的最小元素是模块,工作流的运行参数可以自由定义,开发者可以通过调整参数来快速调优;模块(函数)即服务,组合完毕就意味着一个需求的实现;
  • 第3点的实现离不开两个基础服务,一是模型自动API服务化,二是模型管控服务;
  • 第4点可以从两个方向入手,引入资源管理系统,如k8s或者云商的资源管理服务。

最终目标呼之欲出了,总结下我的需求,我需要的是一个满足数据计算、训练、管理的一站式机器学习云研发平台;而这个平台具有管理一个模型生命周期且形成闭环的功能,核心功能如:

  • 数据的访问与计算是无限制的;
  • 模块即服务且可多用户互相共享;
  • 一个需求的解决方案是模块的自由组合,需求的最终产物是模型(也可以是数据);
  • 对于模型可配置、易管控,可自动API服务化且可快速测试上线。

对于一站式机器学习云研发平台,我们需要其具有怎样的功能已经描述的差不多,既然问题已经抛了出来,接下来就说说怎么解决。

一切事情都有很多种解决方案,随着云原生的普及,容器技术的引入,中台在国内企业的覆盖率越来越广,该有的技术和业务的基础设施都开始有了一定的积累,怎么利用这些基础设施来进一步提升开发效率是接下来的一个方向,我期望最终解决方案有如下两个特性:

  • 低代码(高层次人员无代码):基于现有的基础设施(脚手架、模型代码库、模板)可以根据通用模块结合个性化配置形成工作流就可以构建一个机器学习应用,工作流为核心的低代码、甚至无代码工作方式是我的期望,那么代码谁来写?这又是一个值得深入探讨的问题,目前暂不探讨,现在就假设有底层程序员在持续奋斗;

  • 云开发:因为涉及到资源的调度(数据计算、模型训练等),所以一个模型从数据输入到模型输出的开发流程都可以在云端完成(特别是数据处理和模型训练),浏览器在手,天下我有。

就目前垂直的机器学习数据科学领域,再结合最新的技术方向,我个人很看好这两块,我认为低代码、云开发是构建新一代云原生应用的新式武器!(如果一直往前走,容器技术暂且不谈,单单微服务架构是不适用于这种原生应用的构建了,目前有大佬在研究的云研发架构或许是个方向。)

流程

先说说低代码,这里的低代码表达的是我们实现一个模型需求的方式,也就是说我们用低代码的方式来快速实现需求。

前面提到的模块即服务,通过连接各个模块最终形成一个工作流就是一个友好的方式,这也是市面上大部分产品的实现方式;每个模块的展现形式应该是友好可定义的,然后根据输入参数的不同来展现不同的行为(比如通过DSL定义,再基于DSL构建交互式的界面进行快速低代码开发)。

前面我们强调了闭环,那么在满足低代码这种特性下,我们的开发流程是怎样的呢?

  • 需求分析
  • 方案确立(文档&会议讨论)
  • 组件选择(通过DSL定义)
  • 在机器学习云平台勾选组件、进行DSL配置,形成工作流(工作流的输出就是解决方案的核心)
  • 验证&验收&部署(业务介入)

其实和传统方式一样,低代码的核心点也要求从需求分析到部署可以形成一个独立的闭环,不过在中间开发、验收、部署的过程都尽量实现低代码。低代码带来的效率提升是肉眼可见的,而实现低代码的关键点在于技术与业务的抽象,这里的表现为模块[函数]即服务;通过组合各个函数,就可以很方便地形成一个端到端的工作流以作为对某个需求的解决方案。

再来说说云开发,在机器学习领域,计算资源是一个不可忽视的问题,特别是在大数据计算清洗以及模型训练这块,目前基本上绕不过几大云商。我的想法是数据在哪,我们的开发环境就可以在哪,结合k8s,我们可以轻松建立团队的云研发环境,比如:

这两个是市面上比较成熟的远程开发工具,在之前的一年开发过程中,我在团队中主要就是引用了这两个工具(一些数据计算需求在本地没法做,因为数据都在云商且是动态数据,只能用这种形式远程调试开发)。

搭建

目前开源社区都有不少机器学习相关的工具,我也对一些工具进行了调研,评估标准就是解决我上面背景部分提出的问题,但是最终比较和我心意的是:Orchest:A new kind of IDE for Data Science.

虽然Orchest并不能完全解决我的问题,但是这个工具的思想和交付和我的需求与思考都非常契合,它虽然没有实现我期望的从数据提取到模型训练上线这一套完整的闭环,但是在工作流的管控这块做了很好的实现,一定程度上实现了低代码开发,Orchest的主要优缺点如下:

  • 项目是最高等级的概念,项目下面是工作流,工作流由各个模块组成,交互很友好,每个工作流可被任务进行调度,快速试验(但是项目过多会增加项目管理难度,我提了命名空间的需求,作者团队表示会开发);
  • 每个模块可自定义环境(Python、R等)且在项目下面模块是用户共享的(自定义镜像还是比较麻烦,反馈后也表示在优化);
  • 目前模块共享仅限于项目这个层次,我希望这个共享是无视项目的(我提的Issue见#129
  • 编码支持Jupyter(我提了Code Server的支持#113);
  • 基于Docker做资源调度,但是这样在团队里面是玩不转的,需要支持类似K8s这种才可以。

尽管Orchest在功能上并没有完全做到上面我说的几个点,但是在低代码和云开发上深得我意,而且这个开源项目看得出来非常有活力,我很喜欢。因此我决定在这个上面做一些二次开发来完全满足我的需求:

  • 在模块共享、工作流、快速试验上,Orchest做得已经达到可以生产使用的程度了,而且上手容易,我可以尝试在这块做到跨项目的模块共享;
  • 工作流产出数据或者模型后,怎们快速将模型服务化自动转化成HTTP服务进行快速测试?这里需要解决的问题是每个模型其实依赖的环境是不一样的,在对模型进行自动接口化的过程中就需要动态的识别模型当前的环境(比如依赖的包),所幸基于Orchest可以依据项目名称来检索对应环境,从而自动生成镜像来进行自动接口化;所以最终我会实现一个将模型自动化API的服务作为插件嵌入到Orchest
  • 随着业务的增加,模型也会越来越多,每个模型有不同的版本,哪个版本被哪个服务使用?用的是哪个版本?确定版本又怎么快速上线?这一套流程需要被一个服务管控(结合自身的业务),所以这里需要的是一个模型管理服务,同样,我也会将这个作为插件嵌入到Orchest

上面对应的服务差不多两周时间做了个初版,在实现过程中也发现了一些OrchestBug,顺手修了下提了个PR,和作者交流了一下发现作者团队还是挺靠谱的,他邀请我们团队作为他们的Launching Customers,意思是我们反馈问题和场景需求,他们提供技术支持,算是初步达成协作。

目前使用来看的话基本上从需求理解、基于通用模块构建应用工作流、模型测试&评估、管理上线这一套已经形成了闭环,而且在公有模块充足的情况,是可以做到低代码甚至无代码,模型调优是实打实的无代码,而且所有的开发都是在浏览器(云)上进行的。

可以考虑设想一个构建机器学习应用的场景,基于当前的一站式机器学习云研发平台流程是这样的:

  • 构建应用工作流:

    • 选取通用数据提取模块(选择目标特征):这里的数据提取&清洗极耗费资源,一般这里我会将资源调度到云商或者分布式的资源管理集群上,平台上云基本上是跟着这里的数据走
  • 调用数据分析模块

    • 假设是回归任务,从公用模型库选择希望调试的模型(可以选多个)
  • 各个服务模块组合成一个工作流,工作流的结果就是需求的解决方案

  • 基于工作流定义不同的参数配置进行调优,比如选取十组不同的参数,基于一套工作流构建十个任务同时进行参数调优,快速产出模型

  • 验证&评估模型:一键模型API自动化,通过HTTP接口对模型进行测试;机器自动&人工多方多角度进行模型评估(自动化为主)

  • 模型一键热更上线:基于模型管理服务

orchest-模块即服务

上面的内容就是我个人对一站式机器学习云研发平台的思考,实际上在低代码这块如果针对的是某个垂直领域,比如本文说的机器学习这块,个人觉得实践可操作性还是挺大的,我已经按照自己想的做了一个出来并且开始在团队里面实践,可预见的是对团队项目的管理以及成员开发效率的提升,会有很大的作用。

这两周时间都放在了一站式机器学习云研发平台的折腾上,有些兴奋;后面我会在功能以及理念上做更深入的优化,然后在不断实践中持续思考,再反馈输出更新个人此类别文章;有同样想法的朋友,非常欢迎一起交流交流。

PS: Orchest是个不错的云研发工具,如果你工作的领域是机器学习以及大数据相关方向,可以尝试使用一下。

说明

对本文有影响的资料: