亚马逊AWS官方博客

向 Amazon Aurora 添加实时机器学习预测:第 1 部分

Original URL: https://aws.amazon.com/blogs/database/part-1-adding-real-time-machine-learning-predictions-to-amazon-aurora/

如今,企业需要改善存储在其关系数据库中的数据,并整合来自机器学习(ML,Machine Learning)模型的最新预测。但是,大多数机器学习处理是在独立的系统中脱机完成的,这会导致延迟接收用于应用程序的机器学习推理。AWS 希望能够高效地将实时模型推理整合到您的应用程序中,而无需进行任何机器学习训练。在本博文中,我们使用了两种 AWS 服务。 Amazon Aurora 是一款专为云而构建的关系数据库管理系统(RDBMS,Relational Database Management System),可兼容 MySQL 和 PostgreSQL。利用 Aurora,您可以十分之一的成本获得商业级数据库的性能和可用性。 Amazon SageMaker Autopilot 是一种自动机器学习(AutoML)解决方案,可以执行完成端到端机器学习工作流所需的所有任务。它将探索和准备您的数据,应用不同的算法来生成模型,并以透明方式提供模型见解和可解释性报告来帮助您解释结果。Autopilot 还可以创建用于联机推理的实时端点。我们可以在 Amazon SageMaker Studio 中或使用 API、SDK 或命令行界面访问 Autopilot 的一键式功能。 Amazon Aurora 机器学习(Aurora ML)是 Aurora 的一项功能,可让您在没有机器学习经验的情况下通过熟悉的 SQL 编程语言向应用程序添加基于机器学习的预测。它提供 Aurora 和 AWS ML 服务之间的简单、优化和安全的集成,而无需构建自定义集成或移动数据。Aurora ML 提供了一种更快、更简单的方式,使机器学习服务能够处理 Aurora 数据库中的数据。由于 Aurora 直接调用 Amazon SageMaker,因此 Aurora ML 适用于低延迟的实时使用案例,例如欺诈检测、广告定位和产品推荐,在这些使用案例中,需要对大量数据快速做出基于机器学习的预测。

在本系列的第 1 部分中,我们将向您说明如何使用 Autopilot 构建客户流失机器学习模型,以便您能够在没有任何机器学习经验的情况下自行生成准确的机器学习预测。我们将向您说明如何使用来自 Aurora 集群的熟悉的 SQL 语句调用 SageMaker 端点以预测客户流失。现在,可以使用 SQL 访问这些预测,就像存储在 Aurora 中的任何其他数据一样。在第 2 部分中,我们将讨论如何实施性能优化以获得实时数据推理。

解决方案概览

在本博文中,我们代入了一位在无线提供商处工作的具有 SQL 专业知识的数据分析师角色。我们的任务是辨别有可能转而使用其他提供商的服务的客户(客户流失)。我们可以访问存储在 Aurora 中的汇总和匿名化服务使用情况和其他客户行为数据。我们需要知道此类数据是否能帮助解释客户丢失的原因。如果我们能够找出解释客户流失的因素,那么无线提供商就可以采取纠正措施来改变预测的行为,例如开展有针对性的客户保留活动。

首先,我们将识别 Aurora 数据库中的数据,将该数据导出到 Amazon Simple Storage Service(Amazon S3),并使用该数据在 SageMaker 中设置 Autopilot 实验,以便自动处理数据、训练客户流失模型并将模型部署到端点。之后,我们在 Aurora 中创建一个函数来调用端点并从 Aurora 数据库实时生成预测。下图展示了此工作流。

  1. 在 Aurora 集群上识别数据集并将数据移至 S3 存储桶
  2. 使用带导入数据集的 SageMaker Autopilot 创建机器学习模型
  3. 选择最佳的机器学习模型并部署 SageMaker 端点
  4. 将 Aurora 与 SageMaker 集成
  5. 使用 SageMaker 端点创建 SQL 函数
  6. 通过 SQL 查询调用 SageMaker 端点

在 Aurora 集群上识别数据集

如果您希望将 Aurora 集群中的现有数据集用作模型的基础,则可以考虑连接到 Amazon SageMaker Data Wrangler 来进行一些专家级策划和特征工程,然后使用 Autopilot 训练模型以获得准确推理。要使用 Aurora 集群中的现有数据集,请跳至下一部分:将 Aurora 数据移至 S3 存储桶

如果您想使用已预处理的测试数据集,请参阅以下步骤,它们说明了如何将数据集加载到 Amazon Aurora MySQL 兼容版集群中,然后使 SageMaker 能够创建机器学习模型。我们可以创建 AWS Cloud9 实例或设置 AWS 命令行界面(AWS CLI)以访问 AWS 资源。有关更多信息,请相应地参阅设置 AWS Cloud9设置 AWS 命令行界面(AWS CLI)。在本博文中,我们使用的是 AWS Cloud9 实例。有关定价,请参阅 AWS Cloud9 定价

标准定价将适用于已使用的所有 AWS 资源。对于 Aurora 数据库,您将需要支付 I/O、计算和存储费用。有关完整定价,请参阅 Amazon Aurora 定价。您需要为 S3 存储桶中存储的对象、由 SageMaker Autopilot 使用的基础计算和存储资源以及部署的端点付费。有关完整定价,请参阅 Amazon SageMaker 定价

我们的 Aurora 集群需设置为使用 LOAD DATA FROM S3,然后我们运行以下 SQL 查询来创建 mltest 数据库和一个包含用于预测客户流失的客户特征(列)的表。

  1. 连接到 Aurora MySQL 集群,以下是示例命令:
    mysql -h database-aurora-ml.cluster-xxxxxxx.us-west-2.rds.amazonaws.com -u admin -P 3306 -p
  2. 创建测试数据库:
    create database mltest;
  3. 创建示例表以加载数据:
    use mltest;
    
    CREATE TABLE `churn` (
    `state` varchar(2048) DEFAULT NULL,
    `acc_length` bigint(20) DEFAULT NULL,
    `area_code` bigint(20) DEFAULT NULL,
    `int_plan` varchar(2048) DEFAULT NULL,
    `phone` varchar(1000) NOT NULL,
    `vmail_plan` varchar(2048) DEFAULT NULL,
    `vmail_msg` bigint(20) DEFAULT NULL,
    `day_mins` double DEFAULT NULL,
    `day_calls` bigint(20) DEFAULT NULL,
    `day_charge` bigint(20) DEFAULT NULL,
    `eve_mins` double DEFAULT NULL,
    `eve_calls` bigint(20) DEFAULT NULL,
    `eve_charge` bigint(20) DEFAULT NULL,
    `night_mins` double DEFAULT NULL,
    `night_calls` bigint(20) DEFAULT NULL,
    `night_charge` bigint(20) DEFAULT NULL,
    `int_mins` double DEFAULT NULL,
    `int_calls` bigint(20) DEFAULT NULL,
    `int_charge` bigint(20) DEFAULT NULL,
    `cust_service_calls` bigint(20) DEFAULT NULL,
    `Churn` varchar(2048) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  4. 运行 LOAD DATA FROM S3,将数据从 SageMaker 示例 S3 存储桶加载到 Aurora MySQL 集群:
    LOAD DATA FROM S3 's3-us-east-1://sagemaker-sample-files/datasets/tabular/synthetic/churn.txt'
    INTO TABLE `churn`
    COLUMNS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES
    (state,acc_length,area_code,phone,int_plan,vmail_plan,vmail_msg,day_mins,
    day_calls,day_charge,eve_mins,eve_calls,eve_charge,night_mins,night_calls,
    night_charge,int_mins,int_calls,int_charge,cust_service_calls,Churn);

将 Aurora 数据移至 S3 存储桶

此时,无论您使用的是我们的测试数据还是您自己的数据,Aurora 中现在都有一个数据集,我们需要使用它来创建机器学习模型。因此,我们首先必须将数据加载到 S3,这样 SageMaker 才能访问这些数据。要加载数据,我们可以使用 SELECT INTO OUTFILE S3 语句从 Aurora MySQL 数据库集群查询数据,并将数据直接保存到存储在 S3 存储桶中的文本文件中。

我们必须先向 Aurora MySQL 数据库集群授予对 Amazon S3 的访问权限,然后才能将数据保存到 S3 存储桶。设置权限后,我们运行以下命令来将数据加载到 Amazon S3:

mysql> select count(*) from churn;
+----------+
| count(*) |
+----------+
| 5000 |
+----------+
1 row in set (0.03 sec)

SELECT * INTO OUTFILE S3 's3-region://bucket-name/file-prefix' FORMAT CSV HEADER FROM churn;

请参阅以下示例

mysql> SELECT * INTO OUTFILE S3 's3-us-west-2://aws-sagemaker-aurora-bucket-1/churn.txt' FORMAT CSV HEADER FROM churn;
Query OK, 5001 rows affected (0.25 sec)

使用带导入数据集的 Autopilot 创建机器学习模型

现在,S3 存储桶中的数据已准备就绪,让我们向 Autopilot 提供数据的 S3 路径以创建和自动训练机器学习模型。

  1. 使用 Amazon SageMaker Studio 启动器启动 Autopilot。
  2. 创建 Autopilot 实验
  3. Experiment and data details(实验和数据详细信息)选项卡中提供所需的设置并从 Amazon S3 存储桶导入流失数据集。
    Autopilot 支持不同的训练模型和算法来解决机器学习问题。
  4. Training Method(训练方法)选项卡上,选择 Auto(自动),这将允许 Autopilot 根据您的数据集大小选择集成或超参数优化(HPO)
  5. Deployment and Advanced settings(部署和高级设置)选项卡上,您可以选择 Auto deploy(自动部署)来自动部署 SageMaker 端点。
  6. Review and create(查看并创建)选项卡上,查看您提供的所有设置,然后选择 Create experiment(创建实验)。

在 Autopilot 开始实验后,该服务会自动检查原始输入数据,应用特征处理器并选取最佳潜在算法。在该服务选择算法后,Autopilot 会使用超参数优化搜索过程来优化其性能。这通常称为训练和调整模型。最终,这将帮助生成一个模型,该模型能够准确地预测从未见过的数据。Autopilot 自动跟踪模型性能,然后根据机器学习问题的类型,按准确度、F1 分数、精度和召回率等指标对最终模型进行排名。在此情况下,我们重点关注 F1 分数,因为我们要对客户是否丢失进行分类(二进制分类)。

选择最佳的机器学习模型并部署 SageMaker 端点

如果您在上一步中没有选择 Auto deploy(自动部署)选项,则可以选择部署任意已排名的模型。您可以通过选择模型(右键单击)并选择 Deploy model(部署模型),或通过在排名列表中选择最佳模型并选择 Deploy model(部署模型)来完成此操作。

在我们设置模型端点之后,下一步是将 Aurora 与 SageMaker 端点集成,以使用 SQL 命令推断数据集中的客户流失情况。

将 Aurora 与 SageMaker 集成

Aurora 可以直接安全地调用 SageMaker,而无需通过应用程序层。我们需要先通过配置 AWS Identity and Access Management(IAM)角色来使 Aurora MySQL 集群能够访问 AWS ML,之后才能通过 Aurora 访问 SageMaker。有关更多信息,请参阅设置对 SageMaker 的 IAM 访问。此角色向我们的 Aurora MySQL 数据库的用户授予对 AWS ML 服务的访问权限。

要设置 Aurora 与 SageMaker 的集成,请完成以下步骤:

  1. 创建 IAM policy。
    以下策略添加 Aurora MySQL 代表我们调用 SageMaker 函数所需的权限。我们可以在单个策略中指定要从 Aurora MySQL 集群访问的所有 SageMaker 端点。该策略还允许我们为 SageMaker 端点指定 AWS 区域。但是,Aurora MySQL 集群只能调用已在与集群相同的区域中部署的 SageMaker 模型。将区域、AWS 账户 ID 和 SageMaker 端点名称添加到策略中。将以下策略保存到 JSON 文件中。

    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Sid": "AllowAuroraToInvokeRCFEndPoint",
    "Effect": "Allow",
    "Action": "sagemaker:InvokeEndpoint",
    "Resource": "arn:aws:sagemaker:region:123456789012:endpoint/endpointName"
    }
    ]
    }
  2. 我们在创建 IAM policy 后,创建一个 IAM 角色,Aurora MySQL 集群可以代表我们的数据库用户代入该角色来访问 ML 服务。以下 create-role 命令创建一个名为 auroraml-sagemaker-access 的角色:
    aws iam create-role \
    --role-name auroraml-sagemaker-access \
    --assume-role-policy-document "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"rds.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
  3. 运行以下命令,将我们创建的策略附加到新角色:
    aws iam put-role-policy \
    --role-name auroraml-sagemaker-access --policy-name inline-policy \
    --policy-document file://sagemaker-policy.json

  4. 将 IAM 角色与 Aurora 数据库集群关联:
    aws rds add-role-to-db-cluster \
    --db-cluster-identifier database-aurora-ml \
    --role-arn $(aws iam list-roles --query 'Roles[?RoleName==`auroraml-sagemaker-access`].Arn' --output text)

  5. 创建自定义数据库集群参数组,以允许数据库用户通过 aws_default_sagemaker_role 参数访问 SageMaker 端点。
    aws rds create-db-cluster-parameter-group \
    --db-cluster-parameter-group-name aurora-ml-db-cluster-parameter-group \
    --db-parameter-group-family aurora-mysql8.0 \
    --description "My Aurora ML cluster parameter group"
  6. 将我们创建的自定义集群参数组 aurora-ml-db-cluster-parameter-group 附加到 Aurora 集群:
    aws rds modify-db-cluster \
    --db-cluster-identifier database-aurora-ml \
    --db-cluster-parameter-group-name aurora-ml-db-cluster-parameter-group
  7. 验证集群是否可用,然后将 IAM 角色 auroraml-sagemaker-access ARN 设置为自定义数据库集群参数组中的参数 aws_default_sagemaker_role,然后将其应用于集群。
    aws rds modify-db-cluster-parameter-group \
    --db-cluster-parameter-group-name aurora-ml-db-cluster-parameter-group \
    --parameters "ParameterName=aws_default_sagemaker_role,ParameterValue=$(aws iam list-roles --query 'Roles[?RoleName==`auroraml-sagemaker-access`].Arn' --output text),ApplyMethod=pending-reboot"

    如果首次附加自定义集群参数组,则需要手动重新启动集群中的所有节点。如果它是单节点集群,请重新启动写入器实例以应用更改。只有在我们手动重新启动每个关联的数据库集群中的数据库实例后,参数更改才会生效。由于我们附加的是自定义集群参数组 aurora-ml-db-cluster-parameter-group,因此,我们对多可用区集群执行失效转移,从而重新启动写入器和读取器节点。

  8. 对集群进行失效转移以应用自定义数据库集群参数组的更改:
    aws rds failover-db-cluster --db-cluster-identifier database-aurora-ml
  9. 验证集群参数组是否已应用并显示同步状态。
    aws rds describe-db-clusters \
    --db-cluster-identifier <DB cluster identifier> \
    --query 'DBClusters[*].DBClusterMembers'
    

    请参阅以下示例:

    aws rds describe-db-clusters --db-cluster-identifier database-aurora-ml --query 'DBClusters[*].DBClusterMembers'
    [
        [
            {
                "DBInstanceIdentifier": "reader",
                "IsClusterWriter": false,
                "DBClusterParameterGroupStatus": "in-sync",
                "PromotionTier": 1
            },
            {
                "DBInstanceIdentifier": "database-1-instance-1",
                "IsClusterWriter": true,
                "DBClusterParameterGroupStatus": "in-sync",
                "PromotionTier": 1
            }
        ]
    ]

使用 SageMaker 端点在 Aurora 中创建 SQL 函数

  1. 连接到 Aurora MySQL 集群并切换到我们之前创建的 mltest 数据库:
    mysql> use mltest;
    Database changed
  2. 使用您在上一步中创建的 SageMaker 端点,通过以下命令创建 SQL 函数:
    CREATE FUNCTION `will_churn`(
    state varchar(2048),
    acc_length bigint(20),
    area_code bigint(20),
    phone varchar(1000),
    int_plan varchar(2048),
    vmail_plan varchar(2048),
    vmail_msg bigint(20),
    day_mins double,
    day_calls bigint(20),
    day_charge bigint(20),
    eve_mins double,
    eve_calls bigint(20),
    eve_charge bigint(20),
    night_mins double,
    night_calls bigint(20),
    night_charge bigint(20),
    int_calls bigint(20),
    int_charge bigint(20),
    cust_service_calls bigint(20)
    ) RETURNS varchar(2048) CHARSET latin1
    alias aws_sagemaker_invoke_endpoint
    endpoint name '<SageMaker endpoint>';

使用 SQL 查询从 Aurora 调用 SageMaker 端点

现在我们已有一个链接回 SageMaker 端点的集成函数,数据库集群可以将值传递给 SageMaker 并检索推断。在以下示例中,我们将流失表中的值作为函数输入提交,以确定特定客户是否将流失。这将由 Will Churn? 列中的 TrueFalse 结果表示。

mysql> SELECT will_churn('IN',65,415,'329-6603','no','no',0,129.1,137,21.95,228.5,83,
19.42,208.8,111,9.4,12.7,6,3.43,4) AS'Will Churn?';
+-------------+
| Will Churn? |
+-------------+
| False.      |
+-------------+
1 row in set (0.06 sec)

mysql>  SELECT c.state,c.acc_length,c.area_code, c.int_plan,c.phone, will_churn('c.state',c.acc_length,c.area_code,'c.int_plan','c.phone',
'c.vmail_plan',c.vmail_msg,c.day_mins,c.day_calls,c.day_charge,c.eve_mins,
c.eve_calls,c.eve_charge,c.night_mins,c.night_calls,c.night_charge,
c.int_mins,c.int_calls,c.int_charge,c.cust_service_calls) AS 'Will Churn?' from churn  as c limit 5;

+-------+------------+-----------+----------+----------+-------------+
| state | acc_length | area_code | int_plan | phone    | Will Churn? |
+-------+------------+-----------+----------+----------+-------------+
| OK    |        112 |       415 | no       | 327-1058 | False.      |
| CO    |         22 |       510 | no       | 327-1319 | False.      |
| AZ    |         87 |       510 | no       | 327-3053 | False.      |
| UT    |        103 |       510 | no       | 327-3587 | True.       |
| SD    |         91 |       510 | no       | 327-3850 | False.      |
+-------+------------+-----------+----------+----------+-------------+

清理

此解决方案中涉及的服务会产生费用。使用完此解决方案后,请清理以下资源:

结论

在本博文中,我们已了解如何使用 Autopilot 构建客户流失机器学习模型,以及如何从 Aurora 集群调用 SageMaker 端点。现在,我们可以使用 SQL 实时从 SageMaker 端点获取机器学习推理。您可以在企业的客户保留活动中使用这些关于客户流失的推理。

请继续关注本系列的第 2 部分,在该部分中,我们将讨论如何实施 Aurora ML 性能优化,以便访问实时数据的模型推理。


关于作者

Adarsha Kuthuru 是 Amazon Web Services 的数据库专家级解决方案架构师。她与客户合作,在 AWS Cloud 中设计可扩展、高度可用且安全的解决方案。工作之余,她喜欢画画、看书或在太平洋西北地区徒步。

Mani Khanuja 是 Amazon Web Services(AWS)的人工智能和机器学习专家 SA。她帮助客户使用机器学习来解决他们在 AWS 方面的业务挑战。她将大部分时间花在深入研究和指导客户实施与计算机视觉、自然语言处理、预测、边缘机器学习等相关的人工智能/机器学习项目上。她热衷于边缘机器学习。她使用自动驾驶套件和原型制造生产线创建了自己的实验室,并在那里度过了很多空闲时间。