我正在评估SageMaker多模型服务器(MMS)作为宿主大量模型进行推理的一种选择。我已经按照SageMaker BYOC指令成功地构建了容器。我可以调用推断,并且模型在SageMaker上工作得很好。
我在最小的可用实例类型ml.t2.medium上运行我的测试。MMS被描述为从S3下载模型,将它们加载到容器,并根据需要将模型加载到内存中。然后在内存不足时从内存中卸载。
在我的实验中,彩信经常在8-10左右报告CloudWatch的LoadedModelCount度量。即使我在更大的一组模型上运行推理。如果我将被调用的模型数量保持在较小的范围内,则推理调用大约需要0.1秒。如果我检查一下LoadedModelCount,推理时间就会上升到大约2s。
因此,我的猜测是,SageMaker MMS正在从内存中卸载模型,并将新模型加载到内存中,基本上是不断地交换内存。我将日志输入到我的MMS模型处理程序中,以表明当这种情况发生时,它会一次又一次地初始化不同模型的处理程序。
此外,CloudWatch度量DiskUtilization不断增加更多被调用的模型,这意味着它将模型从S3加载到容器磁盘中。其他指标(内存和加载模型)在另一个平台后8-10加载模型,只有微小的变化,上下。这似乎进一步支持了这样一种理论,即它不断地从容器磁盘切换到内存。
我找不到一种方法来查看MMS何时实际从内存中卸载一个模型,或者当它加载另一个模型时。另外,我看不出它用于卸载模型的阈值是多少,因为来自CloudWatch实例的MemoryUtilization度量从未超过45,我猜这意味着最多使用了45%的内存。这似乎是一个非常低的阈值,所以我希望找到一种方法来配置它,但没有找到它。
问题1:当MMS从内存中卸载模型并加载新模型时,我如何观察?
问题2:我如何控制定义何时卸载模型的内存阈值(或任何MMS使用的)?
发布于 2022-02-25 12:39:24
SageMaker将在内存满时将最近使用最少的模型从内存卸载到磁盘,然后在磁盘缓存耗尽时从磁盘删除。
除非最近使用的模型需要内存并占用实例的所有内存,否则不应该获得OOM异常。
如文档所述
当实例达到内存容量时,Amazon将从容器中卸载未使用的模型,需要将更多的模型下载到容器中。当卷达到容量并且需要下载新模型时,亚马逊SageMaker还会从实例存储卷中删除未使用的模型工件。对新添加的模型的第一次调用要花费更长的时间,因为端点需要时间将模型从S3下载到容器的内存,例如承载端点的容器
当模型从内存中退出时,将调用推理容器上的UnloadModel API。在InvokeEndpoint响应本身上没有迹象表明模型在该请求期间从内存中被逐出,但是有一个ModelUnloadingTime CloudWatch度量,它显示在请求期间卸载模型所需的时间。。
https://stackoverflow.com/questions/65811448
复制相似问题