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参数说明:
参数
说明
-PRDS SQLFlow容器中在主机上映射的端口,默认为50054。
-u创建的MySQL的用户名,默认为aliyun_rds。
-p创建的MySQL的用户密码,未指定时将随机生成。
输出结果:
-
TLS证书。请复制证书内容,并将其在客户端保存为ca.crt文件。
-
客户端连接命令。通过该命令,可以连接至RDS SQLFlow节点,并指定机器学习所使用的数据源。
Save the following content as ca.crt on the client: -----BEGIN CERTIFICATE----- xxx -----END CERTIFICATE----- Connect to SQLFlow with the following command: sqlflow -c ca.crt -d'mysql://aliyun_rds:aliyun_rds@tcp(172.xxx.xxx.xxx:3306)/mysql?maxAllowedPacket=0' -s172.xxx.xxx.xxx:xxx:50054 Also, you can change the mysql config to connect with your own mysql.运行结果:执行如下命令查看脚本运行结果。
-
运行
ps -ef | grep mysql命令,查看MySQL进程的状态。[root@rc-xxx script]# ps -ef | grep mysql mysql 22669 1 0 09:52 ? 00:00:02 /home/u01/mysql80_current/bin/mysqld --defaults-file=/etc/my.cnf root 22811 21833 0 09:57 pts/0 00:00:00 grep --color=auto mysql -
运行
docker ps命令,查看RDS SQLFlow容器状态。[root@rc-xxx script]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS b8af67093420 rds-sqlflow:latest "bash /start.sh" About a minute ago Up About a minute 50051/tcp, 0.0.0.0:50054->50052/tcp, [::]:50054->50052/tcp
-
步骤二:通过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 | +--------------+-------------+--------------+-------------+-------+