在 Amazon SageMaker 上部署分析模型
1. Amazon SageMaker 简介
Amazon SageMaker 是一项完全托管的服务,它使数据科学家能够在任何规模下构建、训练和部署机器学习模型。它基于 Jupyter Notebook,开发者可以使用熟悉的用户界面来构建自己的分析。SageMaker 的基本概念与 Azure ML 相同,我们可以通过 Python API 在 Jupyter 上构建分析和训练集群,然后部署可以通过 REST API 调用的机器学习即服务(MaaS)。此外,SageMaker 还支持使用基础模型在已有的预训练模型上进行开发。
SageMaker Studio 是一个完整的平台,能够管理整个模型生命周期的开发,包括数据管理、模型开发、训练或微调、实验跟踪和交付。
使用 Azure ML 服务开发分析模型的基本步骤如下:
1. 准备数据
2. 使用丰富的工具(如 Jupyter Notebook)开发模型
3. 利用 Azure ML 的计算能力训练和测试模型
4. 部署 MaaS
当模型作为 Web 服务时,我们可以从不同的来源(如 AWS IoT Analytics)调用它,并将其集成到我们的业务流程中。
2. 访问 SageMaker Studio
在开始操作之前,我们需要启动 SageMaker Studio。从 AWS 门户搜索 SageMaker 并点击进入,具体步骤如下:
1. 从 AWS 门户搜索 SageMaker 并点击。
2. SageMaker 需要设置一个域,对于本次练习,我们可以为单个用户设置 SageMaker。在下一步中,为工作室提供一个有效的名称,并仅启用所需的应用程序。
3. 对于本次实验,我们不需要高级数据管理和自动机器学习(AutoML)。
4. 最后,进行审核,从左侧菜单点击“Studio | Open Studio”。
3. 准备 S3 存储桶来存储数据
在开发 AI 模型时,将数据组织在一个单一的存储库中是一个很好的做法。在继续之前,建议创建一个 S3 存储桶,上传数据并授予 SageMaker 对该存储桶的访问权限。具体操作步骤如下:
1. 从 AWS S3 门户搜索 S3。
2. 创建一个名为“iiotbook-data”的 S3 存储桶。
3. 上传
windturbine.csv
文件,该文件可以在官方存储库中找到。从存储桶中点击“Create”,找到“Objects”选项卡,然后点击“Upload”。
4. 最后,从 SageMaker 的左侧菜单找到刚刚创建的域,并启用对 S3 存储桶的访问。
4. 使用 SageMaker 开发数字孪生模型
我们的目标是复制之前使用 Azure ML 创建风力涡轮机数字孪生的实验,但这次使用 SageMaker。构建分析的步骤如下:
1. 从 Amazon S3 存储桶下载数据集。
2. 在 SageMaker Studio 中创建一个新的笔记本实例。
3. 通过笔记本探索数据集,并创建训练数据和测试数据集。
4. 使用 SageMaker 分布式计算架构训练模型。
5. 将模型托管在 SageMaker 管理的托管基础设施中,并公开推理端点。
6. 测试端点,并将模型的端点连接到数据源。
4.1 步骤 1:问题陈述、环境和数据集
问题陈述是根据真实数据集构建风力涡轮机的替代模型。我们首先要启动开发环境,具体操作如下:
1. 启动一个新的 Jupyter 笔记本实例,点击“JupyterLab | Create JupyterLab space”并提供一个名称。
2. SageMaker 会询问运行训练的实例,对于本次练习,建议使用
t3.medium
大小,但也可以利用 GPU 支持。
3. 点击“Open JupyterLab”,将被重定向到熟悉的 Jupyter 环境。打开一个新的 Jupyter 笔记本,并安装
s3fs
包以访问 S3 存储桶,在新单元格中复制并执行以下命令:
%pip install s3fs
需要注意的是,Jupyter 允许使用
%
和
!
魔法命令进行安装和 Bash 执行,安装后不要忘记重启内核。
4.2 步骤 2:探索性数据分析(EDA)
现在我们可以可视化数据。在笔记本的新单元格中添加以下代码并执行:
import pandas as pd
input_data = "s3://iiotbook-data/wind_turbine.csv"
df = pd.read_csv(input_data)
df.iloc[0:30].plot()
4.3 步骤 3:使用 SageMaker 构建模型
为了构建模型,我们可以重用之前开发的代码。从 SageMaker 中,转到“Studio | Notebooks”,复制并粘贴以下代码,然后运行单元格:
import pandas as pd
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split
train_df, test_df = train_test_split(
df,
test_size=0.3,
)
y_train = train_df.pop("power_generated_kw")
X_train = train_df.values
y_test = test_df.pop("power_generated_kw")
X_test = test_df.values
reg = GradientBoostingRegressor(
n_estimators=n_estimators
)
reg.fit(X_train, y_train)
y_pred = reg.predict(X_test)
print(r2_score(y_test, y_pred))
预期输出约为 0.9324,模型性能良好,我们可以在完整数据集上完全训练模型并部署它。我们可以使用
sagemaker.sklearn.estimator.SKLearn
来实现这一目标。在新单元格中添加以下代码将数据发送到 SageMaker 会话:
PREFIX = "wind-turbine"
WORK_DIRECTORY = "data"
import sagemaker, os
sagemaker_session = sagemaker.Session()
os.makedirs(WORK_DIRECTORY, exist_ok=True)
df.to_csv("{}/{}.csv".format(WORK_DIRECTORY, PREFIX), index=False)
train_input = sagemaker_session.upload_data(
WORK_DIRECTORY, key_prefix="{}/{}".format(PREFIX, WORK_DIRECTORY)
)
接下来,我们需要定义训练脚本,训练脚本是一个 Python 文件,包含以下方法:
-
__main__
:用于训练的方法。
-
model_fn(model_dir)
:用于加载模型的方法。
-
predict_fn(input_data, model)
:用于执行预测的方法。
SageMaker 还自定义了请求的序列化和反序列化,但在本次练习中,我们使用默认方法:
-
output_fn(prediction, response_content_type)
:用于序列化预测结果的方法。
-
input_fn(request_body, request_content_type)
:用于反序列化请求的方法。
在新单元格中添加以下代码实现训练方法:
%%writefile wind_turbine.py
from __future__ import print_function
import argparse, joblib, os
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import r2_score
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# 超参数设置,这里仅包含一个超参数
parser.add_argument('--n-estimators', type=int, default=-1)
# SageMaker 特定参数,默认值设置在环境变量中
parser.add_argument('--output-data-dir', type=str, default=os.environ['SM_OUTPUT_DATA_DIR'])
parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAIN'])
args = parser.parse_args()
input_files = [ os.path.join(args.train, file) for file in os.listdir(args.train) if file.endswith(".csv") ]
raw_data = [ pd.read_csv(file, engine="python") for file in input_files ]
train_df = pd.concat(raw_data)
# 训练代码
# ...
# 保存模型
joblib.dump(reg, os.path.join(args.model_dir, "model.joblib"))
def model_fn(model_dir):
return joblib.load(os.path.join(model_dir, "model.joblib"))
def predict_fn(input_data, model):
if len(input_data.shape) < 2:
input_data = input_data.reshape(-1, 1)
prediction = model.predict(input_data)
return np.array(prediction)
现在可以使用以下代码提交作业:
from sagemaker.sklearn.estimator import SKLearn
from sagemaker import get_execution_role
sklearn = SKLearn(
entry_point= "wind_turbine.py",
framework_version= "1.2-1",
instance_type="ml.c4.xlarge",
role= get_execution_role(),
sagemaker_session=sagemaker_session,
hyperparameters={"n-estimators": 100},
)
sklearn.fit({"train": train_input})
我们可以从 SageMaker UI 检查作业的统计信息,从左侧菜单转到“Jobs | Training”。如果对结果满意,就可以部署模型。
4.4 步骤 4:打包和部署
我们已经注册了模型,下一步是部署模型。在新单元格中添加以下代码:
predictor = sklearn.deploy(endpoint_name="windturbine", initial_instance_count=1, instance_type="ml.m5.xlarge")
最后,我们可以测试模型,在新单元格中添加以下代码并执行:
predictor.predict(X_test)
预期结果是一个类似于以下的数组:
array([89.59522204, 67.88331554, 72.57244909, ..., 72.57244909, 28.46291311, 43.59427434])
你还可以从 UI、
wget
或 Postman 测试模型。从左侧菜单转到“SageMaker | Endpoints”,然后点击“Test inference”,选择
text/csv
并发送以下数据:
6.07
7.43
部署模型的错误和操作会在 Amazon CloudWatch 中跟踪,你可以访问它查看错误和日志。模型准备好后,就可以从 AWS IoT Core 调用它。
以下是整个开发流程的 mermaid 流程图:
graph LR
A[访问 SageMaker Studio] --> B[准备 S3 存储桶]
B --> C[开发数字孪生模型]
C --> C1[步骤 1:问题陈述、环境和数据集]
C --> C2[步骤 2:探索性数据分析(EDA)]
C --> C3[步骤 3:使用 SageMaker 构建模型]
C --> C4[步骤 4:打包和部署]
C4 --> D[从 AWS IoT Core 调用模型]
在 Amazon SageMaker 上部署分析模型
5. 从 AWS IoT Core 调用模型
当模型准备就绪后,如何将物联网数据连接到模型呢?在之前的架构设计中,我们提出了基于冷路径和热路径的方案。如果要开发冷路径,只需利用计划服务(如 Amazon EventBridge),并将时间序列数据库或 S3 存储桶连接到 SageMaker 模型。
我们还可以利用 AWS IoT Analytics 来连接 AWS IoT Core 和 SageMaker。从实现的角度来看,我们需要定义自定义规则,并使用简单的查询语言连接到 IoT Analytics 的数据源,例如:
SELECT wind_speed_ms FROM devices/device1/sensors
然后,我们可以开发一个 AWS IoT Analytics 笔记本,将 SageMaker 端点与物联网数据连接起来。
如果不想使用 AWS IoT Analytics,并且希望模型不仅能与 AWS IoT Core 一起使用,我们可以通过简单地提供最终端点的 URL 并配置身份验证策略,将一个简单的 AWS Lambda 函数连接到我们的分析服务。这可能会形成一个更简化的架构,具有更高的可扩展性和成本效益。
接下来,我们将通过 Lambda 函数将 IoT Core 连接到 SageMaker。Lambda 是 AWS 提供的无服务器服务,用于集成各种服务。Lambda 是一个可以用 NodeJS、C#、PowerShell、Bash、Linux、Python 或 Java 开发的自定义函数。要通过 Lambda 服务将 IoT Hub 连接到 SageMaker,需要以下三个步骤:
1.
定义连接 Lambda 到 SageMaker 的角色
:
- 访问身份和访问管理(IAM)服务。
- 从左侧菜单创建一个新角色。
- 在下一步中添加以下权限:
- AmazonS3FullAccess
- AmazonSageMakerFullAccess
- AWSLambdaBasicExecutionRole
- IAMFullAccess
- 在最后一个屏幕上,提供角色名称(例如
lambda_sagemaker_fullrole
),审核添加到角色的策略,然后创建角色。
2.
创建 Lambda 函数并进行测试
:
- 从搜索栏找到 Lambda 服务。
- 从左侧菜单转到“Functions”,使用“Create Function”创建一个函数。
- 在“Basic information”部分,为函数提供一个名称,在“Runtime”字段中选择 Python,并将默认执行角色设置为之前创建的角色。
- 在“Advanced settings”中,点击“Enable function URL”。
- 点击“Create Function”按钮,然后完成函数的创建和所需配置。
- 在代码屏幕上,使用以下代码调用 URL,将
endpoint_name
替换为模型端点的名称,并将代码复制粘贴到 Lambda 函数的源代码部分:
import json
import boto3
def lambda_handler(event, context):
client = boto3.client('sagemaker-runtime')
wind_speed_ms = event["wind_speed_ms"]
CONTENT_TYPE = 'text/csv'
endpoint_name = "windturbine"
encoded_text = f"{wind_speed_ms}"
response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType=CONTENT_TYPE, Body=encoded_text)
response_payload = json.loads(response['Body'].read().decode("utf-8"))
return response_payload
- 点击“Deploy”。
- 点击“Test”,使用以下示例数据测试 Lambda 函数:
{
"wind_speed_ms": 9.37
}
预期结果如下:
Response
[
120.53847305680634
]
-
将 IoT Core 连接到 Lambda
:
- 要将 IoT Core 连接到刚刚创建的 Lambda 函数,可以利用消息路由规则。
- 从 IoT Core 的左侧菜单转到“Message routing | Rules | Create Rule”。
- 在“Action”部分,添加刚刚创建的 Lambda 函数。
- 作为源 SQL,可以使用以下代码:
SELECT * FROM devices/device1/sensors
如果一切配置正确,你将看到 Lambda 函数已连接到 IoT Core。此时,你只需连接存储设备,可以是 S3 存储桶或其他你选择的数据库。
6. 清理资源
实验完成后,不要忘记清理资源。从 SageMaker 左侧菜单转到“Running Instances”,停止实例。此外,不要忘记删除端点。
7. 了解 SageMaker 的高级功能
在前面的示例中,我们学习了如何在 SageMaker 上部署算法,但 SageMaker 还支持许多其他功能。
7.1 MLflow
SageMaker 支持 MLflow 和自动日志记录功能。要使用此功能,首先需要启动 MLflow 服务,并在 Sklearn 处理器上激活 MLflow 跟踪服务器。具体步骤如下:
1. 创建一个实例以启动 MLflow 服务器,并复制 Amazon 资源名称(ARN)地址供后续使用。
2. 从 IAM 服务的左侧菜单转到“Policies”,找到 SageMaker 域的执行策略(通常称为
AmazonSageMaker-ExecutionPolicy-<your id>
),点击“Edit”,并添加以下权限:
- sagemaker-mlflow:*
- sagemaker:CreateMlflowTrackingServer
- sagemaker:UpdateMlflowTrackingServer
- sagemaker:DeleteMlflowTrackingServer
- sagemaker:StartMlflowTrackingServer
- sagemaker:StopMlflowTrackingServer
- sagemaker:CreatePresignedMlflowTrackingServerUrl
3. 在新单元格中添加以下代码,将 MLflow 包添加到作业和部署实例中:
%%writefile src/requirements.txt
mlflow==2.13.2
sagemaker-mlflow==0.1.0
-
在
__main__方法中添加 MLflow 自动日志记录:
import mlflow
import os
# ...
mlflow.set_tracking_uri(os.environ['MLFLOW_TRACKING_ARN'])
mlflow.autolog()
# ...
- 在 Sklearn 处理器中添加以下环境变量:
# ...
source_dir="src",
environment={"MLFLOW_TRACKING_ARN": the_copied_ARN}
# ...
实验结果将发布在 SageMaker UI 上。更多详细信息可查看 SageMaker SDK 官方文档:https://sagemaker-examples.readthedocs.io/。
7.2 自动调优
自动调优超参数是 SageMaker 的一个重要功能。在之前的练习中,我们使用了单层或默认的输入/输出通道。我们也可以配置不同的参数,让 SageMaker 优化这些参数。可以从 SageMaker 左侧菜单访问这些功能。
7.3 基础模型
Amazon SageMaker 允许用户重用已经训练好的模型。可以通过左侧菜单中的 JumpStart 选项访问此功能。
以下是使用 Lambda 连接 IoT Core 和 SageMaker 的步骤表格:
|步骤|操作|
| ---- | ---- |
|1|定义连接 Lambda 到 SageMaker 的角色,添加必要权限并创建角色|
|2|创建 Lambda 函数,配置运行时、启用函数 URL,添加代码并部署,使用示例数据测试|
|3|利用消息路由规则将 IoT Core 连接到 Lambda,配置源 SQL|
以下是高级功能使用流程的 mermaid 流程图:
graph LR
A[MLflow] --> A1[启动 MLflow 服务并复制 ARN]
A --> A2[添加权限到执行策略]
A --> A3[添加 MLflow 包]
A --> A4[添加自动日志记录]
A --> A5[设置环境变量]
B[自动调优] --> B1[从左侧菜单访问功能]
C[基础模型] --> C1[通过 JumpStart 选项访问]
通过以上步骤和功能,我们可以更全面地利用 Amazon SageMaker 进行模型的开发、部署和管理,实现物联网数据与机器学习模型的有效结合。
超级会员免费看
11万+

被折叠的 条评论
为什么被折叠?



