深度学习平台设计指南

在人工智能浪潮汹涌袭来的时候,如果有一个好的深度学习平台,就像弄潮儿拥有了一块顶级冲浪板,只要技术好,没有乘不了的风和破不了的浪。


更新历史

  • 2017.06.05: 完成初稿

写在前面

为了更好理解深度学习平台的定位和作用,我先来讲两个小故事。

故事一

一位侠客来到大师面前,有气无力地问到:『大师,我已拿到了各种极品装备,本人的属性值也超高,为什么我还是没办法行走江湖呢?』

大师头也不抬说:『因为你都快饿死了,身体已经撑不住,这些属性和装备又有什么用呢?』

故事二

实验室最新打造了一台号称最智能的汽车,老板和研究组长在发布仪式后一起试乘。汽车开动之后体验了各种智能功能,老板觉得很满意,于是说:『来我们换个档飙一把』。

研究组长面露难色,语音操作车停下,然后下车打开前盖,开始把车里的芯片换成另一个档的芯片,之后再上车、启动。

老板说:『这不行,用户体验智能了,但是车的体验智障了』

阅读理解

第一个故事说的是深度学习平台的建设一定是要基于公司目前的状况和未来的发展,不然用的技术再先进,没有对业务产生价值,那就是拿公司的未来做慈善了。毕竟公司都倒了,有这么个平台又有什么用呢?

第二个故事说的是深度学习目前落地的一些痛点,因为暂时没有一个成熟的流程体系,从研发到真正应用到产品上,中间的环节繁琐易出错不说,也没有一个统一的管理、监控的最佳实践。虽然交付给用户和客户的产品是『智能』的,但创造智能的过程是『智障』的,所以平台的作用在于探索和规范,把软件工程的成功实践应用到以深度学习为代表的人工智能技术上。

现状分析

因为深度学习的工程化远不如传统软件成熟,大部分时候小公司的训练流程是这样的:

  • 研究人员在本地测试算法
  • 通过 SSH 和各类辅助工具把代码上传到服务器
  • 修改代码进行各类数据配置
  • 进行测试
  • 测试后人工收集结果

最开始只有一两台机器,一两张 GPU 卡的时候,这个方案是最简单粗暴,所需要的人工成本也较低。但随着单机多卡甚至多机多卡的全面铺开,随着在线流程和离线机器的不断增加,原来的方法难以为继,需要更有效率且更科学的方式来组织整个从研发到落地低流程,这也正是深度学习平台的价值所在。(感谢炳廷修改错别字)

平台定位

从前面的故事中我们可以把平台的具体定位细化一下,简单来说是:

  • 高效支持业务。提高业务的效率是第一位的
    • 包括业务的新增、调整、删除
    • 各个步骤都应该是可以配置的,最好有 Web UI 来可视化编辑(避免通过改脚本,因为很容易出错)
  • 高效支持研发。尽量少侵入研发原有的流程,或提供外部工具支持
    • 研发过程是非结构化、敏捷的,需要有机制把测试好的算法规范化
    • 结果验证和测试的自动化,版本化,便于跟踪对比算法效果
    • 尽量给研发人员最大的自由度的同时,保证系统的鲁棒性
    • 减少不必要的训练,根据业务的需求支持峰谷的利用
  • 连接已有系统。做信息中枢,用统一的架构提高资源利用率和信息的流转速度
    • 把原来单机的脚本改造成集群操作
    • 利用分布式存储打通各台机器的存储,统一输入与输出
    • 计算资源池化,考虑跨地区,跨云的解决方案

需求分解

不同用户角色对系统的需求也是不一样的,按照通常的分类方法,这里把系统需求以科研、后台、产品、运维四个角度来进行划分,具体如下:

科研

算法的研发人员最关心的只有一个事情:如何快速测试验证算法,查看算法效果。

在此基础上对其工作流程不能侵入太多,毕竟各有各的工作习惯,不能也没必要做太多要求,只要保证输入、运算和输出的接口一致即可(当然需要一定的修改,尽量简单或提供转换工具)。所以对于科研来说,难点在于如何在整合现有本地和服务器上的训练流程的同时,保持整个逻辑的简洁,并且让每个步骤都可配置。

后台

后台的开发人员最关心的只有一个问题:如何保证服务的高效稳定,如何缩短业务部署上线或做其他调整的时间。

这就意味着能自动化的流程要尽量自动化,因为深度学习平台主要关注于深度学习本身,所以只要和后台系统能够自动对接,并且整个过程可以监控,能够容错(比如自动重试)。这部分其实跟传统的软件工程联系比较紧密,只要有老司机把关,基本问题不大,对好接口即可。(打个小广告,我司来自腾讯的老司机后台团队非常靠谱,有想写 C++ 的同学请联系我)

对于小公司来说,很多时候运维的工作也会逐步转为 DevOps 模式,在我看来,运维的核心就是有一种方法能够清晰快速了解系统的运行状态,出了问题能够在自动修复的基础上进行一定的通知和告警,这些都是能够集成到系统中的。

产品

产品最关心的是功能和交互是否达到了用户期待以及如何去跟踪各个功能点的表现。

虽说看起来这个跟深度学习关系不大,但实际上产品经理对深度学习(至少是流程)需要有一定的了解,这样才能做到『量体裁衣』,用合适的形式展示最智能的功能给用户提供最完美的体验(无论是 2B 还是 2C 都是如此)。

那么深度学习平台需要提供的是有实效性且可参考的模型训练及测试数据,这样无论是产品经理还是项目经理心理都更有数,在和客户沟通的时候更有把握。说白了这是一个期待值管理的问题,心里有底,自然不一样。

写在最后

本文简单从设计的角度介绍了我对深度学习平台的一些想法(因为是公司的项目,所以只能讲一下思路,具体就不展开了)。感谢 glen 总、杨老师、文博和 jelly 的指导和检查,除了设计指南,之后还会写一下技术实现上的难点和重点,希望大家喜欢。


最后依然是一波招聘小广告

  • 能力要求:全栈 + Docker + K8S + Tensorflow + Spark
  • 任务目标:搭建深度学习平台,开发深度学习算法
  • 如果不甘心当个螺丝钉,为什么不来一起搞点事情呢?
  • 联系方式:老读者都知道的,这里就不赘述了
捧个钱场?