SQLFlow|让AI造福金融,支付宝端到端AI系统SQLFlow实践( 二 )


SQLFlow|让AI造福金融,支付宝端到端AI系统SQLFlow实践
文章图片

比如业务同学和产品同学在构建产品思路的时候 , 在他的脑海中的 AI 系统需要完成的任务 , 传达给开发同学之后 , 有可能传达不到位 , 需要反复的沟通 。 有时甚至做了一半还需要重做 。
另外从需求到上线 , 为了保证线上服务和数据产出的稳定 , 也需要通过许多的步骤 。 比如业务同学说:「活动要上线了 , 时间点很关键 , 明天必须发布!」开发同学接到需求 , 加班加点 , 开发验证完成之后 , 模型准确率提升10个点 , 准备发布模型 。 SRE同学则会把控上线之前的各项准备 , 包括预发测试是否通过 , 压力测试是否通过 , CPU负载是否有提升 , 硬件资源是否能承载新的模型 , 模型预测延迟是否提升了等……完成流程也需要很长时间 。 然而如果没有SRE的把关 , 线上的服务很难保证稳定性 。
使用 SQL 作为描述和构建 AI 任务的语言 , 可以降低构建 AI 应用的门槛 , 提升效率 。
首先需要区分编程语言的主要的两种描述方法:描述意图和描述过程 。 简而言之 , 描述意图是在描述「做什么」 , 描述过程是描述「怎么做」 。 比如 , 夏天大家有空喜欢吃点烧烤喝点啤酒 , 描述意图的方式 , 说「我想去撸串」这一句就够了 。 而描述过程 , 就需要说「我今天晚上下班后 , 叫上老王小李 , 去公司楼下的烧烤店 , 点100个串和10个啤酒 , 最后用支付宝扫码付款」 。 可以看到描述意图可以非常简洁 , 而具体的执行方案 , 可以根据意图中构建得出 。 这点也是 SQL 不同于其他语言的关键点 。
在描述模型训练任务时 , 使用 SQLFlowSQL 只需要编写 SELECT * FROM iris.train TO TRAIN DNNClassifier LABEL class INTO my_dnn_model; 即可 , 如果使用Python完成相同的任务则需要编写如下图这样的较长的代码 。
SQLFlow|让AI造福金融,支付宝端到端AI系统SQLFlow实践
文章图片

SQL 语言除了有非常简洁的优势之外 , 在数据科学领域 , SQL 语言的已有用户量大 , 并且在不断的增加 。 这里也有两个统计图 , 统计了数据科学类任务所使用的工具的流行程度和增长趋势 。 SQL 语言流行程度排名第三 , 增量排在第四名 。 数据科学领域正在更多的使用 SQL 是我们希望使用 SQL 语言描述AI任务的原因 。 除了在表达能力上 SQL 语言有非常简洁的优势之外 , 在蚂蚁内 MaxCompute 被广泛使用也是我们选择 SQL 的一个原因 。
SQLFlow|让AI造福金融,支付宝端到端AI系统SQLFlow实践
文章图片

如何使用SQLFlow SQL语句构建AI任务 SQLFlow 是一个开源项目 , 您可以在任意环境部署 SQLFlow 。 SQLFlow 提供了两种用户界面:基于 Jupyter Notebook 的 Web 图形界面和命令行工具 。 在 Jupyter Notebook 中 , 输入的 SQL 语句会发送到 SQLFlow server 完成编译和执行 。
对于模型训练任务 , SQLFlow拓展了标准 SQL 语法 , 增加了 TO TRAIN 从句来描述模型训练 。 我们以 iris(鸢尾花)数据集为例 , 训练数据格式如下图:
【SQLFlow|让AI造福金融,支付宝端到端AI系统SQLFlow实践】SQLFlow|让AI造福金融,支付宝端到端AI系统SQLFlow实践
文章图片

训练的 SQL 语句是:

SELECT * FROM iris.train
TO TRAIN DNNClassifier
WITH model.n_classes = 3, model.hidden_units = [10, 20]
LABEL class
INTO my_dnn_model;
其中 SELECT * FROM iris.train 部分使用一个标准的SQL语句 , 获取模型训练的数据 , 这个SQL语句可以是任意的 SELECT 语句 , 比如包含嵌套、JOIN等操作也是支持的 。 第二行 TO TRAIN DNNClassifier 指定训练的模型是 DNNClassifier , DNN分类器 。 第三行 WITH 语句指定了模型训练需要的一些参数 。 LABEL class 指定使用数据库中的 class 列作为训练标签 , INTO my_dnn_model 指定训练好的模型保存的名字 。 运行这条SQL语句 , SQLFlow会开始模型的训练 , 并保存一个叫做my_dnn_model 的模型用于预测 , 评估、解释等 。
然后我们可以使用下面的这段SQL进行模型评估:
SELECT * FROM iris.test
TO EVALUATE my_dnn_model
WITH validation.metrics="Accuracy"
LABEL class
INTO iris.evaluate_result;
其中, SELECT * FROM iris.test 指定使用另一个表 iris.test 作为验证集 , TO EVALUATE my_dnn_model 指定要评估的模型是我们刚才训练的my_dnn_model , LABEL class 指定评估数据集中的标签列为 class , INTO iris.evaluate_result 指定评估指标的输出表 。 模型评估任务执行完成之后 , 就会输出如下图这样的评估指标的表 。 您也可以在SQL语句中使用 WITH 指定要输出的指标 , 就会作为结果表的一列数据输出 。


推荐阅读