27、机器学习模型部署全攻略

机器学习模型部署全攻略

在机器学习领域,模型部署是将训练好的模型投入实际应用的关键环节。本文将详细介绍多种模型部署的方法和相关工具,帮助你更好地将模型应用到实际场景中。

模型端点的更新与清理

在使用 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})
  1. 准备批量输入数据
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')
  1. 创建转换器并启动批量处理
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)
  1. 获取预测结果
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
)
  1. 创建端点配置和端点 :按照常规方式创建端点配置和端点,也可以将管道用于批量转换器。

你可以在 这里 找到使用 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")
  1. 定义基础设施要求和数据集信息
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))
  1. 查看基线结果
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 为例,介绍部署步骤:

准备模型
  1. 训练模型 :在 Fashion-MNIST 数据集上训练 TensorFlow 模型。
  2. 设置环境变量
%env model_data {tf_estimator.model_data}
  1. 下载并提取模型
%%sh
aws s3 cp ${model_data} .
mkdir test-models
tar xvfz model.tar.gz -C test-models
  1. 将模型提交到 Git 仓库
<initialize git repository>
$ cd test-models
$ git add model
$ git commit -m "New model"
$ git push
配置 Fargate
  1. 安装 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
  1. 创建 Fargate 集群
%%sh 
aws ecs create-cluster --cluster-name fargate-demo
ecs-cli configure --cluster fargate-demo --region eu-west-1
  1. 创建 CloudWatch 日志组
%%sh
aws logs create-log-group --log-group-name awslogs-tf-ecs
  1. 创建安全组 :确保安全组开放 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"
}
运行任务
  1. 启动任务
%%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}"
  1. 检查任务状态
%%sh
ecs-cli ps --desired-status RUNNING
  1. 发送预测请求
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)
  1. 停止任务并删除集群
%%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 等所需权限。
- 资源管理 :合理管理资源可以降低成本。例如,批量转换器部署完成后,基础设施会自动关闭;在使用容器服务时,要根据实际需求合理配置资源,避免资源浪费。
- 异常处理 :在部署过程中,可能会遇到各种异常情况。要做好异常处理,如在发送异常数据测试时,要能够根据违规报告及时调整模型或数据处理流程。

未来趋势与拓展

随着机器学习技术的不断发展,模型部署也在不断演变。未来,可能会出现以下趋势:
- 自动化部署 :更多的自动化工具和平台将出现,简化模型部署的流程,减少人工干预。
- 边缘计算 :将模型部署到边缘设备上,减少数据传输延迟,提高实时性和隐私性。
- 混合云部署 :结合公有云和私有云的优势,实现更灵活、安全的模型部署。

为了跟上这些趋势,我们可以进一步探索相关技术,如学习自动化部署工具的使用,了解边缘计算和混合云的架构和应用场景。通过不断学习和实践,我们可以更好地应对未来的挑战,将机器学习模型更高效地应用到实际业务中。

通过本文的介绍,相信你对机器学习模型的部署有了更全面的了解。在实际应用中,你可以根据具体的需求和场景选择合适的部署方式,并遵循相关的注意事项和最佳实践,确保模型能够稳定、高效地运行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值