Fork me on GitHub

sqlflow初体验

目录

  • 背景

  • 第一部分 Sqlflow安装部署

  • 第二部分 机器学习例子

  • 第三部分 系统架构

  • 参考文献及资料

背景

2019年5 月 6 日,在QCon 全球软件开发大会(北京站)上,蚂蚁金服副 CTO 胡喜正式宣布开源机器学习工具 SQLFlow。实际上3个月前sqkflow项目已经在github上开源了。

本篇文件主要参考sqlflow官网的案例和说明对sqlflow进行了体验,并记录下来。

sqlflow按照官网的定义,将SQL引擎(例如MySQL,Hive,SparkSQL或SQL Server)和tensorflow和其他机器学习的桥梁。扩展了SQL语言,支持对机器学习模型训练、预测和推理。

目前开源版本仅支持MySQL和TensorFlow

介绍文档中也提到,在sqlflow之前也有SQL引擎提供了支持机器学习功能的扩展。

  • Microsoft SQL Server:Microsoft SQL Server具有机器学习服务,可以将R或Python中的机器学习程序作为外部脚本运行。
  • Teradata SQL for DL:Teradata还提供RESTful服务,可以从扩展的SQL SELECT语法中调用。
  • Google BigQuery:Google BigQuery通过引入CREATE MODEL语句在SQL中实现机器学习。

第一部分 Sqlflow安装部署

1.1 部署mysql做为数据源

(1)构建镜像

官网提供了一个dockerfile,可以git clone整个项目。

https://github.com/sql-machine-learning/sqlflow/tree/7c873780bd8a3a9ea4d39ed7d0fcf154b2f8821f/example/datasets

1
2
3
4
# 进入Dockerfile文件所在目录
cd example/datasets
# 使用Dockerfile构建镜像
docker build -t sqlflow:data .

可以查看创建了一个docker images:

1
2
docker images
# 创建了REPOSITORY:sqlflow镜像,TAG为:data

(2)启动mysql容器

用镜像启mysql容器:

1
2
3
4
5
docker run --rm -d --name sqlflowdata \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_ROOT_HOST=% \
sqlflow:data

使用镜像:sqlflow:data,启动一个名为:sqlflowdata的容器,并且把3306端口映射到宿主机。mysql的root用户的密码为root。

(3)生成测试数据

进入容器:

1
docker exec -it sqlflowdata bash

执行SQL语句:

1
2
3
4
5
# 建库建表,注意宿主机目录:datasets
cat /popularize_churn.sql | mysql -uroot -proot
cat /popularize_iris.sql | mysql -uroot -proot
# 建库
echo "CREATE DATABASE IF NOT EXISTS sqlflow_models;" | mysql -uroot -proot

至此完成mysql容器的启动和测试数据的生成。按Ctrl+P+Q,正常退出不关闭容器。

1.2 使用docker部署slqflow

(1)拉取镜像并启动容器

首先从docker Hub上拉取镜像:

1
# docker pull sqlflow/sqlflow:latest

启动容器:

1
2
3
# docker run --rm -it --name sqlflowServer -p 8888:8888 sqlflow/sqlflow:latest \
bash -c "sqlflowserver --datasource='mysql://root:root@tcp(192.168.31.3:3306)/?maxAllowedPacket=0' &
SQLFLOW_SERVER=localhost:50051 jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root"

命令使用镜像:sqlflow/sqlflow:lates,启动了名为:sqlflowServer的容器。将8888端口映射到宿主机上。这里需要配置datasource,指向mysql使用套接字:192.168.31.3:3306。这里使用之前构建的mysql容器的连接信息,可以根据实际情况配置。

如果mysql套接字配置错误,报错信息:connect: connection refused

如果没有报错:

1
2
3
4
5
6
7
2019/05/06 14:47:30 Server Started at :50051
[I 14:47:30.261 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[I 14:47:30.874 NotebookApp] Serving notebooks from local directory: /
[I 14:47:30.874 NotebookApp] The Jupyter Notebook is running at:
[I 14:47:30.874 NotebookApp] http://(fd2b9b3f994b or 127.0.0.1):8888/?token=265b3fc832b5b48689fa9f88483125dc9335188dd7c1d863
[I 14:47:30.874 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 14:47:30.877 NotebookApp] No web browser found: could not locate runnable browser.

这里启动了Jupyter Notebook服务,对外服务端口为8888,并且映射到宿主机。例如这里可以使用下面的url范围web界面:http://192.168.31.3:8888/?token=265b3fc832b5b48689fa9f88483125dc9335188dd7c1d863

(2)简单测试

Jupyter Notebook 新建一个python3交互环境。测试一下:

1
2
%%sqlflow
select * from iris.train limit 5;

第二部分 机器学习例子

使用iris数据集体验机器学习的例子,使用Jupyter Notebook 完成:

(1)训练模型:

1
2
%%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;

使用iris.train表中的数据训练神经网络。

模型训练结果输入到sqlflow_models.my_dnn_model,回显训练正确率为:0.97273

1
2
Training set accuracy: 0.97273
Done training

(2)模型应用

使用训练结果对数据进行预测应用:

1
2
%%sqlflow
SELECT * FROM iris.test PREDICT iris.predict.class USING sqlflow_models.my_dnn_model;

使用iris.test中的数据喂给训练好的模型,预测结果输出到表:iris.predict。

1
Done predicting. Predict table : iris.predict

查看结果表中的数据案例:

1
2
%%sqlflow
select * from iris.predict limit 2
1
2
3
4
5
6
+--------------+-------------+--------------+-------------+-------+
| sepal_length | sepal_width | petal_length | petal_width | class |
+--------------+-------------+--------------+-------------+-------+
| 6.3 | 2.7 | 4.9 | 1.8 | 2 |
| 5.7 | 2.8 | 4.1 | 1.3 | 1 |
+--------------+-------------+--------------+-------------+-------+

第三部分 系统架构

系统原型使用下面的架构:

1
2
SQL statement -> our SQL parser --standard SQL-> MySQL
\-extended SQL-> code generator -> execution engine

原型运行的数据流为:

  1. 它通过MySQL Connector Python API从MySQL检索数据
  2. 从MySQL检索模型
  3. 通过调用用户指定的TensorFlow估算器训练模型或使用训练模型进行预测
  4. 并将训练过的模型或预测结果写入表格

参考文献及资料

1、sqlflow项目官网 链接:https://github.com/sql-machine-learning/sqlflow

2、会 SQL 就能搞定 AI!蚂蚁金服重磅开源机器学习工具 SQLFlow 链接:https://www.infoq.cn/article/vlVqC68h2MT-028lh68C

本文标题:sqlflow初体验

文章作者:rong xiang

发布时间:2019年05月06日 - 22:05

最后更新:2022年10月25日 - 23:10

原始链接:https://zjrongxiang.github.io/posts/f5af6de0/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%