使用多模型终端节点托管多个模型 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

使用多模型终端节点托管多个模型

要创建可托管多个模型的终端节点,请使用多模型终端节点。多模型终端节点提供了经济高效的可扩展解决方案,可用于部署数量非常多的模型。它们使用支持的共享服务容器来托管多个模型。与使用单模型终端节点相比,这可以提高终端节点利用率,从而降低托管成本。它还可以减少部署开销,这是因为 Amazon SageMaker 将管理在内存中加载模型和根据其流量模式扩展模型的操作。

多模型终端节点还可在模型之间实现内存资源的时间共享。当模型的大小和调用延迟非常相似时,这种方法效果最佳。在这种情况下,多模型终端节点可以有效地在所有模型中使用实例。如果模型具有明显较高的每秒事务数 (TPS) 或延迟要求,我们建议在专用终端节点上托管这些模型。多模型终端节点还非常适合可容忍在调用不常使用的模型时偶尔发生的冷启动相关延迟的情况。

多模型终端节点支持 A/B 测试。它们可以使用 Auto Scaling 和Amazon PrivateLink. 您可以将启用多模型的容器与串行推理管道一起使用,但推理管道中只能包含一个启用多模型的容器。您不能将支持多模型的容器与 Amazon Elastic Inference stance 结合使用。

您可以使用Amazon SDK for Python (Boto)或 SageMaker 控制台创建多模型终端节点。通过集成多模型服务器库,可以使用多模型终端节点和自定义构建容器。

支持的算法和框架

以下算法和框架的推理容器支持多模型端点:

要使用任何其他框架或算法,请使用 SageMaker 推理工具包以构建支持多模型终端节点的容器。有关信息,请参阅 使用多模型服务器构建您自己的容器

用于多模型终端节点的示例笔记本

有关使用 SageMaker 将多个 XGBoost 模型部署到终端节点的示例笔记本,请参阅多模型终端节点 XGBoost 示例笔记本. 有关演示如何在 SageMaker 中设置和部署支持多模型终端节点的自定义容器的示例笔记本,请参阅多模型终端节点 BYOC 示例笔记本. 有关如何创建和访问可用于在 SageMaker 中运行示例的 Jupyter 笔记本实例的说明,请参阅使用 Amazon SageMaker 笔记本实例. 在您创建笔记本实例并打开该实例之后,选择SageMaker 示例选项卡以查看所有 SageMaker 示例的列表。多模型终端节点笔记本位于 ADVANCED FUNCTIONALITY (高级功能) 部分。要打开笔记本,请选择其 Use (使用) 选项卡,然后选择 Create copy (创建副本)

多模型终端节点的工作原理

SageMaker 管理容器内存中托管在多模型终端节点上的模型的生命周期。而不是下载所有的模型从 Amazon S3 存储桶添加到容器中,SageMaker 会在您调用终端节点时动态加载它们。当 SageMaker 收到特定模型的调用请求时,它将执行以下操作:

  1. 将请求路由到终端节点后面的实例。

  2. 将模型从 S3 存储桶下载到该实例的存储卷中。

  3. 将模型加载到该实例上的容器内存中。如果模型已加载到容器内存中,则调用速度会更快,因为 SageMaker 不需要下载和加载模型。

SageMaker 继续将模型的请求路由到已将模型加载到的实例。但是,如果模型收到多个调用请求,并且存在多模型终端节点的其他实例,则 SageMaker 会将一些请求路由到另一个实例以容纳流量。如果尚未在第二个实例上加载模型,则模型将下载到该实例的存储卷中,并加载到容器的内存中。

当实例的内存利用率较高,并且 SageMaker 需要将另一个模型加载到内存中时,它会从该实例的容器中卸载未使用的模型,以确保有足够的内存来加载模型。卸载的模型将保留在实例的存储卷上,并且稍后可加载到容器的内存中,而无需再次从 S3 存储桶进行下载。如果实例的存储卷达到其容量,SageMaker 将从存储卷中删除所有未使用的模型。

要删除模型,请停止发送请求并将其从 S3 存储桶中删除。SageMaker 在服务容器中提供多模型终端节点功能。在多模型终端节点中添加和删除模型不需要更新终端节点本身。要添加一个模型,请将该模型上传到 S3 存储桶并调用它。无需更改代码即可使用它。

在更新多模型终端节点时,流量将定向到更新后的终端节点中的实例,因此终端节点上的调用请求可能会遇到更高延迟。

设置 SageMaker 多模型终端节点模型缓存行为

默认情况下,多模型端点会在内存和磁盘中缓存经常使用的模型,以提供低延迟推断。仅当容器内存或磁盘空间不足以容纳新目标模型时,才会从磁盘卸载和/或从磁盘中删除缓存模型。

您可以更改多模型端点的缓存行为,并通过设置参数ModelCacheSetting当你调用创建模型.

我们建议设置ModelCacheSetting参数设置为Disabled,以获取无法从模型缓存中受益的使用案例。例如,当需要从端点提供大量模型,但每个模型只调用一次(或者很少)时。对于这些用例,请将ModelCacheSetting参数设置为Disabled允许每秒更高的事务 (TPS)invoke_endpoint请求与默认缓存模式进行比较。这些用例中的 TPS 更高是因为 SageMaker 在invoke_endpoint请求:

  • 异步从内存中卸载模型,并在调用模型后立即将其从磁盘中删除。

  • 为在推理容器中下载和加载模型提供更高的并发性。并发性是容器实例 vCPUs 数量的一个因素。

有关为多模型终端节点选择 SageMaker ML 实例类型的指南,请参阅多模型终端节点部署的实例建议 .

多模型终端节点部署的实例建议

为多模型终端节点选择 SageMaker ML 实例类型时,需要考虑多个项目。为需要服务的所有模型预配置充足的 Amazon Elastic Block Store (Amazon EBS) 容量。平衡性能(最大限度地减少冷启动)和成本(不要过度预配置实例容量)。有关 SageMaker 为终端节点和多模型终端节点的每个实例类型附加的存储卷大小的信息,请参阅托管实例存储卷. 对于配置为以 MultiModel 模式运行的容器,为其实例预配置的存储卷具有更多内存。这样可以在实例存储卷上缓存更多模型。

选择 SageMaker ML 实例类型时,请考虑以下事项:

  • GPU 实例类型不支持多模型终端节点。

  • 要在多模型终端节点后托管的模型的流量分配(访问模式)以及模型大小(实例上可加载到内存中的模型数)。

    • 将实例上的内存量视为要加载的模型的缓存空间。将 vCPU 数量视为对加载模型执行推理的并发限制(假设调用模型绑定到 CPU)。

    • 更多的实例内存使您可以加载更多模型,并准备好提供推理请求。您不需要浪费时间加载模型。

    • 更多的 vCPUs 数量使您可以同时调用更多唯一模型(同样假定推理绑定到 CPU)。

    • 请提供一些“松弛”内存以便卸载未使用的模型,特别是具有多个实例的多模型终端节点。如果实例或可用区发生故障,这些实例上的模型将被重新路由到终端节点后的其他实例。

  • 容忍加载/下载时间:

    • d 实例类型系列(如 m5d、c5d 或 r5d)附带一个 NVMe(非易失性存储规范)SSD,它具有较高的 I/O 性能,并且可以减少将模型下载到存储卷以及容器从存储卷加载模型所需的时间。

    • 由于 d 实例类型附带 NVMe SSD 存储,因此 SageMaker 不会将 Amazon EBS 存储卷附加到这些托管多模型终端节点的 ML 计算实例。当模型大小相似且同质(也即,它们具有相似的推理延迟和资源要求)时,自动扩展的效果最佳。

在某些情况下,您可以通过选择不能同时将所有目标模型保存在内存中的实例类型来选择降低成本。SageMaker 在内存不足时动态卸载模型,以便为新目标模型腾出空间。对于不经常请求的模型,您需要付出动态负载延迟的代价。在延迟需求更严格的情况下,您可以选择更大的实例类型或更多实例。提前投入时间进行适当的性能测试和分析将非常有利于成功生产部署。

您可以使用 ModelCacheHit 指标的 Average 统计数据来监控已加载模型的请求比率。您可以使用 ModelUnloadingTime 指标的 SampleCount 统计数据来监控在一段时间内发送到容器的卸载请求数。如果模型卸载频率过高(颠簸指示器,由于工作模型集的缓存空间不足,因此将卸载并重新加载模型),请考虑使用具有更多内存的更大实例类型,或者增加多模型终端节点后的实例数。对于具有多个实例的多模型终端节点,请注意可以在多个实例上加载一个模型。

SageMaker 多模型终端节点完全支持 Auto Scaling,该终端节点可管理模型副本,以确保基于流量模式扩展模型。我们建议您在配置多模型终端节点和实例大小时综合考虑上述所有内容,并为终端节点设置自动扩展。用于触发自动扩展事件的调用率基于终端节点所提供的完整模型集中的聚合预测集。