
图片来源:webcorenigeria
Facebook今天第一次正式介绍了FBLearner Flow,一个可以为全公司员工管理机器学习模型的机器学习软件。换句话说,这是一个可以自己制造人工智能的人工智能,你可以理解为传说中的人工智能母体。
它与其他基于云端的机器学习服务有点相似,例如微软的Azure机器学习或者Airbnb的开源Airflow,不过,FBLearner Flow是根据Facebook自己的业务而进行最优化的,装满了Facebook工程师开发的算法,让公司其他人都可以为自己的模型而使用该平台。
Facebook不只可以发布关于FBLearner Flow的学术论文,还可以最终将其开源。Facebook工程师已经与其他公司的人讨论了这类技术,包括Linkedin、Twitter和Uber等公司。Mehanna说,他们都非常感兴趣。
当然会对开源感兴趣啦——这个系统已经在Facebook这样的大公司验证可行,而且,这!不!花!钱!这一点就与来自Domino Data Lab和Yhat的数据科学合作工具不同。
Facebook经常将一些技术开源,这样的做法也符合公司自己的需要,因此如果未来FBLearner Flow完全开源了也不奇怪。问题是Facebook是否愿意投入工程资源,将这项技术与其专利系统的匹配断开。话虽如此,如果Facebook不愿开源、将FBLearner Flow压在箱底也不奇怪。因为多亏了这项技术,员工变得更加高效了。这会是一个竞争优势。人们在新系统中可以看到过往的试验和结果,甚至将两个不同的机器学习流水线结合起来,设计出某种更加复杂的东西。此外,图形交互界面让非工程师也可以使用这个新平台,因此才会有Mehanna说高达的25%的人都在使用。
无论未来是否会开源,至少,我们今天获得了一部分FBLearner Flow的技术详解。让我们来看看Facebook工程师Jeffrey Dunn的博文,详细解读FBLearner Flow作为Facebook的人工智能母体到底厉害在哪儿。Jefferey Dunn从卡内基梅隆大学获得硕士学位,2011年加入Facebook,参与打造图片搜索中的网络搜索等工作。

图片来源:Facebook Code
如今,Facebook的许多体验和交互都是依靠AI实现的。当你登录Facebook,我们使用机器学来给你提供独特的、个人化的体验。机器学习(ML)模型实现了个人化新闻流(News Feed)、过滤了可能得罪人的内容、突显流行热点话题并将搜索结果排名。还有很多其他体验可以从机器学习中获益。但是以前,工程师必须有很强机器学习背景,不然没法好好利用公司的机器学习基础设施。在2014年底,我们从零开始,重新定义Facebook的机器学习平台,将最先进的AI和ML算法送到Facebook每一位工程师的手中。
我们希望能有这样的一个平台:
1.每个机器学习算法应该可以一次性设置好,可以重复使用;
2. 工程师可以写一个训练流水线,在许多机器上平行运行,可以被很多工程师所用。
3. 无论工程师在机器学习领域的背景深浅,都可以很简单地训练模型,而且,其中几乎所有的 步骤都可以完全自动化。
4. 人人都能很方便地搜索过往试验、查看结果、与他人分享,并在某一个试验中开启新的变量。
我们决定建造一个全新平台:FBLearner Flow,可以简单方便地在不同产品中重复使用算法,可以放大规模同时运行几千个定制试验,并且能够轻松管理试验。这个平台提供了创新性的功能,例如从流水线定义和自动平行Python代码自动生成UI体验。平台从创立起已经训练了超过一百万个模型,我们的预测服务发展到每秒超过600万次预测。
减少了手动工作的工程师们可以花更多时间进行特征工程,这反过来又可以进一步提升精度。工程师可以在更大的平台层面去发挥影响。FBLearner Flow提供了平台和工具,让工程师每天进行几千个试验。
核心概念和组成
在深入理解系统之前,我们先来看几个关键概念。
工作流:一个工作流就是在FBLearner Flow中定义的一个流水线,是所有机器学习任务的入口。每个工作流作为一个具体的任务,例如训练和评估某个具体的模型。工作流根据操作员来定义,可以平行运作。
操作员:操作员是工作流的建造模块。从概念上,你可以将操作员想象为一个程序里的一个功能。在FBLearner Flow中,操作员是执行的最小单位,可以在单一机器上运作。
频道:频道代表输入和输出,在一个工作流的各个操作员直接流转。所有频道都用一个我们定义的定制类别系统输入。
平台包括这三个核心组成部分:一个作者及定制分布工作流的实施环境,一个发布试验和查看结果的试验管理UI,以及无数预定义的流水线,用来训练Facebook大部分经常使用的机器学习算法。
作者和实施环境
平台上所有的工作流和操作员都定义为Python功能,使用独特的装饰器来整合进入平台。让我们来看一个具体的情景,我们想用经典的Iris数据集训练一个决策树,基于花朵的花瓣和萼片大小来预测花的品种。假设数据库是在Hive里面,有五个栏目,分布代表了花瓣宽度、花瓣长度、萼片宽度、萼片长度和花朵样本的品种。在这个工作流中,我们会用日记损失来评估模型的性能,预测一个未标记的数据库的品种。
要处理这类任务的工作流样本大概长这样:

图片来源:Facebook Code
让我们来仔细看看这个工作流,理解FBLearner Flow到底是怎么运作的。
首先,@workflow装饰器告诉FBLearner Flow,iris功能不是一个普通Python功能,而是一个工作流。input_schema和returns参值说明了工作流的输入类型及输出类型。实施框架会自动确认这些类型,确保工作流收到的数据是符合其预期的。这个例子中,labeled_data输入标记为有四个栏目的数据库输入。如果在数据库中有一个栏目缺失,那么就会提出一个TypeError异常,因为数据库与这个工作流不兼容。
工作流的本体看起来相应普通的Python功能,连接到几个操作员来实施机器学习工作。虽然看起来普通,FBLearner Flow使用一个future系统来在工作流内提供平行化,如果有若干个步骤不共享一个数据相关性,就可以同时运行。
工作流不是线性执行,而是分两个步骤:1)DAG编译步骤,2)操作员执行步骤。在第一部中,操作员并没有执行,而是返回future。future代表了延迟的计算。因此在上述例子中,dt变量实际上是一个future,代表了还没有发生的决策树训练。FBLearner Flow在DAG编译阶段的所有操作员撤销行为都留有记录,并且记录所有必须在操作之前搞定的future。例如,ComputeMetricsOperator和PredictOperator将dt.model作为输入,因此系统知道nn一定要在操作员运行之前计算,因此必须等到TrainDecisionTreeOperator完成。
DAG编译阶段完成时,FBLearner Flow将打造一个操作员DAG,可以预定何时进行执行,每个操作员只要上一级成功完成就可以开始执行。在这个例子中,ComputeMetricsOperator和PredictOperator之间没有数据相关性,因此这两个操作员可以同时平行运行。

图片来源:Facebook Code
在操作员执行阶段,每个操作员有自己