使用 Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence 运行图像分割。 垂直搜索。 哎。

使用 Amazon SageMaker JumpStart 运行图像分割

十二月2020, AWS 宣布 一般可用 亚马逊SageMaker JumpStart, 的能力 亚马逊SageMaker 帮助您快速轻松地开始使用机器学习 (ML)。 JumpStart 提供跨流行 ML 任务的各种预训练模型的一键式微调和部署,以及一系列解决常见业务问题的端到端解决方案。 这些功能消除了 ML 流程每个步骤的繁重工作,从而更容易开发高质量模型并缩短部署时间。

这篇文章是关于将 JumpStart 用于特定 ML 任务的系列文章的第三篇。 在里面 第一篇文章,我们展示了如何在 JumpStart 上运行图像分类用例。 在里面 第二篇文章,我们展示了如何在 JumpStart 上运行文本分类用例。 在这篇文章中,我们将逐步介绍如何使用来自 MXNet 的训练模型来微调和部署图像分割模型。 我们探索了两种获得相同结果的方法:通过 JumpStart 的图形界面 亚马逊SageMaker Studio,并以编程方式通过 JumpStart API.

如果您想直接跳转到我们在这篇文章中解释的 JumpStart API 代码,您可以参考以下示例 Jupyter 笔记本:

JumpStart 概述

JumpStart 可帮助您开始使用 ML 模型完成各种任务,而无需编写任何代码。 在撰写本文时,JumpStart 使您能够执行以下操作:

  • 为常见的 ML 任务部署预训练模型 – JumpStart 通过提供在大型、公开可用的数据集上预训练的模型的简单部署,使您无需开发工作即可解决常见的 ML 任务。 ML 研究社区投入了大量精力,使大多数最近开发的模型可供公众使用。 JumpStart 托管了 300 多个模型的集合,涵盖了 15 个最流行的 ML 任务,例如对象检测、文本分类和文本生成,使初学者可以轻松使用它们。 这些模型来自流行的模型中心,例如 TensorFlow、PyTorch、Hugging Face 和 MXNet。
  • 微调预训练模型 – JumpStart 允许您微调预训练模型,而无需编写自己的训练算法。 在 ML 中,将在一个领域学到的知识转移到另一个领域的能力称为 转移学习. 您可以使用迁移学习在较小的数据集上生成准确的模型,其训练成本比训练原始模型所涉及的成本低得多。 JumpStart 还包括基于 LightGBM、CatBoost、XGBoost 和 Scikit-learn 的流行训练算法,您可以从头开始训练这些算法以进行表格回归和分类。
  • 使用预先构建的解决方案 – JumpStart 为常见的 ML 用例提供了一组 17 个解决方案,例如需求预测以及工业和金融应用程序,您只需单击几下即可部署这些解决方案。 解决方案是端到端的 ML 应用程序,将各种 AWS 服务组合在一起以解决特定的业务用例。 他们使用 AWS CloudFormation 用于快速部署的模板和参考架构,这意味着它们是完全可定制的。
  • 请参阅 SageMaker 算法的笔记本示例 – SageMaker 提供了一套内置算法来帮助数据科学家和机器学习从业者快速开始训练和部署机器学习模型。 JumpStart 提供了示例笔记本,您可以使用它们来快速使用这些算法。
  • 查看培训视频和博客 – JumpStart 还提供大量博客文章和视频,教您如何使用 SageMaker 中的不同功能。

JumpStart 接受自定义 VPC 设置和 AWS密钥管理服务 (AWS KMS) 加密密钥,因此您可以在企业环境中安全地使用可用的模型和解决方案。 您可以在 Studio 中或通过 SageMaker Python SDK 将您的安全设置传递给 JumpStart。

语义分割

语义分割描绘了输入图像中出现的每一类对象。 它使用来自预定义类集的类标签标记(分类)输入图像的每个像素。 同一类的多个对象映射到同一个掩码。

可用于微调的模型在基础网络之上构建了一个全卷积网络(FCN)“头”。 微调步骤微调 FCNHead,同时保持模型其余部分的参数冻结,并返回微调后的模型。 目标是最小化每个像素的 softmax 交叉熵损失来训练 FCN。 微调返回的模型可以进一步部署用于推理。

如果训练数据包含两个图像,则输入目录应类似于以下代码。 .png 文件的名称可以是任何名称。

input_directory
    |--images
        |--abc.png
        |--def.png
    |--masks
        |--abc.png
        |--def.png
    class_label_to_prediction_index.json

掩码文件应具有每个像素的类标签信息。

实例细分

实例分割检测并描绘图像中出现的每个不同的感兴趣对象。 它使用实例标签标记每个像素。 语义分割将相同的标签分配给同一类的多个对象的像素,而实例分割进一步用单独的标签标记与图像上每个对象的出现相对应的像素。

目前,JumpStart 为实例分割提供仅推理模型,不支持微调。

下图说明了语义分割和实例分割中的推理之间的区别。 原始图像中有两个人。 语义分割将图像中的多个人视为一个实体: Person. 但是,实例分割可以识别 Person 类别。

解决方案概述

以下部分提供了通过 Studio UI 和 JumpStart API 使用 JumpStart 执行语义分割的分步演示。

我们执行以下步骤:

  1. 通过 Studio UI 访问 JumpStart:
    1. 在预训练模型上运行推理。
    2. 微调预训练模型。
  2. 通过 SageMaker Python SDK 以编程方式使用 JumpStart:
    1. 在预训练模型上运行推理。
    2. 微调预训练模型。

我们还讨论了 JumpStart 的其他高级功能。

通过 Studio UI 访问 JumpStart

在本节中,我们将演示如何通过 Studio UI 训练和部署 JumpStart 模型。

在预训练模型上运行推理

以下视频向您展示了如何在 JumpStart 上找到预训练的语义分割模型并进行部署。 模型页面包含有关模型的有价值信息、如何使用它、预期的数据格式以及一些微调细节。 您可以部署 JumpStart 中可用的任何预训练模型。 对于推理,我们选择 ml.g4dn.xlarge 实例类型。 它提供了低推理延迟所需的 GPU 加速,但价格更低。 配置 SageMaker 托管实例后,选择 部署. 可能需要 5-10 分钟,直到您的持久端点启动并运行。

几分钟后,您的端点即可运行并准备好响应推理请求。

同样,您可以按照前面视频中的相同步骤部署预训练的实例分割模型,同时在 JumpStart 搜索栏中搜索实例分割而不是语义分割。

微调预训练模型

以下视频展示了如何在 JumpStart 中查找和微调语义分割模型。 在视频中,我们使用 PennFudanPed 数据集,在 JumpStart 中默认提供,您可以在 Apache 2.0 许可证.

对您自己的数据集进行微调涉及采用正确的数据格式(如模型页面所述),将其上传到 亚马逊简单存储服务 (Amazon S3),并在数据源配置中指定其位置。 我们使用默认设置的相同超参数值(时期数、学习率和批量大小)。 我们还使用 GPU 支持的 ml.p3.2xlarge 作为 SageMaker 训练实例。

您可以直接在 Studio 控制台上监控正在运行的训练作业,并在完成时收到通知。 训练完成后,您可以从包含训练作业详细信息的同一页面部署微调模型。 部署工作流程与部署预训练模型相同。

通过 SageMaker SDK 以编程方式使用 JumpStart

在前面的部分中,我们展示了如何使用 JumpStart UI 部署预训练模型并以交互方式对其进行微调,只需单击几下即可。 但是,您也可以通过使用集成到 SageMaker SDK 中的 API 以编程方式使用 JumpStart 的模型和轻松的微调。 我们现在通过一个快速示例来说明如何复制前面的过程。 此演示中的所有步骤都可以在随附的笔记本中找到 JumpStart 简介 – 实例分割JumpStart 简介 – 语义分割.

在预训练模型上运行推理

在本节中,我们在 JumpStart 中选择一个合适的预训练模型,将该模型部署到 SageMaker 端点,并在部署的端点上运行推理。

SageMaker 是一个基于 Docker 容器的平台。 JumpStart 使用可用的特定于框架的 SageMaker 深度学习容器 (DLC)。 我们获取任何额外的包以及脚本来处理所选任务的训练和推理。 最后,预先训练的模型工件分别与 model_uris,这为平台提供了灵活性。 您可以通过单个训练或推理脚本使用为同一任务预训练的任意数量的模型。 请参阅以下代码:

model_id, model_version = "mxnet-semseg-fcn-resnet50-ade", "*"

# Retrieve the inference docker container uri
deploy_image_uri = image_uris.retrieve(
    region=None,
    framework=None,  # automatically inferred from model_id
    image_scope="inference",
    model_id=model_id,
    model_version=model_version,
    instance_type=inference_instance_type,
)

# Retrieve the inference script uri
deploy_source_uri = script_uris.retrieve(model_id=model_id, model_version=model_version, script_scope="inference")

base_model_uri = model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="inference")

例如实例分割,我们可以设置 model_idmxnet-semseg-fcn-resnet50-ade. 标识符中的 is 对应于实例分割。

接下来,我们将资源输入到 SageMaker 模型 实例化并部署端点:

# Create the SageMaker model instance
model = Model(
    image_uri=deploy_image_uri,
    source_dir=deploy_source_uri,
    model_data=base_model_uri,
    entry_point="inference.py",  # entry point file in source_dir and present in deploy_source_uri
    role=aws_role,
    predictor_cls=Predictor,
    name=endpoint_name,
)

# deploy the Model. Note that we need to pass Predictor class when we deploy model through Model class,
# for being able to run inference through the sagemaker API.
base_model_predictor = model.deploy(
    initial_instance_count=1,
    instance_type=inference_instance_type,
    predictor_cls=Predictor,
    endpoint_name=endpoint_name,
)

几分钟后,我们的模型就部署好了,我们可以实时从中得到预测!

下面的代码片段让您一瞥语义分割的样子。 每个像素的预测掩码被可视化。 要从已部署的模型中获取推论,需要以二进制格式提供输入图像。 端点的响应是图像中每个像素的预测标签。 我们使用 query_endpointparse_response 辅助函数,定义在 随身笔记本:

query_response = query(base_model_predictor, pedestrian_img)
predictions, labels, image_labels = parse_response(query_response)
print("Objects present in the picture:", image_labels)

微调预训练模型

要微调选定的模型,我们需要获取该模型的 URI,以及用于训练的训练脚本和容器映像的 URI。 值得庆幸的是,这三个输入仅取决于模型名称、版本(有关可用模型的列表,请参阅 JumpStart 可用型号表),以及您要训练的实例类型。 下面的代码片段演示了这一点:

from sagemaker import image_uris, model_uris, script_uris

model_id, model_version = "mxnet-semseg-fcn-resnet50-ade", "*"
training_instance_type = "ml.p3.2xlarge"
train_image_uri = image_uris.retrieve(
    region=None,
    framework=None,
    model_id=model_id,
    model_version=model_version,
    image_scope="training",
    instance_type=training_instance_type,)# Retrieve the training script

train_source_uri = script_uris.retrieve(model_id=model_id, model_version=model_version, script_scope="training")# Retrieve the pre-trained model tarball to further fine-tune

train_model_uri = model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="training")

我们检索 model_id 对应于我们之前使用的相同模型。 您现在可以使用 SageMaker SDK 在您自己的自定义数据集上微调此 JumpStart 模型。 我们使用一个公开托管在 Amazon S3 上的数据集,方便地专注于语义分割。 如上一节所述,数据集的结构应进行微调。 请参阅以下示例代码:

# URI of your training dataset
training_data_bucket = f"jumpstart-cache-prod-{aws_region}"
training_data_prefix = "training-datasets/PennFudanPed_SemSeg/"
training_dataset_s3_path = f"s3://{training_data_bucket}/{training_data_prefix}"
training_job_name = name_from_base(f"jumpstart-example-{model_id}-transfer-learning")# Create SageMaker Estimator instance
semseg_estimator = Estimator(
    role=aws_role,
    image_uri=train_image_uri,
    source_dir=train_source_uri,
    model_uri=train_model_uri,
    entry_point="transfer_learning.py",
    instance_count=1,
    instance_type=training_instance_type,
    max_run=360000,
    hyperparameters=hyperparameters,
    output_path=s3_output_location,)# Launch a SageMaker Training job by passing s3 path of the training data
semseg_estimator.fit({"training": training_dataset_s3_path}, logs=True)

我们为我们选择的模型获得了与我们在上一节中看到的相同的默认超参数,使用 sagemaker.hyperparameters.retrieve_default(). 然后我们实例化一个 SageMaker 估计器并调用 .fit 方法开始微调我们的模型,将 Amazon S3 URI 传递给我们的训练数据。 这 entry_point 提供的脚本名为 transfer_learning.py(其他任务和模型相同),并将输入数据通道传递给 .fit 必须命名 training.

在算法训练时,您可以在运行代码本身的 SageMaker 笔记本中或在 亚马逊CloudWatch. 训练完成后,微调的模型工件将上传到训练配置中指定的 Amazon S3 输出位置。 您现在可以以与预训练模型相同的方式部署模型。

高级功能

除了微调和部署预训练模型之外,JumpStart 还提供了许多高级功能。

第一个是 自动模型调整。 这允许您自动调整您的 ML 模型,以在通过 SageMaker API 提供的范围内找到具有最高准确度的超参数值。

第二个是 增量训练. 这使您可以使用扩展数据集训练已经微调的模型,该扩展数据集包含以前的微调运行中未考虑的基础模式,这会导致模型性能不佳。 增量训练可以节省时间和资源,因为您不需要从头开始重新训练模型。

结论

在这篇文章中,我们展示了如何微调和部署预训练的语义分割模型,以及如何使用 JumpStart 使其适应实例分割。 您无需编写代码即可完成此操作。 自行尝试解决方案并将您的意见发送给我们。

要了解有关 JumpStart 以及如何将开源预训练模型用于各种其他 ML 任务的更多信息,请查看以下内容 AWS re:Invent 2020 视频.


作者简介

使用 Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence 运行图像分割。 垂直搜索。 哎。Vivek Madan 博士 是 Amazon SageMaker JumpStart 团队的一名应用科学家。 他在伊利诺伊大学厄巴纳-香槟分校获得博士学位,并且是乔治亚理工学院的博士后研究员。 他是机器学习和算法设计方面的活跃研究员,并在 EMNLP、ICLR、COLT、FOCS 和 SODA 会议上发表过论文。

使用 Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence 运行图像分割。 垂直搜索。 哎。桑托什·库尔卡尼 是 Amazon Web Services 的企业解决方案架构师,与澳大利亚的体育客户合作。 他热衷于利用他在 AI/ML、大数据和软件开发方面的知识构建大型分布式应用程序来解决业务问题。

使用 Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence 运行图像分割。 垂直搜索。 哎。莱昂纳多·巴切加 是 Amazon SageMaker JumpStart 团队的高级科学家和经理。 他热衷于为计算机视觉构建人工智能服务。

时间戳记:

更多来自 AWS机器学习