几家AI平台比较与实操(一)

sharonlyu

近年来由于机器学习的蓬勃发展,AI平台也如雨后春笋一般出现,不管是FLAG等巨头,还是Databricks Fastai 以及H2O等中型并主要以用户增长为导向的公司,还是各家小公司的in-house (hybrid) solutions,AI平台的开发和迭代可谓五花八门令人眼花缭乱。笔者从业三年(资历尚浅,见笑),先后在Facebook从模型开发的角度,在房地产互联网公司Zillow从平台开发者的角度,使用和评估过多家平台的产品,在此班门弄斧地整理一下我较为熟悉也发展较为成熟的三大平台,简要地谈谈它们的优缺点和一些使用感受,希望给读者一个大致的感受,可以在开发中适当选取和借鉴。

本文选取了Facebook的FBLearner(未开源),Databricks开源的MLFlow,以及Google开源的Kubeflow进行整理。

FBLearner

(记忆可能已经模糊,请批评指正。)

Facebook家最简单易用和被广泛使用的模型训练平台,操作极为傻瓜式,UI各个模块非常健全,几乎可以做到点点鼠标就完成模型训练。作为一个初级机器学习工程师,我当时所接触到的日常workflow基本上是:

从hive table拿数据 --> 数据清洗和模型实验等准备步骤 --> 准备production data table并从FBLearner UI中选取 --> 设置使用常用模型(FB家有很多模版比如最常用的Gradient Boosted Decision Trees),或者自己的模型pipeline,设置参数等 --> 点击训练 -->(超参训练) --> 生成模型artifact,大多时候ready for deployment可以一键部署,有的模型需要写C++代码部署(也是FB的一大特色,其他地方比较少见)--> 查看模型performance如ROC curve等。此外也支持多个模型相比较,在tracking这点上FBLearner是做得相当好的。

实验方面,(Facebook拥有强大的用户群体所以做实验相当方便。。)工程师通常使用一个叫Quick Experiment简称QE的工具,可以自由选择定位的用户群体和数量。此时可以写少量代码将QE和前面部署的模型代码进行整合从而进行a/b test或者其他更复杂的test比如multi-armed bandit(这个我没有explore过)。

一个最简单的workflow代码[1]

下面这段代码是使用iris dataset构建一个decision tree模型的示范,可以看到workflow首先(从UI)获取labeled_data unlabeled_data两个参数,进行train-eval split,训练模型,计算metrics,进行预测,最后返回相应结果数据。

\# The typed schema of the Hive table containing the input data

feature\_columns = (

 ('petal\_width', types.INTEGER),

 ('petal\_height', types.INTEGER),

 ('sepal\_width', types.INTEGER),

 ('sepal\_height', types.INTEGER),

)

label\_column = ('species', types.TEXT)

all\_columns = feature\_columns + (label\_column,)

\# This decorator annotates that the following function is a workflow within

\# FBLearner Flow

@workflow(

 \# Workflows have typed inputs and outputs declared using the FBLearner type

 \# system

 input\_schema=types.Schema(

 labeled\_data=types.DATASET(schema=all\_columns),

 unlabeled\_data=types.DATASET(schema=feature\_columns),

 ),

 returns=types.Schema(

 model=types.MODEL,

 mse=types.DOUBLE,

 predictions=types.DATASET(schema=all\_columns),

 ),

)

def iris(labeled\_data, unlabeled\_data):

 \# Divide the dataset into separate training and evaluation dataset by random

 \# sampling.

split = SplitDatasetOperator(labeled\_data, train=0.8, evaluation=0.2)

 \# Train a decision tree with the default settings then evaluate it on the

 \# labeled evaluation dataset.

dt = TrainDecisionTreeOperator(

 dataset=split.train,

features=\[name for name, type in feature\_columns\],

 label=label\_column\[0\],

 )

metrics = ComputeMetricsOperator(

 dataset=split.evaluation,

 model=dt.model,

 label=label\_column\[0\],

 metrics=\[Metrics.LOGLOSS\],

 )

\# Perform predictions on the unlabeled dataset and produce a new  dataset

predictions = PredictOperator(

 dataset=unlabeled\_data,

 model=dt.model,

 output\_column=label\_column\[0\],

 )

 \# Return the outputs of the workflow from the individual operators

 return  Output(

 model=dt.model,

 logloss=metrics.logloss,

 predictions=predictions,

 )

一些点评

数据层比较严重依赖于hive,对底层的要求比较高,查询和训练有时会有高延迟尤其是训练工程师太多的情况下。。我在职时没有explore过其他数据层,不知道可不可以与缓存层相结合,但当时已经在广泛推进spark,对于查询来说不知道速度会不会优于使用presto,但workflow中的SparkOperator性能上肯定会优于HiveOperator。

此外我在职时没有研究过Caffe2,不知道与FBLearner的结合做得好不好,欢迎点评。

Workflow DAG方面,比较标准化,和Airflow或者Airflow的原型——FB Dataswarm的基本逻辑都是一致的。

Takeaways

十分优秀的用户体验,模块与模块间整合流畅。代码量很少,对机器学习工程师非常友好。

对大厂自己的infra的依赖性高,模型种类有限,开发新模型受限。

MLFlow

Databricks家的明星产品,从近年来的推广力度也可以看出他们对此产品的重视。相比下文即将谈及的Kubeflow, 虽然两者都致力于提供end-to-end的机器学习平台体验,但MLFlow的关注重点和优势主要在于前半部分也即实验训练方面。同时因为Databricks和Spark社区的良好关系,MLFlow和Spark的整合是做得比较好的,这一点也为现在越来越多的distributed training的usecases比如Tensorflow Pytorch等铺平了道路。

模型训练方面,MLFlow的tracking做得和FBLearner一样好甚至更好,params, versioning, metrics, metadata, visualization等各个要素都有包括,在UI里一目了然,其中超参的可视化挑选更是一大亮点[2]
image.png

(你可以在UI中拖动各条实验曲线,选择超参范围用于比较结果。)

关于如何将普通的模型训练python代码与MLFlow tracking整合在一起,这里有许多例子:https://github.com/mlflow/mlflow/tree/master/examples。简而言之,你通过使用MLFlow的python sdk, 通知MLFlow把你的代码打包起来上传给tracking server,使得你可以迅速记录训练结果。而MLFlow支持的model lib/flavors也很多,他们的目标是支持任何种类的model,这点在后面的模型方面会再讨论。

Workflow方面,MLFlow管这个component叫project,但是DAG feature尚未出世(往往需要和Airflow相结合),最多就是线性的multi-step workflow,所以作用有限,主要就是在不同的环境下(比如conda或container)跑训练代码等,目前他们也正在开发对k8s的支持。

模型方面,通过使用MLmodel这个文件来定义model,又因为支持对python function的打包,所以MLFlows声称可以支持任何种类的model。Model被pickle之后可以通过REST API来serve,也可以使用Seldon Core[3]来部署到k8s上。一些built-in支持的model种类有:python function, R function, Pytorch, Scikit-learn, Spark MLlib, Tensorflow, XGBoost, LightGBM等等。

Takeaways

主要侧重于模型支持,对模型开发人员体验很友好。UI是最大的亮点。

模型部署较为不成熟。

Kubeflow

To be continuted in (二)...

References

  1. https://engineering.fb.com/core-data/introducing-fblearner-flow-facebook-s-ai-backbone/
  2. https://databricks.com/blog/2019/06/07/hyperparameter-tuning-with-mlflow-apache-spark-mllib-and-hyperopt.html
  3. https://www.seldon.io/tech/products/core/
阅读 3.4k

北美西海岸程序媛一枚,做过一点数据库服务,做过一点机器学习,trying to master in Python and Spark...

18 声望
3 粉丝
0 条评论

北美西海岸程序媛一枚,做过一点数据库服务,做过一点机器学习,trying to master in Python and Spark...

18 声望
3 粉丝
文章目录
宣传栏