使用 Amazon SageMaker 上的 TorchServe 动态批量推理优化推理作业

源节点: 1884601

在深度学习中,批处理是指将多个输入输入到一个模型中。 尽管它在训练期间很重要,但在推理期间管理成本和优化吞吐量也非常有帮助。 硬件加速器针对并行性进行了优化,批处理有助于使计算容量饱和并通常会带来更高的吞吐量。

在生产模型部署期间,批处理在多种情况下很有用。 在这里,我们将它们大致分为两个用例:

  • 实时应用程序,其中从不同的客户端接收多个推理请求,并动态批处理并提供给服务模型。 在这些用例中,延迟通常很重要。
  • 离线应用程序,其中多个输入或请求在客户端进行批处理并发送到服务模型。 更高的吞吐量通常是这些用例的目标,这有助于管理成本。 示例用例包括视频分析和模型评估。

亚马逊SageMaker 为您的推理作业提供两个流行的选项。 对于实时应用程序,SageMaker Hosting 使用 TorchServe 作为后端服务库来处理接收到的请求的动态批处理。 对于离线应用程序,您可以使用 SageMaker 批量转换作业。 在这篇文章中,我们通过每个选项的示例来帮助您入门。

因为 TorchServe 是原生的 与 SageMaker 集成 通过 SageMaker PyTorch 推理工具包,您可以使用 SageMaker 托管轻松地将 PyTorch 模型部署到 TorchServe 上。 有时您可能还需要使用自定义 Docker 映像进一步自定义您的环境。 在本文中,我们首先展示了如何使用本机 SageMaker PyTorch 推理工具包部署实时端点并配置批处理大小以优化吞吐量。 在第二个示例中,我们演示了如何使用自定义 Docker 映像来配置高级 TorchServe 配置,这些配置不能用作环境变量来优化您的批处理推理作业。

批量推理的最佳实践

批处理可以提高吞吐量并优化您的资源,因为它有助于在一定时间内以延迟为代价完成大量推理。 为了优化模型部署以获得更高的吞吐量,一般准则是增加批处理大小直到吞吐量下降。 这通常适合离线应用程序,其中对多个输入(例如视频帧、图像或文本)进行批处理以获得预测输出。

对于实时应用程序,延迟通常是一个主要问题。 在更高的吞吐量与增加的批处理大小和延迟之间需要权衡; 您可能需要根据需要进行调整以满足您的延迟 SLA。 就云上的最佳实践而言,每一定数量的推理的成本是做出满足您业务需求的明智决策的有用指南。 管理成本的一个影响因素是选择合适的加速器。 有关详细信息,请参阅 使用 Amazon SageMaker 为计算机视觉推理选择最佳 AI 加速器和模型编译.

SageMaker 上的 TorchServe 动态批处理

火炬服务 是用于大规模生产模型服务的原生 PyTorch 库。 这是 Facebook 和 AWS 的联合开发。 TorchServe 允许您监控、添加自定义指标、支持多个模型、通过安全管理 API 增加和减少工作人员数量,并提供推理和解释端点。

为了支持批处理,TorchServe 提供了动态批处理功能。 它在指定的时间范围内聚合接收到的请求,将它们一起批处理,然后发送批处理进行推理。 接收到的请求通过 处理程序 在火炬服务中。 TorchServe 有几个默认处理程序,如果您的用例未涵盖,欢迎您编写自定义处理程序。 使用自定义处理程序时,请确保已在处理程序中实现批处理推理逻辑。 具有批量推理支持的自定义处理程序示例可在 GitHub上.

您可以使用两个设置配置动态批处理, batch_sizemax_batch_delay,通过 SageMaker 中的环境变量或通过 config.properties TorchServe 中的文件(如果使用自定义容器)。 TorchServe 使用最先出现的任何设置,最大批量大小(batch_size) 或指定时间窗口等待批次请求通过 max_batch_delay.

通过 TorchServe 与 SageMaker 的集成,您现在可以在 SageMaker 上本地部署 PyTorch 模型,您可以在其中定义 SageMaker PyTorch 模型。 您可以在作为入口点传递给 SageMaker PyTorch 的脚本中添加自定义模型加载、推理以及预处理和后处理逻辑(请参阅以下示例代码)。 或者,您可以使用自定义容器来部署您的模型。 有关详细信息,请参阅 SageMaker PyTorch 模型服务器.

您可以通过环境变量在 SageMaker 上设置 PyTorch 模型的批量大小。 如果您选择使用自定义容器,您可以捆绑 设置 in config.properties 在 TorchServe 中打包模型时使用模型。 以下代码片段显示了如何使用环境变量设置批量大小以及如何在 SageMaker 上部署 PyTorch 模型的示例:

from SageMaker.pytorch.model import PyTorchModel env_variables_dict = { "SAGEMAKER_TS_BATCH_SIZE": "3", "SAGEMAKER_TS_MAX_BATCH_DELAY": "100000"
} pytorch_model = PyTorchModel( model_data=model_artifact, role=role, source_dir="code", framework_version='1.9', entry_point="inference.py", env=env_variables_dict
) predictor = pytorch_model.deploy(initial_instance_count=1, instance_type="ml.c5.2xlarge", serializer=SageMaker.serializers.JSONSerializer(), deserializer=SageMaker.deserializers.BytesDeserializer())

在代码片段中, model_artifact 指的是加载回训练模型所需的所有文件,这些文件存档在 .tar 文件中并推入 亚马逊简单存储服务 (亚马逊 S3)桶。 inference.py 类似于 TorchServe 自定义处理程序; 它有几个函数,您可以覆盖这些函数以适应模型初始化、接收请求的预处理和后处理以及推理逻辑。

下列 笔记本 展示了部署 Hugging Face BERT 模型的完整示例。

如果需要自定义容器,可以构建自定义容器镜像并推送到 Amazon Elastic Container注册 (亚马逊 ECR)存储库。 在这种情况下,模型工件可以是一个 TorchServe .mar 文件,它将模型工件与处理程序捆绑在一起。 我们将在下一节中使用 SageMaker 批量转换作业来演示这一点。

SageMaker 批量转换作业

对于从数据集等数据源批处理请求的离线用例,SageMaker 提供 批量转换作业. 这些作业使您能够从 S3 存储桶读取数据并将结果写入目标 S3 存储桶。 有关详细信息,请参阅 使用批量转换从大型数据集中获取推论. 可以在下面找到使用批量转换作业的批量推理的完整示例 笔记本,我们使用了来自 FLORES 竞赛的机器翻译模型。 在此示例中,我们展示了如何使用自定义容器通过 SageMaker 对我们的模型进行评分。 使用自定义推理容器允许您进一步自定义 TorchServe 配置。 在此示例中,我们想要更改和禁用 JSON 解码,我们可以通过 TorchServe 来完成 config.properties 文件中。

当为 TorchServe 使用自定义处理程序时,我们需要确保处理程序实现批处理推理逻辑。 每个处理程序都可以具有自定义函数来执行预处理、推理和后处理。 具有批量推理支持的自定义处理程序示例可在 GitHub上.

我们使用自定义容器将模型工件与处理程序捆绑在一起,就像我们在 TorchServe 中所做的那样(制作一个 .mar 文件). 我们还需要一个 Docker 容器的入口点,该容器启动 TorchServe,其中设置了批量大小和 JSON 解码 config.properties. 我们在示例中演示了这一点 笔记本.

SageMaker 批量转换作业需要访问 S3 存储桶中的输入文件,它将输入文件分成小批次并将它们发送以进行推理。 配置批量转换作业时请考虑以下几点:

  • 将输入文件(例如数据集)放在 S3 存储桶中,并在作业设置中将其设置为数据源。
  • 分配用于保存批量转换作业结果的 S3 存储桶。
  • 批量策略MultiRecordSplitTypeLine 如果您需要批量转换作业从输入文件生成小批量。 如果它不能自动将数据集拆分成小批次,您可以通过将每个批次放在一个单独的输入文件中,将其分成小批次,放置在数据源 S3 存储桶中。
  • 确保批量大小适合内存。 SageMaker 通常会自动处理此问题; 但是,手动分批时,需要根据内存进行调整。

以下代码是批量转换作业的示例:

s3_bucket_name= 'SageMaker-us-west-2-XXXXXXXX'
batch_input = f"s3://{s3_bucket_name}/folder/jobename_TorchServe_SageMaker/"
batch_output = f"s3://{s3_bucket_name}/folder/jobname_TorchServe_SageMaker_output/" batch_job_name = 'job-batch' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
batch_job_name request = { "ModelClientConfig": { "InvocationsTimeoutInSeconds": 3600, "InvocationsMaxRetries": 1, }, "TransformJobName": batch_job_name, "ModelName": model_name, "MaxConcurrentTransforms":1, "BatchStrategy": "MultiRecord", "TransformOutput": {"S3OutputPath": batch_output, "AssembleWith": "Line", "Accept": "application/json"}, "TransformInput": { "DataSource": { "S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": batch_input} }, "SplitType" : "Line", "ContentType": "application/json", }, "TransformResources": {"InstanceType": "ml.p2.xlarge", "InstanceCount": 1},
}

当我们使用前面的设置并启动我们的转换作业时,它会从源 S3 存储桶中批量读取输入文件并将它们发送以进行推理。 结果将写回指定给输出的 S3 存储桶。

以下代码片段显示了如何使用上述设置创建和启动作业:

sm.create_transform_job(**request) while True: response = sm.describe_transform_job(TransformJobName=batch_job_name) status = response["TransformJobStatus"] if status == "Completed": print("Transform job ended with status: " + status) break if status == "Failed": message = response["FailureReason"] print("Transform failed with the following error: {}".format(message)) raise Exception("Transform job failed") print("Transform job is still in status: " + status) time.sleep(30)

结论

在本文中,我们回顾了 SageMaker 为在线和离线推理提供的两种模式。 前者使用 TorchServe 中提供的动态批处理来对来自多个客户端的请求进行批处理。 后者使用 SageMaker 转换作业对来自 S3 存储桶中输入文件的请求进行批处理并运行推理。

我们还展示了如何使用原生 SageMaker PyTorch 推理工具包容器映像在 SageMaker 上提供模型,以及如何将自定义容器用于需要高级 TorchServe 配置设置的用例。

随着 TorchServe 不断发展以满足 PyTorch 社区的需求,新功能被集成到 SageMaker 中以提供在生产中服务模型的高性能方法。 有关更多信息,请查看 TorchServe GitHub存储库SageMaker 示例.


作者简介

皮阮 是AWS的解决方案架构师,他特别致力于数据湖,分析,语义技术和机器学习,帮助客户实现其云计算之旅。 在业余时间,您会发现他骑自行车上班,指导儿子的足球队或与家人一起享受自然漫步。

尼基尔·库尔卡尼 是 AWS 机器学习的软件开发人员,专注于提高云上机器学习工作负载的性能,并且是用于训练和推理的 AWS 深度学习容器的共同创建者。 他对分布式深度学习系统充满热情。 工作之余,他喜欢看书、弹吉他和做披萨。

哈米德绍贾纳泽里 是 Pytorch 的合作伙伴工程师,致力于 OSS 高性能模型优化和服务。 Hamid 拥有计算机视觉博士学位,曾在澳大利亚、马来西亚的多媒体实验室担任研究员,并在 Opus.ai 担任 NLP 负责人。 他喜欢为难题寻找更简单的解决方案,业余时间是一名艺术爱好者。

吉塔·乔汉(Geeta Chauhan) 在 Meta AI 领导 AI 合作伙伴工程,擅长为初创公司和财富 500 强企业构建弹性、抗脆弱、大规模分布式平台。 她的团队与战略合作伙伴、整个行业的机器学习领导者以及所有主要的云服务提供商合作,以构建和推出新的 AI 产品服务和体验; 并将 PyTorch 模型从研究转化为生产。她是 IT 女性 - 硅谷 - 2019 年 CTO 的获奖者,ACM 杰出演讲者和思想领袖,主题包括人工智能伦理、深度学习、区块链、物联网。 她热衷于推广 AI for Good 的使用。

资料来源:https://aws.amazon.com/blogs/machine-learning/optimize-your-inference-jobs-using-dynamic-batch-inference-with-torchserve-on-amazon-sagemaker/

时间戳记:

更多来自 AWS机器学习博客