近年来由于机器学习的蓬勃发展,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]:
(你可以在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 (二)...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。