训练、编译和打包模型 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

训练、编译和打包模型

在本部分中,您将创建 SageMaker 和Amazon IoT客户端对象、下载预训练的机器学习模型、将模型上传到 Amazon S3 存储桶、使用 SageMaker Neo 为您的目标设备编译模型,然后打包模型,以便使用 Edge Manager 代理进行部署。

  1. 导入库并创建客户端对象。

    本教程使用Amazon SDK for Python (Boto3)创建客户端,以便与 SageMaker、Amazon S3 和Amazon IoT.

    导入 Bto3,指定您的区域,并初始化您需要的客户端对象,如以下示例所示:

    import boto3 import json import time AWS_REGION = 'us-west-2'# Specify your Region bucket = 'bucket-name' sagemaker_client = boto3.client('sagemaker', region_name=AWS_REGION) iot_client = boto3.client('iot', region_name=AWS_REGION)

    定义变量并为它们分配您为 SageMaker 和Amazon IoT字符串:

    # Replace with the role ARN you created for SageMaker sagemaker_role_arn = "arn:aws:iam::<account>:role/*" # Replace with the role ARN you created for Amazon IoT. # Note: The name must start with 'SageMaker' iot_role_arn = "arn:aws:iam::<account>:role/SageMaker*"
  2. 训练机器学习模型。

    请参阅使用 Amazon SageMaker 训练模型,了解有关如何使用 SageMaker 训练机器学习模型的更多信息。您可以选择性地将本地培训的模型直接上传到 Amazon S3 URI 存储桶中。

    如果您还没有模型,请使用wget命令获取使用 Darknet 神经网络框架的您只查看一次 (YOLO) 算法的本地副本。特别是,我们将得到一个小型 Yolov3 模型的副本。一般来说,YOLO 不够快,无法在边缘设备上运行。相反,下载丁尼-约洛。其较小的型号尺寸和推理速度使其成为边缘设备的理想选择。有关 YOLO 的更多信息,请参阅YOLO:实时目标检测.

    在您的 Jupyter 笔记本中键入以下内容,以获取 Tiny-Yolo 的副本:

    !wget -O yolov3-tiny.cfg https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg?raw=true !wget https://pjreddie.com/media/files/yolov3-tiny.weights

    这给了我们的权重(yolov3-tiny.weights) 和配置文件 (yolov3-tiny.weights)的 Tiny-Yolo 模型。在打包模型之前,您需要先编译您的模型 SageMaker Neo。SageMaker Neo 要求将模型存储为压缩的 TAR 文件。将其重新打包为压缩的 TAR 文件(.tar.gz):

    # Package YOLO model into a TAR file import tarfile tarfile_name='yolov3-tiny.tar.gz' with tarfile.open(tarfile_name, mode='w:gz') as archive: archive.add('yolov3-tiny.weights') archive.add('yolov3-tiny.cfg')
  3. 将模型上传到 Amazon S3。

    在您拥有机器学习模型后,将其存储在 Amazon S3 存储桶中。以下示例使用Amazon CLI命令将模型上传 Amazon S3 之前在名为型号. 在 Jupyter 笔记本中键入以下内容:

    # Move model artifacts to models directory !mkdir models !mv yolov3* models/
    !aws s3 cp models/yolov3-tiny.tar.gz s3://{bucket}/models/
  4. 使用 SageMaker Neo 编译您的模型。

    使用 SageMaker Neo 为边缘设备编译您的机器学习模型。您需要了解存储训练模型的 Amazon S3 存储桶 URI、用于训练模型的机器学习框架、模型输入的形状以及目标设备。

    对于模型,请使用以下内容:

    framework = 'darknet' target_device = 'jetson_nano' data_shape = '{"data":[1,3,416,416]}'

    SageMaker Neo 需要基于您使用的深度学习框架的特定模型输入形状和模型格式。有关如何保存模型的更多信息,请参阅 “”。SageMaker Neo 需要什么输入数据形状?. 有关 Neo 支持的设备和框架的更多信息,请参阅支持的框架、设备、系统和体系结构.

    使用CreateCompilationJobAPI 与 SageMaker Neo 创建编译作业。为编译作业、SageMaker 角色 ARN、存储模型的 Amazon S3 URI、模型的输入形状、框架名称、希望 SageMaker 存储已编译模型的 Amazon S3 URI 以及边缘设备目标提供一个名称。

    # Specify the path where your model is stored model_directory = 'models' s3_model_uri = 's3://{}/{}/{}'.format(bucket, model_directory, tarfile_name) # Store compiled model in S3 within the 'compiled-models' directory compilation_output_dir = 'compiled-models' s3_output_location = 's3://{}/{}/'.format(bucket, compilation_output_dir) # Give your compilation job a name compilation_job_name = 'getting-started-demo' sagemaker_client.create_compilation_job(CompilationJobName=compilation_job_name, RoleArn=sagemaker_role_arn, InputConfig={ 'S3Uri': s3_model_uri, 'DataInputConfig': data_shape, 'Framework' : framework.upper()}, OutputConfig={ 'S3OutputLocation': s3_output_location, 'TargetDevice': target_device}, StoppingCondition={'MaxRuntimeInSeconds': 900})
  5. 打包您的编译模型。

    打包作业采用 SageMaker NEO 编译的模型,并进行任何必要的更改,以便使用推断引擎边缘管理器代理来部署模型。要打包模型,请使用create_edge_packagingAPI 或 SageMaker 控制台。

    您需要提供您用于 Neo 编译作业的名称、打包作业的名称、角色 ARN(请参阅设置部分)、模型的名称、模型版本以及打包作业输出的 Amazon S3 存储桶 URI。请注意,Edge Manager 打包作业名称区分大小写。以下示例说明如何使用 API 创建打包作业。

    edge_packaging_name='edge-packaging-demo' model_name="sample-model" model_version="1.1"

    定义要将打包模型存储在的 Amazon S3 URI。

    # Output directory where you want to store the output of the packaging job packaging_output_dir = 'packaged_models' packaging_s3_output = 's3://{}/{}'.format(bucket, packaging_output_dir)

    使用CreateEdgePackagingJob来打包新编译的模型。为边缘打包作业提供一个名称以及为编译作业提供的名称(在本示例中,该名称存储在compilation_job_name)。还提供模型的名称、模型的版本(用于帮助您跟踪正在使用的模型版本)以及希望 SageMaker 存储打包模型的 S3 URI。

    sagemaker_client.create_edge_packaging_job( EdgePackagingJobName=edge_packaging_name, CompilationJobName=compilation_job_name, RoleArn=sagemaker_role_arn, ModelName=model_name, ModelVersion=model_version, OutputConfig={ "S3OutputLocation": packaging_s3_output } )