使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。

使用 PyTorch Model Zoo 创建 Amazon SageMaker 模型

部署高质量、经过训练的机器学习 (ML) 模型来执行批量或实时推理是为客户带来价值的关键部分。 然而,ML 实验过程可能很乏味——有很多方法需要花费大量时间来实施。 这就是为什么要预训练 ML 模型,例如 PyTorch 模型动物园 很有帮助。 亚马逊SageMaker 提供了一个统一的界面来试验不同的 ML 模型,而 PyTorch Model Zoo 允许我们以标准化的方式轻松地交换我们的模型。

这篇博文演示了如何使用 SageMaker 中 PyTorch Model Zoo 中的对象检测模型执行 ML 推理。 来自 PyTorch Model Zoo 的预训练 ML 模型是现成的,可以轻松用作 ML 应用程序的一部分。 将这些 ML 模型设置为 SageMaker 端点或 SageMaker 批量转换 通过这篇博文中概述的步骤,在线或离线推理的工作很容易。 我们将使用一个 更快的R-CNN 对象检测模型来预测预定义对象类的边界框。

我们通过一个端到端的示例,从加载 Faster R-CNN 对象检测模型权重,到将它们保存到一个 亚马逊简单存储服务(Amazon S3) bucket,并编写入口点文件并了解 PyTorchModel API 中的关键参数。 最后,我们将部署 ML 模型,使用 SageMaker Batch Transform 对其进行推理,检查 ML 模型输出并学习如何解释结果。 该解决方案可以应用于 PyTorch Model Zoo 上的任何其他预训练模型。 有关可用型号的列表,请参阅 PyTorch 模型动物园文档.

解决方案概述

这篇博文将介绍以下步骤。 有关所有步骤的完整工作版本,请参阅 create_pytorch_model_sagemaker.ipynb

  • 第 1 步:设置
  • 第 2 步:从 PyTorch Model Zoo 加载 ML 模型
  • 第 3 步保存 ML 模型工件并将其上传到 Amazon S3
  • 第 4 步:构建 ML 模型推理脚本
  • 第 5 步:启动 SageMaker 批量转换作业
  • 第 6 步:可视化结果

架构图

目录结构

这个博客的代码可以在这里找到 GitHub存储库. 代码库包含构建 ML 模型工件、启动转换作业和可视化结果所需的一切。

这是我们使用的工作流程。 以下所有步骤都将引用此结构中的模块。

sagemaker_pytorch_model_zoo --> root directory
    |- inference.py --> entry point file
    |- create_pytorch_model_sagemaker.ipynb --> walks through all steps in this blog post
    |- cars.jpg --> input image

sagemaker_torch_model_zoo 文件夹应包含 inference.py 作为入口点文件,create_pytorch_model_sagemaker.ipynb 加载和保存模型权重,创建 SageMaker 模型对象,最后将其传递到 SageMaker 批量转换作业中。 为了引入您自己的 ML 模型,请更改笔记本的第 1 步:设置部分中的路径,并在第 2 步中加载新模型:从 PyTorch Model Zoo 部分加载 ML 模型。 下面的其余步骤将保持不变。

第 1 步:设置

IAM角色

SageMaker 在 SageMaker 管理的基础设施上执行操作。 SageMaker 只能执行笔记本随附的 SageMaker IAM 执行角色中定义的允许操作。 有关创建 IAM 角色和管理 IAM 权限的更详细文档,请参阅 AWS SageMaker 角色文档. 我们可以创建一个新角色,或者我们可以获得 SageMaker (Studio) 笔记本通过运行以下代码行来设置默认执行角色:

import sagemaker

session = sagemaker.Session()

# Set a default S3 bucket
default_bucket = session.default_bucket()

# Get the region
region = boto3.Session().region_name

# Get the SageMaker Execution Role
role_arn = sagemaker.get_execution_role()

上述代码获取笔记本实例的 SageMaker 执行角色。 这是我们为 SageMaker 或 SageMaker Studio 笔记本实例创建的 IAM 角色。

用户可配置参数

以下是构建和启动我们的 SageMaker 批量转换作业所需的所有可配置参数:

INSTANCE_TYPE= "ml.m5.xlarge"
INSTANCE_COUNT= 1
BUCKET = os.path.join("s3://", default_bucket)

DATA_PATH= os.path.join(BUCKET, "images")
IMAGE_NAME = "cars.jpg"
RANDOM_STRING_LENGTH= 16
MODEL_NAME= "FasterRCNNResnet50"

# Needs to be set to version 1.2 or higher to enable automatic PyTorch model repackaging
FRAMEWORK_VERSION= "1.2"
ENTRY_POINT_FILE_NAME= "inference.py"

SAGEMAKER_EXECUTION_ROLE_ARN= role_arn
MODEL_ARTIFACTS_FILE_NAME= os.path.join(BUCKET, "modelzoo/fasterrcnn_resnet50_fpn/model.tar.gz")
IMAGE_URI= sagemaker.image_uris.retrieve(framework="pytorch",
region=region,
version="1.9.1",
py_version="py38",
image_scope='inference',
instance_type=INSTANCE_TYPE)

第 2 步:从 PyTorch Model Zoo 加载 ML 模型

接下来,我们从 PyTorch Model Zoo 中指定一个对象检测模型并保存其 ML 模型权重。 通常,我们使用 .pt 或 .pth 文件扩展名保存 PyTorch 模型。 下面的代码片段从 PyTorch Model Zoo 下载预训练的 Faster R-CNN ResNet50 ML 模型:

模型 = torchvision.models.detection.fasterrcnn_resnet50_fpn(预训练=真)

SageMaker 批量转换需要一些模型权重作为输入,因此我们将预训练的 ML 模型保存为 model.pt。 如果我们想加载自定义模型,我们可以将另一个 PyTorch 模型的模型权重保存为 model.pt。

H = 1080
W = 1920
scripted_fn = torch.jit.script(model, torch.randn(1, 3, H, W))
scripted_fn.save("model.pt")

第 3 步:保存 ML 模型工件并将其上传到 Amazon S3

由于我们将使用 SageMaker 进行 ML 推理,因此我们需要将模型权重上传到 S3 存储桶。 我们可以使用以下命令或通过下载并将文件直接拖放到 S3 中来完成此操作。 以下命令将首先压缩文件组 model.pt 到 tarball 并将模型权重从我们的本地机器复制到 S3 存储桶。

备注:要运行以下命令,您需要具有 AWS命令行界面(AWS CLI) 安装。

tar -czvf model.tar.gz model.pt
aws s3 cp model.tar.gz $MODEL_ARTIFACTS_FILE_NAME

接下来,我们将输入图像复制到 S3。 下面是图像的完整 S3 路径。

car_image_path = os.path.join(DATA_PATH, IMAGE_NAME)

我们可以使用另一个 aws s3 cp 命令将此图像复制到 S3。

aws s3 cp cars.jpg $car_image_path

第 4 步:构建 ML 模型推理脚本

现在我们将检查我们的入口点文件, inference.py 模块。 我们可以使用 PyTorchModel 类部署在 SageMaker 外部训练的 PyTorch 模型。 首先,我们实例化 PyTorchModelZoo 对象。 然后,我们将构建一个 inference.py 入口点文件,以使用 SageMaker 批量转换对托管在 Amazon S3 中的示例数据执行 ML 推理。

了解 PyTorchModel 对象

火炬模型 SageMaker Python API 中的类允许我们使用下载的模型工件执行 ML 推理。

要启动 PyTorchModel 类,我们需要了解以下输入参数:

  • name: 型号名称; 我们建议使用型号名称 + 日期时间,或随机字符串 + 日期时间以确保唯一性。
  • model_data:打包的 ML 模型工件的 S3 URI。
  • entry_point:一个用户定义的 Python 文件,供推理 Docker 映像使用以定义传入请求的处理程序。 该代码定义了模型加载、输入预处理、预测逻辑和输出后处理。
  • framework_version: 需要设置为 1.2 或更高版本才能启用自动 PyTorch 模型重新打包。
  • source_dir:入口点文件的目录。
  • role:发出 AWS 服务请求的 IAM 角色。
  • image_uri:使用此 Amazon ECR Docker 容器映像作为 ML 模型计算环境的基础。
  • sagemaker_session:SageMaker 会话。
  • py_version: 要使用的 Python 版本

以下代码片段实例化 PyTorchModel 类以使用预训练的 PyTorch 模型执行推理:

model = PyTorchModel(
               name=RANDOM_STRING,
               model_data=MODEL_ARTIFACTS_FILE_NAME,
               entry_point=ENTRY_POINT_FILE_NAME,
               framework_version=FRAMEWORK_VERSION,
               role=SAGEMAKER_EXECUTION_ROLE_ARN,
               sagemaker_session=sagemaker_session,
               image_uri=IMAGE_URI,
        )

了解入口点文件 (inference.py)

entry_point 参数指向一个名为 inference.py. 此入口点定义模型加载、输入预处理、预测逻辑和输出后处理。 它补充了预构建 PyTorch 中的 ML 模型服务代码 SageMaker 深度学习容器 图片。

Inference.py 将包含以下功能。 在我们的示例中,我们实现了 model_fn, input_fn, predict_fnoutput_fn 功能覆盖 默认 PyTorch 推理处理程序.

  1. model_fn:在推理图像中获取包含静态模型检查点的目录。 从指定路径打开并加载模型并返回 PyTorch 模型。
  2. input_fn: 将传入请求的有效负载 (request_body) 和传入请求的内容类型 (request_content_type) 作为输入。 处理数据解码。 这个函数需要根据模型期望的输入进行调整。
  3. predict_fn:在 input_fn 中反序列化的数据上调用模型。 使用加载的 ML 模型对反序列化对象执行预测。
  4. output_fn:将预测结果序列化为所需的响应内容类型。 将从 predict_fn 函数获得的预测转换为 JSON、CSV 或 NPY 格式。

第 5 步:启动 SageMaker 批量转换作业

对于此示例,我们将通过 SageMaker 批量转换作业获取 ML 推理结果。 当我们想要一次从数据集中获取推论而不需要持久端点时,批量转换作业最有用。 我们实例化一个 sagemaker.transformer.变形金刚 用于创建 SageMaker 批量转换作业并与之交互的对象。

transformer = model.transformer(instance_type=INSTANCE_TYPE, 
                                instance_count=INSTANCE_COUNT
                                )
transformer.transform(data=DATA_PATH,
                      data_type="S3Prefix",
                      content_type="application/x-image",
                      wait=True
                      )

请参阅有关创建批量转换作业的文档,网址为 创建转换作业.

第 6 步:可视化结果

SageMaker 批量转换作业完成后,我们可以从 Amazon S3 加载 ML 推理输出。 为此,导航到 AWS管理控制台 并搜索 Amazon SageMaker。 在左侧面板的下方 推理,请参阅 批量转换作业.

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。

选择后 批量转换,请参阅列出所有 SageMaker 批量转换作业的网页。 我们可以查看我们最近的作业执行进度。

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。

首先,作业的状态为“进行中”。 完成后,看到状态更改为已完成。

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。

状态标记为已完成后,我们可以单击该作业以查看结果。 该网页包含作业摘要,包括我们刚刚执行的作业的配置。

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。

输出数据配置,我们将看到 S3 输出路径。 这是我们将找到 ML 推理输出的地方。

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。

选择 S3 输出路径并查看包含我们输出数据的 [image_name].[file_type].out 文件。 我们的输出文件将包含一个映射列表。 示例输出:

[
  {
    "boxes": [
      [
        214.32322692871094,
        192.18418884277344,
        830.3932495117188,
        521.6996459960938
      ],
      [
        235.6244354248047,
        301.3315734863281,
        253.6448516845703,
        312.3525695800781
      ],
      [
        183.92031860351562,
        291.7759704589844,
        207.28196716308594,
        312.1448669433594
      ],
    ],
    "labels": [
      3,
      3,
      9,
    ],
    "scores": [
      0.8823906183242798,
      0.7710548639297485,
      0.4969744384288788,
    ]
  }
]

为了可视化这些预测,我们首先从我们的转换器对象中读取输出路径。

def get_output_from_s3(s3uri, file_name):
    parsed_url = urlparse(s3uri)
    bucket_name = parsed_url.netloc
    prefix = parsed_url.path[1:]
    s3 = boto3.resource('s3')
    obj = s3.Object(bucket_name, '{}/{}'.format(prefix, file_name))
    return obj.get()["Body"].read().decode('utf-8')
    
# Output path from Batch Transform job
output_path = transformer.output_path

# Get the output file from S3
predictions = get_output_from_s3(output_path, "car.jpg.out")

接下来,我们处理这个输出文件并可视化我们的预测。 下面我们指定我们的置信度阈值。 我们从 COCO 数据集对象映射。 在推理过程中,模型只需要输入张量并将后处理的预测作为 List[Dict[Tensor]] 返回,每个输入图像一个。 Dict的字段如下,其中N为检测次数:

  1. boxes (FloatTensor[N, 4]): 中的预测框 [x1, y1, x2, y2] 格式,带有 0 <= x1 < x2 <= W and 0 <= y1 < y2 <= H,其中 W 是图像的宽度和 H 是图像的高度
  2. 标签 (Int64Tensor[N]): 每次检测的预测标签
  3. 得分(Tensor[N]): 每次检测的预测分数

有关输出的更多详细信息,请参阅 PyTorch Faster R-CNN FPN 文档.

模型输出包含具有各自置信度分数的边界框。 我们可以通过删除模型不自信的边界框来优化显示误报。 以下代码片段处理输出文件中的预测,并在分数高于置信度阈值的预测上绘制边界框。 我们设置概率阈值, CONF_THRESH, 本例为 .75。

def procress_batch_transform_output(predictions):
    predictions = eval(predictions)
    for pred in predictions[1:]:
        pred = pred[0]
        boxes = np.array(pred["boxes"])
        labels = np.array(pred["labels"])
        scores = np.array(pred["scores"])

        scores_idx = scores >= CONF_THRESH
        boxes_meet = boxes[scores_idx, :]
        labels_meet = labels[scores_idx]
        scores_meet = scores[scores_idx]

        labels_str = [CLASSES[i] for i in labels_meet]
        
        # Return a tuple containing labels, label index, score, and bounding box
        processed_predictions =  list(zip(labels_str, labels_meet, scores_meet, boxes_meet))
        return processed_predictions
    
    
def visualize_batch_transform_output(input_image, processed_predictions):
    # read input image from computer
    img = read_image(input_image)
    for label, label_index, score, box in processed_predictions:
        label = label + ", score: " + str(round(score, 2))
        # draw bounding box and fill color
        box = torch.tensor(box)
        box = box.unsqueeze(0)
        img = draw_bounding_boxes(img, box, width=5,labels=[label], font_size=16)

    # transform this image to PIL image
    img = torchvision.transforms.ToPILImage()(img)

    # display output
    img.show()

# Process the predictions in the output file
processed_predictions = procress_batch_transform_output(predictions)
visualize_batch_transform_output("car.jpg", processed_predictions)

最后,我们可视化这些映射以了解我们的输出。

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。

备注:如果图像没有显示在您的笔记本中,请在 JupyterLab 左侧的目录树中找到它并从那里打开它。

运行示例代码

要获得完整的工作示例,请将代码克隆到 amazon-sagemaker-examples · GitHub 并运行单元格 create_pytorch_model_sagemaker.ipynb 笔记本电脑。

结论

在这篇博文中,我们展示了一个端到端的示例,该示例使用 SageMaker 批量转换使用 PyTorch Model Zoo 中的对象检测模型执行 ML 推理。 我们介绍了加载 Faster R-CNN 对象检测模型权重、将它们保存到 S3 存储桶、编写入口点文件以及了解 PyTorchModel API 中的关键参数。 最后,我们部署了模型并执行了 ML 模型推理,将模型输出可视化,并学习了如何解释结果。


作者简介

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。迪皮卡库拉尔 是 ML 工程师 亚马逊机器学习解决方案实验室. 她帮助客户集成 ML 解决方案来解决他们的业务问题。 最近,她为媒体客户建立了培训和推理管道,并为营销建立了预测模型。

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。马塞洛·阿伯勒 是 AWS AI 组织的 ML 工程师。 他正在领导 MLOps 的工作 亚马逊机器学习解决方案实验室,帮助客户设计和实施可扩展的 ML 系统。 他的使命是指导客户进行企业 ML 之旅,并加速他们的 ML 生产路径。

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。尼娜·库卡尼(Ninad Kulkarni) 是一名应用科学家 亚马逊机器学习解决方案实验室. 他通过构建解决业务问题的解决方案来帮助客户采用 ML 和 AI。 最近,他为体育、汽车和媒体客户建立了预测模型。

使用 PyTorch Model Zoo PlatoBlockchain 数据智能创建 Amazon SageMaker 模型。 垂直搜索。 人工智能。亚什沙 是科学经理 Amazon ML 解决方案实验室。 他和他的应用科学家和机器学习工程师团队致力于医疗保健、体育、汽车和制造领域的一系列机器学习用例。

时间戳记:

更多来自 AWS机器学习