共计 4251 个字符,预计需要花费 11 分钟才能阅读完成。
今年 QCon 大会,蚂蚁金服发布了开源 SQLConnectAI 产品 SQLFlow,旨在“降低人工智能应用的技术门槛,让技术人员调用 AI 像 SQL 一样简单”。SQLFlow 的思想最早可以追溯到 2005 年,当时 Thomas Tileston 提出了 In-database 分析, 将数据库与数据挖掘、机器学习有机地统一了起来 。In-database 分析通过扩充 SQL 的能力,降低了企业应用机器学习技术的门槛,同时解决了数据在不同系统间移动所产生的一系列问题。
In-databse 分析主要具有以下特性:
- 易用性,降低机器学习门槛,掌握 SQL 的技术人员即可完成大部分的机器学习模型训练及预测任务,掌握 TensorFlow 和 Scikit-learn 的技术人员比掌握 SQL 的技术人员少很多。
- 本地性,减少数据的移动,存储在数据库中的数据在原地进行机器学习建模和推理,提高了分析效率同时,避免了数据移动过程中存在的安全问题,减少了 team 间沟通成本,以及建造单独数据分析基础设施的 IT 成本。
- 可扩展性,单机机器学习到集群机器学习的扩展
- 通用性,即支持的机器学习算法的丰富性。
从 2005 年 Thomas Tileston 提出了 In-database 分析至今,已经涌现出很多 In-database 分析的产品,它们部分或全部支持 In-database 分析的特性,我们将主要的产品和时间线总结在图 1.
图 1 In-database 分析时间线
从时间线可以看出,2009 年 MAD Skills 在 VLDB 的发表和 2011 年 MADlib 项目的诞生可以作为 In-database 分析的里程碑 。MADlib 是由 Pivotal Greenplum DB 团队和高校联合研发的,参与的大学包括伯克利大学加州分校、斯坦福大学、威斯康辛麦迪逊大学、佛罗里达大学。2017 年 MADlib 正式毕业成为 Apache 顶级项目。MADlib 的第一篇论文“MAD skills: new analysis practices for big data”,目前 Google 引用已达 555 次,Spark SQL,BigQuery ML 等产品均引用了 MADlib 的工作,MADlib 被认为是 In-database 分析的先驱者和领路人。
In-database 分析产品众多,不同厂商对 In-database 分析的理解也不尽相同。从架构来区分,In-database 分析可以分为以下四种:
- SQL wrapper, 将扩展的 SQL 语法翻译成 AI 引擎可以执行的程序,它不涉及对机器学习算法的重构,而是直接调用底层 AI 引擎。
- SQL on AI engine, 让 AI 引擎支持 SQL 语法及相应的查询优化器,但 SQL 的执行器使用 AI 引擎自身,从而实现了 AI engine as a database 的架构。
- SQL based AI algotithm, 基于 SQL 重写机器学习算法,并将这些算法内置到数据库中。
- UDA based AI algorithm, 基于数据库的 User Defined Agrregation(UDA)实现机器学习算法。基于不同场景,UDA 语言可以是 Python,R 或者是高效的 C/C++。这些算法同样被内置到数据库中。
上述四种 In-database 分析的架构对 In-database 分析的特性有不同程度的支持,我们选取 SQLFlow,Spark SQL,Bigquery ML 和 MADlib 作为这四种架构的典型代表。表 1 展示了四个典型 In-database 分析产品和它们对 In-database 分析特性的支持。
表 1:In-database 分析产品特点
下面,我们结合表 1 详细介绍一下 SQLFlow,Spark SQL,Bigquery ML 和 MADlib 的特点和适用场景。
1.SQL wrapper 架构的代表是前面提到的 SQLFlow,其偏重于解决 In-databse 分析中的易用性和通用性。易用性方面,SQLFlow 通过为 SQL 扩充 TRAIN 和 PREDICT 语法,实现了技术人员直接调用 SQL 即可实现模型训练和预测。
sqlflow> SELECT \*
FROM iris.train
TRAIN DNNClassifier
WITH n\_classes = 3, hidden\_units = \[10, 20\]
COLUMN sepal\_length, sepal\_width, petal\_length, petal\_width
LABEL class
INTO sqlflow\_models.my\_dnn\_model;
通用性方面,SQLFlow 支持的机器学习算法数量由底层 AI 引擎决定,目前其支持 TensorFlow。但可扩展性,SQLFlow 需要将 wrapper 的数据库和 AI 引擎相结合,对于 M 个结点的分布式数据库如何与 N 个结点的 AI 引擎高效结合的问题,并不是简单 wrapper 可以完成的,往往需要专业的连接器,比如连接 Spark 和 Greenplum DB 的 greenplum-spark-connector。对于本地性,SQLFlow 无能为力了。
2.SQL on AI engine 的代表是 Spark SQL。Spark SQL 于 2014 年 5 月随着 SPARK1.0.0 正式推出,其前身是 Spark Shark。Spark SQL 偏重于让 Spark 这个 AI 引擎具有处理 SQL 的能力,降低 Spark 本身的入门门槛,从这点上我们再次看到了 SQL 的普遍性和重要性。其偏重解决 In-database 分析中的后三个特性,但它需要和 Spark 的 DataFrame 接口统一使用才能更好的发挥 AI 的威力,它降低了 R 语言使用者上手 Spark 的难度,但对于纯 SQL 技术人员,使用 JDBC 连接 Spark SQL 只能执行标准 SQL 查询而非带有 AI 能力的查询(Spark SQL 的 UDF 需要通过 Spark Register 不是 SQL 接口)。Spark SQL 接口如下所示。
results = spark.sql("SELECT * FROM people")
names = results.map(lambda p: p.name)
3.SQL based AI algotithm 的代表是 BigQuery ML。BigQuery ML 于 2018 年 7 月发布, 它在 Google BigQeury 数据仓库中内嵌了基于 SQL 的机器学习算法,技术人员不需要移动数据,也不需要使用 Python 或者 R,就可以使用类 SQL 的语法直接调用机器学习算法训练模型和预测。下面的例子展示了如何在 BigQeury ML 中训练和使用线性回归模型。
CREATE MODEL income_model
OPTIONS (model_type=‘linear_reg’, labels=[‘income’])
AS SELECT state, job, income FROM census_data;
SELECT predicted_income FROM PREDICT(MODEL‘income_model’,
SELECT state, job FROM customer_data);
BigQuery ML 很好的解决了 In-database 分析的前三个特性,但使用 SQL 编写复杂的机器学习算法虽然并非不可能,但开发效率也相对较低,截至目前,BigQuery ML 只支持 Linear regression,Logistic regression 和 K-means clustering 三类机器学习算法。
4.UDA based AI algorithm 的代表是 Apache MADlib。MADlib 基于数据库 User Defined Agrregation(UDA)实现机器学习算法,它完美的解决了 In-databse 分析的四个特性。
易用性 ,MADlib 通过将机器学习算法封装成数据库的 UDF,用户可以使用标准 SQL 实现机器学习建模和推理,无需引入额外 SQL 语法,其用户接口如下:
SELECT madlib.logregr_train
( 'patients', -- Source table
'patients_logregr', -- Output table
'second_attack', -- Dependent variable
'ARRAY[1, treatment, trait_anxiety]', -- Feature vector
NULL, -- Grouping
20, -- Max iterations
'irls' -- Optimizer to use
);
SELECT p.id, madlib.logregr_predict(coef, ARRAY[1, treatment, trait_anxiety]),
p.second_attack::BOOLEAN
FROM patients p, patients_logregr m
ORDER BY p.id;
本地性 ,MADlib 的机器学习算法直接在 DB 的内核中执行。
可扩展性 ,Greenplum DB 是世界领先的开源 MPP 数据库,Greenplum 与 MADlib 结合可以实现在数据库的大量 Segment 结点上并行地执行聚集,生成 sub state,并在 Master 结点进行 sub state 的聚合,从而实现机器学习算法从单结点到集群的扩展。
通用性 ,MADlib 目前支持 50 多种机器学习算法。除了核心的机器学习建模和推理,MADlib 还支持了数据分析流水线的全部流程,实现了数据分析的闭环。数据科学家在定义好数据分析的问题后,首先进行数据探索,分析和识别数据中可供挖掘的模式,接下来进行数据的预处理、清洗和整合,之后才进行各种类型的建模,包括非监督的数据挖掘任务、有监督的预测建模、文本分析等等。最后还要对建模后的结果进行模型选择,不同的模型有不同的评测标准,往往还会使用交叉验证等技术。MADlib 对以上环节都有支持。
但包括 MADlib 在内的 UDA based AI algorithm,需要假设模型能装入内存,因为它们将模型表达成 UDA 的 state,对于拥有数百万、千万特征的模型,UDA based AI algorithm 并不适合。
综上,笔者从 SQLFlow 出发,分析了 In-database 分析领域不同的实现架构和代表产品,它们各自有适合的应用场景,但总体上都是奔着一个目标在努力: 以最高效的方式将数据和机器学习连结在一起,让更多的技术人员可以使用 AI,让 AI 可以赋能更多的企业 。更可喜的是,我们看到从 SQLFlow 到 Spark SQL 再到 Apache MADlib,它们都是开源软件的一份子,开源进一步促进了这些技术的普及和深入,让 AI 离我们再近一些。