使用 Amazon SageMaker PlatoBlockchain Data Intelligence 在基于 AWS Graviton 的实例上运行机器学习推理工作负载。 垂直搜索。 哎。

使用 Amazon SageMaker 在基于 AWS Graviton 的实例上运行机器学习推理工作负载

今天,我们推出 亚马逊SageMaker 推论 AWS 引力子 使您能够利用来自 Graviton 芯片的价格、性能和效率优势。

基于 Graviton 的实例可用于 SageMaker 中的模型推理。 这篇文章可帮助您将机器学习 (ML) 推理工作负载从 x86 迁移和部署到 SageMaker 中基于 Graviton 的实例。 我们提供了将 SageMaker 训练模型部署到基于 Graviton 的实例的分步指南,涵盖了使用 Graviton 时的最佳实践,讨论了性价比优势,并演示了如何在 SageMaker Graviton 实例上部署 TensorFlow 模型。

引力子简介

AWS Graviton 是 AWS 设计的处理器系列,可提供最佳性价比,并且比 x86 处理器更节能。 AWS Graviton 3 处理器是 Graviton 处理器系列中的最新产品,并针对 ML 工作负载进行了优化,包括对 bfloat16 的支持,以及两倍的单指令多数据 (SIMD) 带宽。 当这两个功能结合在一起时,Graviton 3 可以提供比 Graviton 2 实例高出三倍的性能。 与同类产品相比,Graviton 3 在获得相同性能的情况下最多可减少 60% 的能源消耗 亚马逊弹性计算云 (亚马逊 EC2)实例。 如果您想减少碳足迹并实现可持续发展目标,这是一个很棒的功能。

解决方案概述

要将模型部署到 Graviton 实例,您可以使用 AWS深度学习容器 or 自带容器 兼容 Arm v8.2 架构。

将模型从 x86 支持的实例迁移(或新部署)到 Graviton 实例很简单,因为 AWS 提供容器来托管具有 PyTorch、TensorFlow、Scikit-learn 和 XGBoost 的模型,并且这些模型与架构无关。 尽管如此,如果你愿意自带库,你也可以这样做,只要确保你的容器是使用支持 Arm64 架构的环境构建的。 有关详细信息,请参阅 构建自己的算法容器.

您需要完成三个步骤来部署您的模型:

  1. 创建 SageMaker 模型:除其他参数外,这将包含有关模型文件位置的信息、将用于部署的容器以及推理脚本的位置。 (如果您已经在基于 x86 的推理实例中部署了现有模型,则可以跳过此步骤。)
  2. 创建端点配置:这将包含有关端点实例类型的信息(例如,Graviton7 的 ml.c3g.xlarge)、您在步骤 1 中创建的模型的名称以及每个实例的数量端点。
  3. 使用在步骤 2 中创建的端点配置启动端点。

先决条件

在开始之前,请考虑以下先决条件:

  1. 完成中列出的先决条件 先决条件.
  2. 您的模型应该是基于 PyTorch、TensorFlow、XGBoost 或 Scikit-learn 的模型。 下表总结了截至撰写本文时当前支持的版本。 有关最新更新,请参阅 SageMaker 框架容器(仅限 SM 支持).
    . 蟒蛇 TensorFlow PyTorch Scikit学习 XGBoost
    支持的版本 3.8 2.9.1 1.12.1 1.0-1 1.3-1到1.5-1
  3. 推理脚本存储在 亚马逊简单存储服务 (亚马逊S3)。

在以下部分中,我们将引导您完成部署步骤。

创建 SageMaker 模型

如果您已经在基于 x86 的推理实例中部署了现有模型,则可以跳过此步骤。 否则,请完成以下步骤以创建 SageMaker 模型:

  1. 找到您存储在 S3 存储桶中的模型。 复制 URI。
    您稍后在 MODEL_S3_LOCATION.
  2. 确定模型训练期间使用的框架版本和 Python 版本。
    您需要根据您的框架和 Python 版本从可用的 AWS 深度学习容器列表中选择一个容器。 有关详细信息,请参阅 为 Amazon ECR 引入多架构容器镜像.
  3. 在 S3 存储桶中找到推理 Python 脚本 URI(常用文件名为 inference.py).
    需要推理脚本 URI INFERENCE_SCRIPT_S3_LOCATION.
  4. 有了这些变量,您就可以使用以下命令调用 SageMaker API:
    client = boto3.client("sagemaker")
    
    client.create_model(
        ModelName="Your model name",
        PrimaryContainer={
            "Image": ,
            "ModelDataUrl": ,
            "Environment": {
            "SAGEMAKER_PROGRAM": "inference.py",
            "SAGEMAKER_SUBMIT_DIRECTORY": ,
            "SAGEMAKER_CONTAINER_LOG_LEVEL": "20",
            "SAGEMAKER_REGION": 
            }
        },
        ExecutionRoleArn= 
    )

您还可以创建多架构图像,并使用相同的图像但具有不同的标签。 您可以指明您的实例将部署在哪个架构上。 有关详细信息,请参阅 为 Amazon ECR 引入多架构容器镜像.

创建端点配置

创建模型后,您必须通过运行以下命令来创建端点配置(注意我们使用的实例类型):

client.create_endpoint_config(
    EndpointConfigName= ,
    ProductionVariants=[
        {
         "VariantName": "v0",
         "ModelName": "Your model name",
         "InitialInstanceCount": 1,
         "InstanceType": "ml.c7g.xlarge",
        },
    ]
)

以下屏幕截图显示了 SageMaker 控制台上的端点配置详细信息。

启动端点

使用在上一步中创建的端点配置,您可以部署端点:

client.create_endpoint(
    EndpointName = "",
    EndpointConfigName = ""
    )

等到模型端点部署完毕。 请求预测的方式与为部署在基于 x86 的实例中的端点请求预测的方式相同。

以下屏幕截图显示了 SageMaker 控制台上的终端节点。

来自配置的 SageMaker 端点

支持什么

SageMaker 为 TensorFlow 和 PyTorch 框架提供性能优化的 Graviton 深度容器。 这些容器支持计算机视觉、自然语言处理、推荐以及基于通用深度和广泛模型的推理用例。 除了深度学习容器,SageMaker 还提供了 XGBoost 和 Scikit-learn 等经典 ML 框架的容器。 这些容器在 c6g/m6g 和 c7g 实例之间是二进制兼容的,因此将推理应用程序从一代迁移到另一代是无缝的。

C6g/m6g 支持 fp16(半精度浮点数),对于兼容模型,与 c5 实例相比可提供同等或更好的性能。 C7g 通过将 SIMD 宽度加倍并支持 bfloat-16 (bf16) 显着提高了 ML 性能,这是运行模型的最具成本效益的平台。

与 SageMaker 中的其他 CPU 实例相比,c6g/m6g 和 c7g 都为经典 ML(例如 XGBoost)提供了良好的性能。 c16g 上的 Bfloat-7 支持允许高效部署 bf16 训练或 AMP(自动混合精度)训练模型。 Graviton 上的 Arm 计算库 (ACL) 后端提供 bfloat-16 内核,可以通过快速数学模式加速 fp32 运算符,而无需模型量化。

推荐的最佳实践

在 Graviton 实例上,每个 vCPU 都是一个物理核心。 不存在对公共 CPU 资源的争用(与 SMT 不同),并且工作负载性能扩展与每个 vCPU 的添加成线性关系。 因此,建议在用例允许时使用批量推理。 这将通过在每个物理内核上并行处理批处理来实现 vCPU 的高效使用。 如果无法进行批量推理,则需要针对给定有效负载的最佳实例大小,以确保操作系统线程调度开销不会超过额外 vCPU 带来的计算能力。

TensorFlow 默认自带 Eigen 内核,建议切换到带 ACL 的 OneDNN 以获得最优化的推理后端。 OneDNN 后端和 bfloat-16 快速数学模式可以在启动容器服务时启用:

docker run -p 8501:8501 --name tfserving_resnet 
--mount type=bind,source=/tmp/resnet,target=/models/resnet 
-e MODEL_NAME=resnet -e TF_ENABLE_ONEDNN_OPTS=1 
-e DNNL_DEFAULT_FPMATH_MODE=BF16 -e -t tfs:mkl_aarch64

前面的服务命令托管了一个具有两个重要配置的标准 resnet50 模型:

-e TF_ENABLE_ONEDNN_OPTS=1
-e DNNL_DEFAULT_FPMATH_MODE=BF16

这些可以通过以下方式传递给推理容器:

client.create_model(
    ModelName="Your model name",
    PrimaryContainer={
    "Image": ,
    "ModelDataUrl": ,
    "Environment": {
        "SAGEMAKER_PROGRAM": "inference.py",
        "SAGEMAKER_SUBMIT_DIRECTORY": "",
        "SAGEMAKER_CONTAINER_LOG_LEVEL": "20",
        "SAGEMAKER_REGION": ,
        "TF_ENABLE_ONEDNN_OPTS": "1",
        "DNNL_DEFAULT_FPMATH_MODE": "BF16"
         }
     },
     ExecutionRoleArn='ARN for AmazonSageMaker-ExecutionRole'
)

部署示例

在本文中,我们将向您展示如何在 Graviton 支持的 SageMaker 推理实例上部署在 SageMaker 中训练的 TensorFlow 模型。

您可以在 SageMaker 笔记本实例、一个 亚马逊SageMaker Studio 笔记本,或本地模式下的 Jupyter 笔记本。 如果您在本地模式下使用 Jupyter 笔记本,则需要检索 SageMaker 执行角色。

以下示例考虑了 CIFAR-10 数据集。 您可以按照 SageMaker 示例中的笔记本示例 GitHub回购 重现本文中使用的模型。 我们使用经过训练的模型和 cifar10_keras_main.py 用于推理的 Python 脚本。

该模型存储在 S3 存储桶中: s3://aws-ml-blog/artifacts/run-ml-inference-on-graviton-based-instances-with-amazon-sagemaker/model.tar.gz

cifar10_keras_main.py 可用于推理的脚本存储在:s3://aws-ml-blog/artifacts/run-ml-inference-on-graviton-based-instances-with-amazon-sagemaker/script/cifar10_keras_main.py

我们使用 us-east-1 区域模型并将其部署在基于 ml.c7g.xlarge Graviton 的实例上。 基于此,我们的 AWS Deep Learning Container 的 URI 是 763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference-graviton:2.9.1-cpu-py38-ubuntu20.04-sagemaker

  1. 使用以下代码设置:
    import sagemaker
    import boto3
    import datetime
    import json
    import gzip
    import os
    
    sagemaker_session = sagemaker.Session()
    bucket = sagemaker_session.default_bucket()
    role = sagemaker.get_execution_role()
    region = sagemaker_session.boto_region_name

  2. 下载用于端点测试的数据集:
    from keras.datasets import cifar10
    (x_train, y_train), (x_test, y_test) = cifar10.load_data()

  3. 创建模型和端点配置,并部署端点:
    timestamp = "{:%Y-%m-%d-%H-%M-%S}".format(datetime.datetime.now())
    
    client = boto3.client("sagemaker")
    
    MODEL_NAME = f"graviton-model-{timestamp}"
    ENDPOINT_NAME = f"graviton-endpoint-{timestamp}"
    ENDPOINT_CONFIG_NAME = f"graviton-endpoint-config-{timestamp}"
    
    # create sagemaker model
    create_model_response = client.create_model(
        ModelName=MODEL_NAME,
        PrimaryContainer={
        "Image":  "763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference-graviton:2.9.1-cpu-py38-ubuntu20.04-sagemaker ",
        "ModelDataUrl":  "s3://aws-ml-blog/artifacts/run-ml-inference-on-graviton-based-instances-with-amazon-sagemaker/model.tar.gz",
        "Environment": {
            "SAGEMAKER_CONTAINER_LOG_LEVEL": "20",
            "SAGEMAKER_REGION": region
            }
        },
        ExecutionRoleArn=role
    )
    print ("create_model API response", create_model_response)

  4. 或者,您可以将推理脚本添加到 Environment in create_model 如果您最初没有在训练期间将其作为工件添加到您的 SageMaker 模型中:
    "SAGEMAKER_PROGRAM": "inference.py",
    "SAGEMAKER_SUBMIT_DIRECTORY": ,
    		
    # create sagemaker endpoint config
    create_endpoint_config_response = client.create_endpoint_config(
        EndpointConfigName=ENDPOINT_CONFIG_NAME,
        ProductionVariants=[
            {
             "VariantName": "v0",
             "ModelName": MODEL_NAME,
             "InitialInstanceCount": 1,
             "InstanceType": "ml.c7g.xlarge" 
            },
        ]
    )
    print ("ncreate_endpoint_config API response", create_endpoint_config_response)
    
    # create sagemaker endpoint
    create_endpoint_response = client.create_endpoint(
        EndpointName = ENDPOINT_NAME,
        EndpointConfigName = ENDPOINT_CONFIG_NAME,
    )
    print ("ncreate_endpoint API response", create_endpoint_response)   
    

    您必须等待几分钟才能进行部署。

  5. 使用以下代码验证端点状态:
    describe_response = client.describe_endpoint(EndpointName=ENDPOINT_NAME)
    print(describe_response["EndpointStatus"]

    你也可以检查一下 AWS管理控制台 查看您的模型何时部署。

  6. 设置运行时环境以调用端点:
    runtime = boto3.Session().client(service_name="runtime.sagemaker")

    现在我们准备有效负载来调用端点。 我们使用与模型训练相同类型的图像。 这些是在前面的步骤中下载的。

  7. 将有效负载转换为张量并设置模型期望的正确格式。 对于这个例子,我们只请求一个预测。
    input_image = x_test[0].reshape(1,32,32,3)

    我们将模型输出作为一个数组。

  8. 如果我们对其应用 softmax,我们可以将此输出转换为概率:
    CONTENT_TYPE = 'application/json'
    ACCEPT = 'application/json'
    PAYLOAD = json.dumps(input_image.tolist())
    
    response = runtime.invoke_endpoint(
        EndpointName=ENDPOINT_NAME, 
        ContentType=CONTENT_TYPE,
        Accept=ACCEPT,
        Body=PAYLOAD
    )
        
    print(response['Body'].read().decode())

清理资源

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

client.delete_endpoint(EndpointName=ENDPOINT_NAME)
client.delete_endpoint_config(EndpointConfigName=ENDPOINT_CONFIG_NAME)
client.delete_model(ModelName=MODEL_NAME)

性价比比较

与基于 x86 的实例相比,基于 Graviton 的实例提供最低的价格和最佳的性价比。 与 EC2 实例类似,具有 ml.c6g 实例 (Graviton 2) 的 SageMaker 推理终端节点的价格比 ml.c20 低 5%,而 Graviton 3 ml.c7g 实例比 ml.c15 实例便宜 6%。 有关详细信息,请参阅 Amazon SageMaker定价.

结论

在本文中,我们展示了新推出的 SageMaker 功能,可以在 Graviton 支持的推理实例中部署模型。 我们为您提供了最佳实践指导,并简要讨论了新型推理实例的性价比优势。

要了解有关 Graviton 的更多信息,请参阅 AWS 引力子处理器. 您可以在 Amazon EC2 控制台上开始使用基于 AWS Graviton 的 EC2 实例,并参考 AWS Graviton 技术指南. 您可以使用这篇博文中的示例代码部署 Sagemaker 模型端点以在 Graviton 上进行推理。


关于作者

维克多·贾拉米洛维克多·哈拉米洛博士, 是 AWS 专业服务的高级机器学习工程师。 在加入 AWS 之前,他是预测性维护领域的大学教授和研究科学家。 在空闲时间,他喜欢骑摩托车和 DIY 摩托车修理工。

兹姆纳科·奥拉曼Zmnako Awrahman 博士, 是 Amazon Web Services 的实践经理、ML SME 和机器学习技术领域社区 (TFC) 成员。 他帮助客户利用云的力量,通过数据分析和机器学习从他们的数据中提取价值。

苏妮塔·纳达帕利苏妮塔·纳达帕利 是 AWS 的软件开发经理。 她领导机器学习、HPC 和多媒体工作负载的 Graviton 软件性能优化。 她热衷于开源开发和使用 Arm SoC 提供具有成本效益的软件解决方案。

约翰娜刘约翰娜刘 是 Amazon SageMaker 团队的一名软件开发工程师。 她目前的工作重点是帮助开发人员有效地托管机器学习模型并提高推理性能。 她热衷于空间数据分析和使用 AI 解决社会问题。

艾伦谭艾伦谭 是 SageMaker 的高级产品经理,负责大型模型推理方面的工作。 他热衷于将机器学习应用于分析领域。 工作之余,他喜欢户外活动。

时间戳记:

更多来自 AWS机器学习