薛磊:Momenta资深研发工程师,前Sun中国工程研究院工程师,专注于分布式系统、存储系统、容器等技术,目前从事深度学习训练平台的基础架构研发。热爱开源和分享,目前是Kubeflow member及多个开源项目contributor。

前言

  目前人工智能非常火,大家所熟知的人脸识别、智能安防、自动驾驶等领域都在应用人工智能技术。但在自动驾驶这个行业中我们能用Go语言做什么事情?今天分享的主要是人工智能数据流的流转方式,也是Golang在Momenta大数据平台当中的应用。

Momenta大数据平台

  ![](https://s4.51cto.com/images/blog/202104/20/3e431a4058620c2ba1e600e2e7bc1d46.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)   

  Momenta的目标是打造自动驾驶大脑,基于深度学习和海量数据,Momenta已经形成服务多个场景的自动驾驶解决方案,解决了逆光、桥、隧道、雨天、夜间、匝道等复杂道路场景。

  在实现自动驾驶的过程中,深度学习的算法在训练模型时得有基础数据作支撑,需要大量的图像数据。借助团队极强的研究能力与工程能力,Momenta已经建立起大数据平台、大计算平台、大测试平台三大基础平台,从而实现大数据与AI算法的反馈闭环——以强大的计算资源处理丰富的海量数据,得到更精准、更可靠的算法模型。

  其中,大数据平台能够完美处理自动驾驶领域的数据流,具体而言,便是处理收集数据、筛选数据、数据标注、训练模型、模型测试、封装发布的整个过程。

人工智能数据流中Golang的应用实践

人工智能数据流

数据筛选

人工智能数据流中Golang的应用实践

   上图是车辆识别的一个典型,富有中国特色和北京特色——电动车,Momenta目前对电动车、自行车、人力三轮车、三轮电动车等,都能进行识别,并且达到很高的准确度。在人工智能数据流中,数据筛选这一步骤主要有以下作用:
  • 降低成本:无需重复标注已经可以很好识别的素材,降低标注成本,模型运行结果可用于辅助标注;

  • 提高模型训练效率:去除无效素材,提取包含识别目标的素材,提高训练效率;

  • 提高模型训练边际效用:通过对极端情况(corner case)的数据进行针对性训练,可以有效的提高模型性能。

数据标注

   经过筛选之后,会有部分图片需要人工标注。基于极强的工程能力,Momenta开发了在线远程众包数据标注系统,实习可视化操作,即便标注人员不懂代码也能远程完成各类标注任务。数据标注的作用主要是提高模型训练精度, 获得更多标注图片,提取包含识别目标的素材,提高训练精度。

**人工智能数据流中Golang的应用实践

人工智能数据流中Golang的应用实践

    上图是模型训练的流程图,其中,在数据导入、模型训练和模型验证Momenta都做出了极大的创新。
与传统方式相比,Momenta采用的共享集群调度让用户(内部的算法研发人员)可以编写任务描述和训练脚本,而管理员通过网页界面进行集群管理和工作调度。极大地节省人工成本,提高资源利用率,实现集中性管理,提高安全性。

Golang 在人工智能数据流中的应用

Golang在人工智能数据流中主要应用在筛选系统、标注系统和训练系统。

筛选系统

![](https://s4.51cto.com/images/blog/202104/20/b0bc672c80a5f8d34a5fe5c2ebae0b7d.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)  

  Momenta每天可能需要处理几千万张图片,数据量巨大,如果逐一进行标注将给存储带来很大的挑战。解决这个问题的方法就是筛选系统,通过筛选系统,我们将大的数据集拆分为小的单元,每个单元中包含小的任务,而每个单元对应一个 GPU,使用 GPU进行智能筛选。最终只有约10%的图片时需要进行标注的,大大减少了数据标注的成本。

标注系统

![](https://s4.51cto.com/images/blog/202104/20/169b7a99e3e1719cfaf6796576c5e6c2.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

   Momenta为内部算法研发人员服务的标注系统,可以实现用户管理、任务分发、计费、结算和自动审核。自动审核是比较特殊的,在一般场景和服务中用得比较少,自动审核是指用Momenta的模型来证实用户(在平台上兼职标注的人员)的标注结果是否符合需求或预期,主要是应付较大的用户访问,特别是节假日的时候。(节假日期间平台的用户比较闲,会希望在平台上赚点零花钱。)

训练系统

   ![](https://s4.51cto.com/images/blog/202104/20/cd136fa7542d8e0c8ee19d5ee03aa5f7.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

   训练系统是基于K8S搭建使用的,能够实现自己的调度。K8S作为容器的调度平台,默认是调度一个pod在不同的机器上面运行的,但是做多机训练可能需要同时使用多个Pod,每个机器上面一个Pod。这样就需要相应的管理以及生命周期的维护,我们这套系统是基于K8S做的开发,承担这样的工作。

机器学习场景下Golang的发展

   如果此前没有接触过机器学习?如何能够加入人工智能的浪潮中,学习并进入机器学习领域呢?Go Notebooks、Caffe和Caffe2,TensorFlow-Go几个工具都是很好的工具。接下来将演示如何用TensorFlow的Golang binding做一个简单工具。
  基于已有模型(他人训练的模型),对图片进行加载,随后可输出带有标记框的图片,也是模型识别的效果。

   所用的代码参考如下:                   

人工智能数据流中Golang的应用实践
人工智能数据流中Golang的应用实践
建议可尝试用自己的模型或是TensorFlow官方模型形成小的应用,例如人脸识别。但官方公布的模型精度都不高,原因是数据集较小,Momenta拥有的大数据平台能有效降低人工标注的成本,但大数据的训练往往涉及到多机训练。多机训练已经经历了三个重要时期,我们定义为:史前时代、石器时代和现代文明。

史前时代 人工智能数据流中Golang的应用实践

  多机训练最原始的阶段是直接登录到某几台机器,安装各类训练框架、驱动和网络配置等,在每台机器上跑训练任务,很难进行优化。容器出现后,可被用来避免某些重复的配置,让多机训练进入了下一个时代——石器时代。

石器时代

人工智能数据流中Golang的应用实践

   借助Docker 将智能框架进行封装,在每台机器上面运行命令。

现代文明

人工智能数据流中Golang的应用实践
人工智能数据流中Golang的应用实践
在现代文明阶段,所有调度和管理工作都通过容器进行,可以同时管理几百台机器。能够进入这个阶段主要是靠众多开源社区的努力和合作,比如 TensorFlow和Kubernetes的强强联合便诞生了Kubeflow。

   KubeFlow其实是一些工具的集成或是一些框架,它有官方的自定义资源以及Caffe2的资源。通过KubeFlow,用户只需要敲几行命令便可进行多机的训练,也可以实现简单的模型训练。