机器学习模型部署全攻略
在机器学习领域,模型部署是将训练好的模型投入实际应用的关键环节。本文将详细介绍多种模型部署的方法和相关工具,帮助你更好地将模型应用到实际场景中。
模型端点的更新与清理
在使用 boto3 API 进行模型部署时,我们可以对端点进行更新和清理操作。例如,更新端点配置的代码如下:
response = sm.update_endpoint(
EndpointName=endpoint_name,
EndpointConfigName=endpoint_config_name_2)
当不再需要端点和端点配置时,我们可以进行清理:
sm.delete_endpoint(EndpointName=endpoint_name)
sm.delete_endpoint_config(EndpointConfigName=endpoint_config_name)
sm.delete_endpoint_config(EndpointConfigName=endpoint_config_name_2)
虽然 boto3 API 代码较为冗长,但它为机器学习操作提供了所需的灵活性。
批量转换器部署模型
有些场景不需要实时端点,批量转换器就是解决这类问题的简单方法。以下是使用 scikit-learn 脚本在波士顿住房数据集上进行批量预测的步骤:
1. 配置估计器 :
from sagemaker.sklearn import SKLearn
sk = SKLearn(entry_point='sklearn-boston-housing.py',
role=sagemaker.get_execution_role(),
instance_count=1,
instance_type='ml.m5.large',
output_path=output,
hyperparameters={'normalize': True, 'test-size': 0.1})
sk.fit({'training':training})
- 准备批量输入数据 :
import pandas as pd
data = pd.read_csv('housing.csv')
data.drop(['medv'], axis=1, inplace=True)
data.to_csv('data.csv', header=False, index=False)
batch_input = sess.upload_data(
path='data.csv',
key_prefix=prefix + '/batch')
- 创建转换器并启动批量处理 :
sk_transformer = sk.transformer(
instance_count=1,
instance_type='ml.m5.large')
sk_transformer.transform(
batch_input,
content_type='text/csv',
wait=True, logs=True)
- 获取预测结果 :
print(sk_transformer.output_path)
使用 AWS CLI 检索预测结果:
%%bash -s "$sk_transformer.output_path"
aws s3 cp $1/data.csv.out .
head -1 data.csv.out
批量处理完成后,用于转换的基础设施会自动关闭,无需手动清理。
推理管道部署模型
在实际的机器学习场景中,往往需要多个模型协同工作。推理管道可以让你在同一个端点或批量转换器上部署多达五个模型,并自动处理预测序列。以运行 PCA 和线性学习器为例,构建推理管道的步骤如下:
1. 训练 PCA 模型 :在输入数据集上训练 PCA 模型。
2. 处理数据集 :使用 PCA 处理训练集和验证集,并将结果存储在 S3 中。
3. 训练线性学习器模型 :使用 PCA 处理后的数据集作为输入训练线性学习器模型。
4. 创建推理管道 :
response = sagemaker.create_model(
ModelName='pca-linearlearner-pipeline',
Containers=[
{
'Image': pca_container,
'ModelDataUrl': pca_model_artifact,
...
},
{
'Image': ll_container,
'ModelDataUrl': ll_model_artifact,
...
}
],
ExecutionRoleArn=role
)
- 创建端点配置和端点 :按照常规方式创建端点配置和端点,也可以将管道用于批量转换器。
你可以在 这里 找到使用 scikit-learn 和线性学习器的完整示例。
SageMaker 模型监控
SageMaker 模型监控具有两个主要功能:
- 数据捕获 :捕获发送到端点的数据以及端点返回的预测结果,用于进一步分析或在开发和测试新模型时重现真实流量。
- 数据质量监控 :将传入流量与基于训练集构建的基线进行比较,并发送有关数据质量问题的警报。
以下是使用 SageMaker 模型监控的详细步骤:
数据捕获
在部署端点时设置数据捕获过程,也可以使用 update_endpoint() API 在现有端点上启用。需要注意以下几点:
- 进行模型监控时,每次只能发送一个样本。
- 数据样本和预测结果必须是扁平的表格数据。
- 内容类型和接受类型必须相同,可以使用 CSV 或 JSON,但不能混合使用。
- 如果端点附有监控计划,则不能删除端点,必须先删除监控计划。
设置数据捕获的代码如下:
from sagemaker.model_monitor.data_capture_config import DataCaptureConfig
capture_path = 's3://{}/{}/capture/'.format(bucket, prefix)
ll_predictor = ll.deploy(
initial_instance_count=1,
instance_type='ml.t2.medium',
data_capture_config = DataCaptureConfig(
enable_capture = True,
sampling_percentage = 100,
capture_options = ['REQUEST', 'RESPONSE'],
destination_s3_uri = capture_path))
端点启动后,发送数据进行预测,然后将捕获的数据复制到本地:
%%bash -s "$capture_path"
aws s3 ls --recursive $1
aws s3 cp --recursive $1 .
创建基线
使用内置容器或自带容器构建基线。以下是使用内置容器创建基线的步骤:
1. 转换数据集格式 :将数据集转换为 CSV 格式并上传到 S3:
data.to_csv('housing.csv', sep=',', index=False)
training = sess.upload_data(
path='housing.csv',
key_prefix=prefix + "/baseline")
- 定义基础设施要求和数据集信息 :
from sagemaker.model_monitor import DefaultModelMonitor
from sagemaker.model_monitor.dataset_format import DatasetFormat
ll_monitor = DefaultModelMonitor(role=role,
instance_count=1, instance_type='ml.m5.large')
ll_monitor.suggest_baseline(baseline_dataset=training,
dataset_format=DatasetFormat.csv(header=True))
- 查看基线结果 :
baseline = ll_monitor.latest_baselining_job
constraints = pd.io.json.json_normalize(
baseline.suggested_constraints()
.body_dict["features"])
schema = pd.io.json.json_normalize(
baseline.baseline_statistics().body_dict["features"])
设置监控计划
设置每小时运行一次的监控计划:
from sagemaker.model_monitor import CronExpressionGenerator
ll_monitor.create_monitoring_schedule(
monitor_schedule_name='ll-housing-schedule',
endpoint_input=ll_predictor.endpoint,
statistics=ll_monitor.baseline_statistics(),
constraints=ll_monitor.suggested_constraints(),
schedule_cron_expression=CronExpressionGenerator.hourly())
发送异常数据并检查违规报告
发送异常数据进行测试:
test_sample = '0.00632,18.00,2.310,0,0.5380,6.5750,65.20,4.0900,1,296.0,15.30,4.98'
ll_predictor.serializer = sagemaker.serializers.CSVSerializer()
ll_predictor.deserializer = sagemaker.deserializers.CSVDeserializer()
response = ll_predictor.predict(test_sample)
print(response)
bad_sample_1 = '632.0,18.00,2.310,0,0.5380,6.5750,65.20,4.0900,1,296.0,15.30,4.98'
response = ll_predictor.predict(bad_sample_1)
print(response)
bad_sample_2 = '0.00632,18.00,2.310,0,0.5380,6.5750,65.20,4.0900,1,296.0,15.30,-4.98'
response = ll_predictor.predict(bad_sample_2)
print(response)
检查违规报告:
ll_executions = ll_monitor.list_executions()
print(ll_executions)
violations = ll_monitor.latest_monitoring_constraint_violations()
violations = pd.io.json.json_normalize(
violations.body_dict["violations"])
violations
完成后,删除监控计划和端点:
response = ll_monitor.delete_monitoring_schedule()
ll_predictor.delete_endpoint()
模型部署到容器服务
可以将模型部署到容器服务,如 Amazon Elastic Container Service (ECS)、Amazon Elastic Kubernetes Service (EKS) 或 Amazon Fargate。以下以 Amazon Fargate 为例,介绍部署步骤:
准备模型
- 训练模型 :在 Fashion-MNIST 数据集上训练 TensorFlow 模型。
- 设置环境变量 :
%env model_data {tf_estimator.model_data}
- 下载并提取模型 :
%%sh
aws s3 cp ${model_data} .
mkdir test-models
tar xvfz model.tar.gz -C test-models
- 将模型提交到 Git 仓库 :
<initialize git repository>
$ cd test-models
$ git add model
$ git commit -m "New model"
$ git push
配置 Fargate
- 安装 ecs-cli :
%%sh
sudo curl -o /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-linux-amd64-latest
sudo chmod 755 /usr/local/bin/ecs-cli
- 创建 Fargate 集群 :
%%sh
aws ecs create-cluster --cluster-name fargate-demo
ecs-cli configure --cluster fargate-demo --region eu-west-1
- 创建 CloudWatch 日志组 :
%%sh
aws logs create-log-group --log-group-name awslogs-tf-ecs
- 创建安全组 :确保安全组开放 TensorFlow Serving 的两个端口(8500 和 8501)。
定义任务
编写 JSON 文件定义任务:
{
"requiresCompatibilities": ["FARGATE"],
"family": "inference-fargate-tf-230",
"memory": "8192",
"cpu": "4096",
"containerDefinitions": [{
"name": "dlc-tf-inference",
"image": "763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference:2.3.2-cpu-py37-ubuntu18.04",
"essential": true,
"command": [
"mkdir -p /test && cd /test && git clone https://gitlab.com/juliensimon/test-models.git && tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=1 --model_base_path=/test/test-models/model"
],
"entryPoint": ["sh","-c"],
"portMappings": [
{
"hostPort": 8500,
"protocol": "tcp",
"containerPort": 8500
},
{
"hostPort": 8501,
"protocol": "tcp",
"containerPort": 8501
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "awslogs-tf-ecs",
"awslogs-region": "eu-west-1",
"awslogs-stream-prefix": "inference"
}
}
}],
"networkMode": "awsvpc",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole"
}
运行任务
- 启动任务 :
%%sh
aws ecs run-task
--cluster fargate-demo
--task-definition inference-fargate-tf-230:1
--count 1
--launch-type FARGATE
--network-configuration
"awsvpcConfiguration={subnets=[$SUBNET_ID],
securityGroups=[$SECURITY_GROUP_ID],
assignPublicIp=ENABLED}"
- 检查任务状态 :
%%sh
ecs-cli ps --desired-status RUNNING
- 发送预测请求 :
import random, json, requests
inference_task_ip = '52.49.238.243'
inference_url = 'http://' + inference_task_ip + ':8501/v1/models/1:predict'
indices = random.sample(range(x_val.shape[0] - 1), 10)
images = x_val[indices]/255
labels = y_val[indices]
data = images.reshape(num_samples, 28, 28, 1)
data = json.dumps(
{"signature_name": "serving_default",
"instances": data.tolist()})
headers = {"content-type": "application/json"}
json_response = requests.post(
inference_url,
data=data,
headers=headers)
predictions = json.loads(
json_response.text)['predictions']
predictions = np.array(predictions).argmax(axis=1)
print("Labels : ", labels)
print("Predictions: ", predictions)
- 停止任务并删除集群 :
%%sh
aws ecs stop-task --cluster fargate-demo --task $TASK_ARN
ecs-cli down --force --cluster fargate-demo
通过以上方法,你可以根据不同的需求选择合适的模型部署方式,确保模型在实际应用中稳定运行。
机器学习模型部署全攻略
不同部署方式对比
为了更清晰地了解各种模型部署方式的特点,我们可以通过以下表格进行对比:
| 部署方式 | 适用场景 | 优点 | 缺点 |
| — | — | — | — |
| 端点更新与清理 | 需要动态更新模型配置的场景 | 灵活性高,可根据需求随时调整 | 代码相对冗长,需要一定的编程基础 |
| 批量转换器部署 | 不需要实时响应,处理大量数据的场景 | 简单高效,可一次性处理大量数据 | 不适合实时性要求高的场景 |
| 推理管道部署 | 多个模型协同工作的场景 | 减少端点数量,降低成本,自动处理预测序列 | 构建过程相对复杂 |
| SageMaker 模型监控 | 需要监控数据质量和模型性能的场景 | 可捕获数据、监控数据质量并发送警报 | 有一些使用限制,如数据格式要求 |
| 容器服务部署 | 对部署环境有特定要求,需要灵活管理的场景 | 可移植性强,便于管理和扩展 | 需要了解容器和相关服务的配置 |
部署流程总结
下面是一个 mermaid 格式的流程图,展示了一个完整的机器学习模型部署流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(模型训练):::process
B --> C{选择部署方式}:::decision
C -->|端点更新与清理| D(更新端点配置):::process
C -->|批量转换器部署| E(配置估计器):::process
C -->|推理管道部署| F(训练多个模型):::process
C -->|SageMaker 模型监控| G(设置数据捕获):::process
C -->|容器服务部署| H(准备模型):::process
D --> I(清理端点和配置):::process
E --> J(准备批量输入数据):::process
J --> K(创建转换器并处理):::process
F --> L(创建推理管道):::process
L --> M(创建端点配置和端点):::process
G --> N(创建基线):::process
N --> O(设置监控计划):::process
O --> P(发送异常数据并检查):::process
H --> Q(配置容器服务):::process
Q --> R(定义任务):::process
R --> S(运行任务):::process
I --> T([结束]):::startend
K --> T
M --> T
P --> T
S --> T
注意事项与最佳实践
在进行模型部署时,还需要注意以下几点:
- 数据格式 :不同的部署方式和工具对数据格式有不同的要求,如 SageMaker 模型监控要求数据样本和预测结果是扁平的表格数据,内容类型和接受类型必须相同。在准备数据时,要确保其符合相应的要求。
- 权限配置 :使用 AWS 服务进行部署时,需要确保相应的 IAM 角色具有足够的权限。例如,在使用 Fargate 时,要保证 IAM 角色包含 ecs:CreateCluster 等所需权限。
- 资源管理 :合理管理资源可以降低成本。例如,批量转换器部署完成后,基础设施会自动关闭;在使用容器服务时,要根据实际需求合理配置资源,避免资源浪费。
- 异常处理 :在部署过程中,可能会遇到各种异常情况。要做好异常处理,如在发送异常数据测试时,要能够根据违规报告及时调整模型或数据处理流程。
未来趋势与拓展
随着机器学习技术的不断发展,模型部署也在不断演变。未来,可能会出现以下趋势:
- 自动化部署 :更多的自动化工具和平台将出现,简化模型部署的流程,减少人工干预。
- 边缘计算 :将模型部署到边缘设备上,减少数据传输延迟,提高实时性和隐私性。
- 混合云部署 :结合公有云和私有云的优势,实现更灵活、安全的模型部署。
为了跟上这些趋势,我们可以进一步探索相关技术,如学习自动化部署工具的使用,了解边缘计算和混合云的架构和应用场景。通过不断学习和实践,我们可以更好地应对未来的挑战,将机器学习模型更高效地应用到实际业务中。
通过本文的介绍,相信你对机器学习模型的部署有了更全面的了解。在实际应用中,你可以根据具体的需求和场景选择合适的部署方式,并遵循相关的注意事项和最佳实践,确保模型能够稳定、高效地运行。
超级会员免费看
1902

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



