为什么我们需要机器学习平台?( 四 )


部署成一个服务 , 其实并不难 。 比如随便使用Flask或者其他Web框架包一层就可以用 。 但是得考虑到通用性 , 以及高可用、安全性、高性能 , 就不那么简单了 。 当然还有更高级的 , 比如模型的路由(A/B Test) , 模型组合等 。
如何提供通用的模型部署功能 , 因为训练出的不同的模型需要不同的环境、框架支持 , 而且使用方式上也不一致 。 有些框架自带了Serving功能 , 比如TensorFlow , 有些不带;这个还是差异较大的一块 。
当然这个领域也有对应的开源解决方案 , 现在开源的较有名气的 , 比如说Seldon(kubeflow使用)/MLFLow 。 它们的解决思路其实类似 , 都是封装了流程 , 留白对应接口 。 用户只需要按照对应流程 , 使用对应工具 , 填充对应的空缺即可 。 可以理解为模板方法 。 如果要自研 , 可以借鉴它们的思路以满足自己的需要 。 需要考量的因素上面也提到了 。
5.版本管理模型是我们的产出 , 而且很明显 , 这个模型并不是训练好了就会一直使用 , 永不改变 。 它是在不断迭代、不断优化的 , 当然使用不同的版本来进行A/B Test也是很常见的需求 。 在此时 , 针对模型(或者说是模型部署的服务)的版本管理就显得很重要了 。 这部分相对来说较为简单 。 不管是对模型本身、还是发布的服务都不是什么大问题 。
6.Ops相关这一部分其实贯穿了整个机器学习流程 。 比如:

  • 任务调度 - 选择合适的机器或者集群去调度任务 。
  • 训练过程监控 - 比如任务状态、Metric变化等 。
  • 资源监控 - 比如GPU、CPU、存储使用情况 。
  • 日志可视化 - 比如任务运行的日志、平台本身的日志、用户操作的日志等 。
  • 当然还有多租户 , 一些安全性的问题 , 比如模型发布的服务权限管理 , 用户操作的权限等 。
这部分都是偏技术的问题 , 不是特别难 , 但是坑比较多 。 基础版本做起来简单 , 但是做到高可用、易用性和健壮性就不会简单 , 毕竟这是贴近底层的一层 。
7.高级特性一些高级的功能 , 比如AutoML:
超参数训练 , 让平台能够使用不同算法自动获取超参数 , 比如使用常见的Random Search、Grid Search 和贝叶斯优化方法等进行调参 。
模型结构搜索 , 这个就更高级了 , 需要更深厚的专业领域知识和对应的工程化能力 。
当然 , 还有一些 , 比较高级的用于可视化或者降低机器学习门槛的功能 。 比如模型结构的可视化以及通过可视化的方式建模 。 这些已经有机器学习平台实现了 , 比如阿里的PAI 。 再比如能写SQL就能写AI的SQLFlow 。
为什么我们需要机器学习平台?文章插图
总结对于一个机器学习平台 。 困难的核心点有如下几个:
  1. 到目前为止 , 有许多东西是没有一个统一的标准的 , 比如数据标注结果的存储格式 。
  2. 有太多的框架 , 太多的环境 , 太多的版本 , 与之对应 , 不同框架最后生成的模型 。 也都是各不相同的 , 如果想要实现标准的模型压缩、发布 , 也是比较困难的一件事 。
  3. 在往下 , 机器学习太依赖于GPU , 对于GPU的管理、调度 。 目前来说也不是非常成熟的一件事(比如说GPU虚拟化) , 特别是不同的GPU也是不一样的;即便是同一厂商 , 比如Nvidia , 对于不同型号的显卡 , 同一模型也不一定能正常运行 。 尽管现在可以通过某些手段 , 比如说CUDA来屏蔽不同显卡的差异性 。 但难免有些模型直接操作的GPU指令集 , 比如Caffe 。
  4. 分布式训练 。 这块目前正在快速发展中 , 坑还是挺多 , 不是非常成熟 , 需要一一淌下 。
差异性 , 和没有标准是痛点的来源 。 但随着机器学习在工程领域的发展 , 标准只是早晚的事 。 不少开源框架已经开始做起来了 , 解决机器学习落地的各阶段问题 , 并试图建立自己的标准 。 如何解决差异性?我觉得答案是封装和抽象 , 封装底层差异 , 对外暴露统一抽象层接口 。 有句话说得好 , 在软件工程领域 , 没有什么是不能通过封装抽象加一层解决的问题 。 如果有 , 那再来一层!!
以上内容 , 为项目上的实践 , 以及个人理解总结而来 。 如有不对的地方 , 欢迎指正 , 万分感谢~~
【为什么我们需要机器学习平台?】文/ThoughtWorks彭青松