如何观察和控制sagemaker多模型服务器如何在内存中加载模型



我正在评估SageMaker多模型服务器(MMS)作为托管大量模型进行推理的选项。我已经根据SageMaker BYOC MMS指令成功构建了容器。我可以调用推理,模型在SageMaker上工作得很好。

我在可用的最小实例类型ml.t2.medium上运行测试。MMS被描述为从S3下载模型,将它们加载到容器中,并根据需要将模型加载到内存中。然后在内存不足时从内存中卸载。

在我的实验中,MMS不断报告LoadedModelCount的CloudWatch度量值在8-10左右。即使我在更大的模型集上进行推理。如果我保持调用的模型数量较少,则推理调用大约需要0.1秒。如果我越过LoadedModelCount,推理时间上升到大约2s。

所以我的猜测是SageMaker MMS正在从内存中卸载模型,并将新模型加载到内存中,基本上是不断地内存交换。我把日志记录到我的MMS模型处理程序中,以显示它在发生这种情况时一遍又一遍地初始化不同模型的处理程序。

CloudWatch指标DiskUtilization随着调用更多模型而不断上升,我预计这意味着它将模型从S3加载到容器磁盘中。另一方面,其他指标(内存和加载模型)在8-10个加载模型之后趋于平稳,只有微小的上下变化。这似乎进一步支持了这个理论,即它不断地从容器磁盘交换到内存。

我找不到一种方法来查看MMS何时实际从内存中卸载模型,或者何时加载不同的模型。此外,我无法看到它使用什么阈值来卸载模型,因为来自SageMaker实例的CloudWatchMemoryUtilization度量从未超过45,我猜这意味着最多使用45%的内存。这似乎是一个非常低的阈值,所以我希望找到一种方法来配置它,但还没有找到。

问题1:当MMS从内存中卸载模型并加载新模型时,我如何观察?

问题2:我如何控制定义何时卸载模型的内存阈值(或MMS使用的任何东西)?

当内存满时,SageMaker会将最近最少使用的模型从内存中卸载到磁盘中,然后在磁盘缓存耗尽时从磁盘中删除。

除非最近使用的模型占用了实例的所有内存,否则不应该得到OOM异常。

如文档中所述:

Amazon SageMaker从容器中卸载未使用的模型实例正在达到内存容量,需要更多的模型下载到容器中。Amazon SageMaker也会删除未使用的对实例存储卷中的构件进行建模达到容量和新模型需要下载。第一个调用新添加的模型需要更长的时间,因为端点将模型从S3下载到容器的内存中需要一些时间承载端点的实例

当一个模型被从内存中取出时,推理容器上的UnloadModel API将被调用。在InvokeEndpoint响应本身上没有迹象表明在该请求期间模型被从内存中驱逐,但是有一个ModelUnloadingTime CloudWatch指标显示了在请求期间卸载模型所花费的时间。

最新更新