RDS SQLFlow是一种基于AliSQL的AI解决方案,提供完全托管的服务,用于简化机器学习的实现流程。通过内置的机器学习服务和SQL扩展能力,RDS SQLFlow可以快速支持AI业务的发展。它将AliSQL与AI引擎连接,使用户只需编写少量SQL代码,就能描述整个应用或产品背后的数据流和AI构造。
步骤一:搭建基于MySQL的rds_sqlflow服务
创建RDS Custom实例,部分参数需按照以下配置进行设置。详细操作请参见创建RDS Custom实例。
实例规格中的产品架构选择AI节点。
镜像选择默认镜像中的SQLFlow。
使用与RDS Custom实例同一地域、同一VPC下的ECS,通过
ssh
命令连接到RDS Custom实例。详细操作请参见连接RDS Custom实例。进入/home/script目录,执行start_sqlflow.sh脚本,以便在本地迅速创建一个MySQL进程,并同时运行RDS SQLFlow容器。
cd /home/script ./start_sqlflow.sh -P 50054 -u aliyun_rds -p aliyun_rds
参数说明:
参数
说明
-P
RDS SQLFlow容器中在主机上映射的端口,默认为50054。
-u
创建的MySQL的用户名,默认为aliyun_rds。
-p
创建的MySQL的用户密码,未指定时将随机生成。
输出结果:
TLS证书。请复制证书内容,并将其在客户端保存为ca.crt文件。
客户端连接命令。通过该命令,可以连接至RDS SQLFlow节点,并指定机器学习所使用的数据源。
运行结果:执行如下命令查看脚本运行结果。
运行
ps -ef | grep mysql
命令,查看MySQL进程的状态。运行
docker ps
命令,查看RDS SQLFlow容器状态。
步骤二:通过RDS SQLFlow客户端连接至rds_sqlflow服务
使用与RDS Custom实例同一地域、同一VPC下的ECS,安装RDS SQLFlow客户端,并为该客户端赋予可执行权限。
您可以通过如下两种方式,安装RDS SQLFlow客户端。
在RDS Custom实例中,将home目录下的RDS SQLFlow客户端文件,拷贝至目标ECS,本文以home目录为例。
scp /home/sqlflow root@<ECS实例的私网IP地址>:/home
在目标ECS中下载客户端:
wget -O sqlflow "https://forsharelogs.oss-cn-beijing.aliyuncs.com/sqlflow?Expires=1729065153&OSSAccessKeyId=TMP.3KhXUKdnV6VCQmT15btm1k2tLRdWeBh26vq78fg2zJDLLfMAmrXYP2hWJKw64Wq7VWmLQLiMuCPCDiTv5ERnhL7a9e****&Signature=mgbW6Vh5q%2FP8aGxrzz0QtglBUxQ%3D"
在目标ECS中,赋予RDS SQLFlow文件可执行权限:
cd /home chmod +x sqlflow
在目标ECS中,新增ca.crt文件,并复制步骤一中生成的TLS证书内容。
vim ca.crt
使用步骤一中执行start_sqlflow.sh脚本时输出的客户端连接命令,连接rds_sqlflow服务。例如,当sqlflow安装至home目录下时,执行如下命令:
/home/sqlflow -c ca.crt -d'mysql://user:password@tcp(mysqlHost:mysqlPort})/mysql?maxAllowedPacket=0' -ssqlflowHost:sqlflowPort
参数说明:
参数
说明
-c
指定TLS证书。为保存在客户端的步骤一时所输出的TLS证书。
-d
指定RDS SQLFlow使用的MySQL数据源。例如
'mysql://user:password@tcp(mysqlHost:mysqlPort})/mysql?maxAllowedPacket=0'
,其中:user
:MySQL数据源的用户名。password
:MySQL数据源用户的密码。mysqlHost
:MySQL数据源的服务地址。mysqlPort
:MySQL数据源的服务端口号。
说明步骤一中执行start_sqlflow.sh脚本输出的客户端连接命令,默认使用运行于RDS SQLFlow服务端的MySQL,也可以通过指定其他MySQL服务地址,以使其作为数据源。
-s
指定RDS SQLFlow的服务端地址。例如
sqlflowHost:sqlflowPort
,其中:sqlflowHost
:RDS SQLFlow服务端的地址,即RDS Custom的私网IP地址。sqlflowPort
:RDS SQLFlow服务端的端口号。
示例:
/home/sqlflow -c ca.crt -d'mysql://aliyun_rds:aliyun@tcp(47.XXX.XXX.153:3306})/mysql?maxAllowedPacket=0' -s172.XXX.XXX.180:50054
当提示
Welcome to SQLFlow
时,表示已成功连接并进入了SQLFlow命令行界面。
步骤三:准备数据
使用RDS SQLFlow时,您需要指定机器学习所需的MySQL数据源。
MySQL数据源实例可以是运行于RDS SQLFlow服务端的MySQL,也可以是其他MySQL(例如RDS MySQL)。
本文以RDS SQLFlow服务端的MySQL数据库为例,构建iris数据集并训练TensorFlow的DNNClassifier算法。对于数据量较大、适合以一维数据作为输入且难以探究内部规律的数据集,可以采用DNNClassifier进行分类处理。
本次构建的iris数据集包含四个特征和一个标签。四个特征描述了每株鸢尾花的植物学形态,每个特征均为浮点数。标签代表每株鸢尾花的亚种,为一个整数,其取值范围为0、1或2。在TensorFlow中,特征列是数据中列(columns)与用于训练模型的特征(features)之间的桥梁。TensorFlow提供了多种特征列,详情请参见https://www.tensorflow.org/api_docs/python/tf/feature_column。iris数据集所对应的列信息如下所示:
列名 | 数据类型 | 描述 |
sepal_length | float | 特征之一,花萼长度,单位为cm。 |
sepal_width | float | 特征之一,花萼宽度,单位为cm。 |
petal_length | float | 特征之一,花瓣长度,单位为cm。 |
petal_width | float | 特征之一,花瓣宽度,单位为cm。 |
class | int | 标签,亚种类别,取值为0、1或2。 |
在RDS SQLFlow客户端的SQLFlow命令行界面中,执行以下命令创建机器学习所需的训练数据集和评估数据集。
步骤四:训练模型
在RDS SQLFlow客户端的SQLFlow命令行界面中,执行以下命令以训练一个三分类的DNNClassifier,该模型包含两个隐藏层,每层设有100个节点,底层数值优化器的学习率为0.1,训练周期为10。
CREATE DATABASE IF NOT EXISTS sqlflow_models;
SELECT * FROM iris.train --指定训练数据集为iris.train
TO TRAIN DNNClassifier WITH
model.n_classes = 3, -- 设置分类数为3
model.hidden_units = [100, 100], -- 设置隐藏层单元为两层,各有100个单元
optimizer.learning_rate=0.1, -- 设置学习率为0.1
train.epoch = 10 -- 训练的周期设置为10
COLUMN sepal_length, sepal_width, petal_length, petal_width --指定特征列
LABEL class --指定标签列为class
INTO sqlflow_models.my_dnn_model; -- 将训练好的模型保存到指定的数据表中
步骤五:评估模型
使用iris.test数据集,对训练好的模型
sqlflow_models.my_dnn_model
进行评估,并将评估结果保存至sqlflow_models.evaluate_result_table
中。SELECT * FROM iris.test TO EVALUATE sqlflow_models.my_dnn_model WITH validation.metrics = Accuracy LABEL class INTO sqlflow_models.evaluate_result_table; SELECT * FROM sqlflow_models.evaluate_result_table;
评估结束后,使用如下SQL查看评估结果,可以根据评估结果进行参数调优。
SELECT * FROM sqlflow_models.evaluate_result_table;
返回结果:
+----------------------+----------+ | LOSS | ACCURACY | +----------------------+----------+ | 0.035312581807374954 | 1 | +----------------------+----------+
步骤六:使用模型预测数据
使用模型
sqlflow_models.my_dnn_model
来预测数据,并将结果写到iris.predict
表的class
列,完整的预测语句如下。SELECT * FROM iris.test TO PREDICT iris.predict.class USING sqlflow_models.my_dnn_model;
预测结束后,通过如下SQL查看预测结果。
SELECT * FROM iris.predict LIMIT 5;
返回结果:
+--------------+-------------+--------------+-------------+-------+ | 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 | | 5 | 3 | 1.6 | 0.2 | 0 | | 6.3 | 3.3 | 6 | 2.5 | 2 | | 5 | 3.5 | 1.6 | 0.6 | 0 | +--------------+-------------+--------------+-------------+-------+