操作指南

RDS SQLFlow是一种基于AliSQLAI解决方案,提供完全托管的服务,用于简化机器学习的实现流程。通过内置的机器学习服务和SQL扩展能力,RDS SQLFlow可以快速支持AI业务的发展。它将AliSQLAI引擎连接,使用户只需编写少量SQL代码,就能描述整个应用或产品背后的数据流和AI构造。

步骤一:搭建基于MySQLrds_sqlflow服务

  1. 创建RDS Custom实例,部分参数需按照以下配置进行设置。详细操作请参见创建RDS Custom实例

    • 实例规格中的产品架构选择AI节点

    • 镜像选择默认镜像中的SQLFlow

  2. 使用与RDS Custom实例同一地域、同一VPC下的ECS,通过ssh命令连接到RDS Custom实例。详细操作请参见连接RDS Custom实例

  3. 进入/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节点,并指定机器学习所使用的数据源。

    image

    运行结果:执行如下命令查看脚本运行结果。

    • 运行ps -ef | grep mysql命令,查看MySQL进程的状态。

      image

    • 运行docker ps命令,查看RDS SQLFlow容器状态。

      image

步骤二:通过RDS SQLFlow客户端连接至rds_sqlflow服务

  1. 使用与RDS Custom实例同一地域、同一VPC下的ECS,安装RDS SQLFlow客户端,并为该客户端赋予可执行权限。

    1. 您可以通过如下两种方式,安装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"
    2. 在目标ECS中,赋予RDS SQLFlow文件可执行权限:

      cd /home
      chmod +x sqlflow
    3. 在目标ECS中,新增ca.crt文件,并复制步骤一中生成的TLS证书内容。

      vim ca.crt
  2. 使用步骤一中执行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数据集并训练TensorFlowDNNClassifier算法。对于数据量较大、适合以一维数据作为输入且难以探究内部规律的数据集,可以采用DNNClassifier进行分类处理。

本次构建的iris数据集包含四个特征和一个标签。四个特征描述了每株鸢尾花的植物学形态,每个特征均为浮点数。标签代表每株鸢尾花的亚种,为一个整数,其取值范围为0、12。在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、12。

RDS SQLFlow客户端的SQLFlow命令行界面中,执行以下命令创建机器学习所需的训练数据集和评估数据集。

训练数据集

CREATE DATABASE IF NOT EXISTS iris;
DROP TABLE IF EXISTS iris.train;
CREATE TABLE iris.train (
       sepal_length float,
       sepal_width  float,
       petal_length float,
       petal_width  float,
       class int);
INSERT INTO iris.train VALUES(6.4,2.8,5.6,2.2,2);
INSERT INTO iris.train VALUES(5.0,2.3,3.3,1.0,1);
INSERT INTO iris.train VALUES(4.9,2.5,4.5,1.7,2);
INSERT INTO iris.train VALUES(4.9,3.1,1.5,0.1,0);
INSERT INTO iris.train VALUES(5.7,3.8,1.7,0.3,0);
INSERT INTO iris.train VALUES(4.4,3.2,1.3,0.2,0);
INSERT INTO iris.train VALUES(5.4,3.4,1.5,0.4,0);
INSERT INTO iris.train VALUES(6.9,3.1,5.1,2.3,2);
INSERT INTO iris.train VALUES(6.7,3.1,4.4,1.4,1);
INSERT INTO iris.train VALUES(5.1,3.7,1.5,0.4,0);
INSERT INTO iris.train VALUES(5.2,2.7,3.9,1.4,1);
INSERT INTO iris.train VALUES(6.9,3.1,4.9,1.5,1);
INSERT INTO iris.train VALUES(5.8,4.0,1.2,0.2,0);
INSERT INTO iris.train VALUES(5.4,3.9,1.7,0.4,0);
INSERT INTO iris.train VALUES(7.7,3.8,6.7,2.2,2);
INSERT INTO iris.train VALUES(6.3,3.3,4.7,1.6,1);
INSERT INTO iris.train VALUES(6.8,3.2,5.9,2.3,2);
INSERT INTO iris.train VALUES(7.6,3.0,6.6,2.1,2);
INSERT INTO iris.train VALUES(6.4,3.2,5.3,2.3,2);
INSERT INTO iris.train VALUES(5.7,4.4,1.5,0.4,0);
INSERT INTO iris.train VALUES(6.7,3.3,5.7,2.1,2);
INSERT INTO iris.train VALUES(6.4,2.8,5.6,2.1,2);
INSERT INTO iris.train VALUES(5.4,3.9,1.3,0.4,0);
INSERT INTO iris.train VALUES(6.1,2.6,5.6,1.4,2);
INSERT INTO iris.train VALUES(7.2,3.0,5.8,1.6,2);
INSERT INTO iris.train VALUES(5.2,3.5,1.5,0.2,0);
INSERT INTO iris.train VALUES(5.8,2.6,4.0,1.2,1);
INSERT INTO iris.train VALUES(5.9,3.0,5.1,1.8,2);
INSERT INTO iris.train VALUES(5.4,3.0,4.5,1.5,1);
INSERT INTO iris.train VALUES(6.7,3.0,5.0,1.7,1);
INSERT INTO iris.train VALUES(6.3,2.3,4.4,1.3,1);
INSERT INTO iris.train VALUES(5.1,2.5,3.0,1.1,1);
INSERT INTO iris.train VALUES(6.4,3.2,4.5,1.5,1);
INSERT INTO iris.train VALUES(6.8,3.0,5.5,2.1,2);
INSERT INTO iris.train VALUES(6.2,2.8,4.8,1.8,2);
INSERT INTO iris.train VALUES(6.9,3.2,5.7,2.3,2);
INSERT INTO iris.train VALUES(6.5,3.2,5.1,2.0,2);
INSERT INTO iris.train VALUES(5.8,2.8,5.1,2.4,2);
INSERT INTO iris.train VALUES(5.1,3.8,1.5,0.3,0);
INSERT INTO iris.train VALUES(4.8,3.0,1.4,0.3,0);
INSERT INTO iris.train VALUES(7.9,3.8,6.4,2.0,2);
INSERT INTO iris.train VALUES(5.8,2.7,5.1,1.9,2);
INSERT INTO iris.train VALUES(6.7,3.0,5.2,2.3,2);
INSERT INTO iris.train VALUES(5.1,3.8,1.9,0.4,0);
INSERT INTO iris.train VALUES(4.7,3.2,1.6,0.2,0);
INSERT INTO iris.train VALUES(6.0,2.2,5.0,1.5,2);
INSERT INTO iris.train VALUES(4.8,3.4,1.6,0.2,0);
INSERT INTO iris.train VALUES(7.7,2.6,6.9,2.3,2);
INSERT INTO iris.train VALUES(4.6,3.6,1.0,0.2,0);
INSERT INTO iris.train VALUES(7.2,3.2,6.0,1.8,2);
INSERT INTO iris.train VALUES(5.0,3.3,1.4,0.2,0);
INSERT INTO iris.train VALUES(6.6,3.0,4.4,1.4,1);
INSERT INTO iris.train VALUES(6.1,2.8,4.0,1.3,1);
INSERT INTO iris.train VALUES(5.0,3.2,1.2,0.2,0);
INSERT INTO iris.train VALUES(7.0,3.2,4.7,1.4,1);
INSERT INTO iris.train VALUES(6.0,3.0,4.8,1.8,2);
INSERT INTO iris.train VALUES(7.4,2.8,6.1,1.9,2);
INSERT INTO iris.train VALUES(5.8,2.7,5.1,1.9,2);
INSERT INTO iris.train VALUES(6.2,3.4,5.4,2.3,2);
INSERT INTO iris.train VALUES(5.0,2.0,3.5,1.0,1);
INSERT INTO iris.train VALUES(5.6,2.5,3.9,1.1,1);
INSERT INTO iris.train VALUES(6.7,3.1,5.6,2.4,2);
INSERT INTO iris.train VALUES(6.3,2.5,5.0,1.9,2);
INSERT INTO iris.train VALUES(6.4,3.1,5.5,1.8,2);
INSERT INTO iris.train VALUES(6.2,2.2,4.5,1.5,1);
INSERT INTO iris.train VALUES(7.3,2.9,6.3,1.8,2);
INSERT INTO iris.train VALUES(4.4,3.0,1.3,0.2,0);
INSERT INTO iris.train VALUES(7.2,3.6,6.1,2.5,2);
INSERT INTO iris.train VALUES(6.5,3.0,5.5,1.8,2);
INSERT INTO iris.train VALUES(5.0,3.4,1.5,0.2,0);
INSERT INTO iris.train VALUES(4.7,3.2,1.3,0.2,0);
INSERT INTO iris.train VALUES(6.6,2.9,4.6,1.3,1);
INSERT INTO iris.train VALUES(5.5,3.5,1.3,0.2,0);
INSERT INTO iris.train VALUES(7.7,3.0,6.1,2.3,2);
INSERT INTO iris.train VALUES(6.1,3.0,4.9,1.8,2);
INSERT INTO iris.train VALUES(4.9,3.1,1.5,0.1,0);
INSERT INTO iris.train VALUES(5.5,2.4,3.8,1.1,1);
INSERT INTO iris.train VALUES(5.7,2.9,4.2,1.3,1);
INSERT INTO iris.train VALUES(6.0,2.9,4.5,1.5,1);
INSERT INTO iris.train VALUES(6.4,2.7,5.3,1.9,2);
INSERT INTO iris.train VALUES(5.4,3.7,1.5,0.2,0);
INSERT INTO iris.train VALUES(6.1,2.9,4.7,1.4,1);
INSERT INTO iris.train VALUES(6.5,2.8,4.6,1.5,1);
INSERT INTO iris.train VALUES(5.6,2.7,4.2,1.3,1);
INSERT INTO iris.train VALUES(6.3,3.4,5.6,2.4,2);
INSERT INTO iris.train VALUES(4.9,3.1,1.5,0.1,0);
INSERT INTO iris.train VALUES(6.8,2.8,4.8,1.4,1);
INSERT INTO iris.train VALUES(5.7,2.8,4.5,1.3,1);
INSERT INTO iris.train VALUES(6.0,2.7,5.1,1.6,1);
INSERT INTO iris.train VALUES(5.0,3.5,1.3,0.3,0);
INSERT INTO iris.train VALUES(6.5,3.0,5.2,2.0,2);
INSERT INTO iris.train VALUES(6.1,2.8,4.7,1.2,1);
INSERT INTO iris.train VALUES(5.1,3.5,1.4,0.3,0);
INSERT INTO iris.train VALUES(4.6,3.1,1.5,0.2,0);
INSERT INTO iris.train VALUES(6.5,3.0,5.8,2.2,2);
INSERT INTO iris.train VALUES(4.6,3.4,1.4,0.3,0);
INSERT INTO iris.train VALUES(4.6,3.2,1.4,0.2,0);
INSERT INTO iris.train VALUES(7.7,2.8,6.7,2.0,2);
INSERT INTO iris.train VALUES(5.9,3.2,4.8,1.8,1);
INSERT INTO iris.train VALUES(5.1,3.8,1.6,0.2,0);
INSERT INTO iris.train VALUES(4.9,3.0,1.4,0.2,0);
INSERT INTO iris.train VALUES(4.9,2.4,3.3,1.0,1);
INSERT INTO iris.train VALUES(4.5,2.3,1.3,0.3,0);
INSERT INTO iris.train VALUES(5.8,2.7,4.1,1.0,1);
INSERT INTO iris.train VALUES(5.0,3.4,1.6,0.4,0);
INSERT INTO iris.train VALUES(5.2,3.4,1.4,0.2,0);
INSERT INTO iris.train VALUES(5.3,3.7,1.5,0.2,0);
INSERT INTO iris.train VALUES(5.0,3.6,1.4,0.2,0);
INSERT INTO iris.train VALUES(5.6,2.9,3.6,1.3,1);
INSERT INTO iris.train VALUES(4.8,3.1,1.6,0.2,0);

评估数据集

DROP TABLE IF EXISTS iris.test;
CREATE TABLE iris.test (
       sepal_length float,
       sepal_width  float,
       petal_length float,
       petal_width  float,
       class int);
INSERT INTO iris.test VALUES(6.3,2.7,4.9,1.8,2);
INSERT INTO iris.test VALUES(5.7,2.8,4.1,1.3,1);
INSERT INTO iris.test VALUES(5.0,3.0,1.6,0.2,0);
INSERT INTO iris.test VALUES(6.3,3.3,6.0,2.5,2);
INSERT INTO iris.test VALUES(5.0,3.5,1.6,0.6,0);
INSERT INTO iris.test VALUES(5.5,2.6,4.4,1.2,1);
INSERT INTO iris.test VALUES(5.7,3.0,4.2,1.2,1);
INSERT INTO iris.test VALUES(4.4,2.9,1.4,0.2,0);
INSERT INTO iris.test VALUES(4.8,3.0,1.4,0.1,0);
INSERT INTO iris.test VALUES(5.5,2.4,3.7,1.0,1);

步骤四:训练模型

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;  -- 将训练好的模型保存到指定的数据表中 

步骤五:评估模型

  1. 使用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;
  2. 评估结束后,使用如下SQL查看评估结果,可以根据评估结果进行参数调优。

    SELECT * FROM sqlflow_models.evaluate_result_table;

    返回结果:

    +----------------------+----------+
    |         LOSS         | ACCURACY |
    +----------------------+----------+
    | 0.035312581807374954 |        1 |
    +----------------------+----------+

步骤六:使用模型预测数据

  1. 使用模型sqlflow_models.my_dnn_model来预测数据,并将结果写到iris.predict表的class列,完整的预测语句如下。

    SELECT * FROM iris.test 
    TO PREDICT iris.predict.class 
    USING sqlflow_models.my_dnn_model;
  2. 预测结束后,通过如下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 |
    +--------------+-------------+--------------+-------------+-------+

相关文档

RDS Custom简介