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

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

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

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

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

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

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

支持的算法和框架

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

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

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

有关使用 SageMaker 将多个 XGBoost 模型部署到终端节点的示例笔记本,请参阅多模型终端节点 XGBoost 示例笔记本。有关演示如何在 SageMaker 中设置和部署支持多模型终端节点的自定义容器的示例笔记本,请参阅多模型终端节点 BYOC 示例笔记本。有关如何创建和访问可用于在 SageMaker 中运行示例的 Jupyter 笔记本实例的说明,请参阅使用 Amazon SageMaker 笔记本实例。创建笔记本实例并打开它后,选择 SageMaker Examples (示例) 选项卡以查看所有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 create_model 时设置 参数以显式启用或禁用模型缓存。

对于不受益于模型缓存ModelCacheSetting的使用案例,我们建议将 Disabled 参数的值设置为 。例如,当需要从终端节点提供大量模型时,每个模型仅调用一次(或非常不常调用)。对于此类使用案例,将 ModelCacheSetting 参数的值设置为 Disabled 时,对于兼容默认缓存模式invoke_endpoint的请求,允许更高的每秒事务数 (TPS)。这些使用案例中的 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 计算实例。当模型的大小相似且同构时,即在具有相似的推理延迟和资源要求时,Auto Scaling 效果最佳。

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

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

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