Zillow技术中心

使用SageMaker通过Zillow Floor计划进行机器学习模型部署

Zillow平面图:用于在全景图中检测窗户,门和开口的训练模型我们介绍了如何训练ML模型以帮助生成Zillow楼层平面图。在这篇文章中,我们将描述我们如何设计和实现将部署和服务于模型的基础架构。

我们的目标是建立一个基础架构,该基础架构是:

我们研究了多种选择,从在Zillow中使用专用服务器到在AWS EC2上运行推理服务器。最后,我们选择了SageMaker来部署和服务我们的ML模型。虽然价格上涨约40%¹,易于使用,功能多样以及SageMaker的可靠性证明了成本。在以下各节中,我们将对Sagemaker进行广泛概述,描述我们如何构建此基础结构,并以该项目的当前状态和我们的未来计划结束。 

由于整个基础架构都是围绕AWS生态系统构建的,因此简要描述其中一些服务会有所帮助,因为我们将在本文中多次使用它们的缩写: 拉姆达 是AWS的功能即服务(FaaS),可自动运行代码,而无需管理任何类型的服务器或资源。 步进功能 使您可以将多个AWS服务协调到无服务器工作流中。每个步骤可以是Lambda或SageMaker操作。 S3 是AWS的存储解决方案, DynamoDB 是AWS的非关系型数据库。 Cloudwatch 是针对与AWS资源相关的所有事物的监视和管理服务。 ECR 是AWS的容器注册表, EC2 是AWS计算云的名称。

什么是SageMaker?

贤者 是AWS的完全托管的端到端平台,涵盖了许多不同框架中的整个ML工作流程。它提供以下服务:

我们已经有用于训练和创建ML模型的本地机器。对于这个特定的应用程序,我们将更多的精力放在推理上,而不是定期的再训练周期。而且,相对于通过详尽地重新训练ML模型所获得的预计准确性,SageMaker中可用的GPU实例过于昂贵。因此,我们决定仅使用SageMaker来服务和部署ML模型。

选择正确的功能

贤者具有众多功能,使其非常适合用于ML模型的产品化。它提供在线和离线推理解决方案。它基于EC2构建,因此有许多可用的CPU / GPU选项。除了标准的EC2实例之外,SageMaker还提供了Elastic 在ference,它在托管时使用CPU实例,但是在推理期间神奇地切换为使用GPU资源,从而大大降低了成本。

我们选择SageMaker的主要原因是它与其他AWS服务高度集成,并且我们的大多数服务已经在AWS生态系统中构建。 

但是,拥有这么多功能和选项可能会造成很大的混乱。因此,为简化起见,我们需要询问以下问题以选择最具成本效益的解决方案:

1-我们是否需要现场服务来进行推理请求?

2-在数据生成和实际使用预测之间有多少时间?

3-如果选择离线推理,应该如何捆绑输入数据?

通过创建将响应训练或推理请求的端点来启用在线推理。创建此主机并启用实时推断大约需要10分钟。它接受存储在S3中的图像作为输入,甚至可以与您的推理请求一起作为“应用程序/ x图像”数据源。 

另一方面,在应用程序不需要实时推断并且所有数据已经​​在S3中的情况下,离线推断或批处理转换非常方便。它获取输入图像列表,并将推理结果作为JSON对象存储在S3中。 

在此项目中,我们想从全景图像中检测窗户,门和开口。除了生成可用于前面所述的许多其他不同目的(例如阳光模拟,自动房间合并)的高保真度数据外,我们的主要目标是使平面图生成自动化,从而减少时间和成本。

我们通过更改不同的参数进行了许多实验:

  1. 贤者参数
    • 在线与离线推理
    • EC2实例类型
    • 实例数
  2. 内部参数
    • 批量大小
    • 当前和预计的3D游览数据
    • 平面图生成中的SLA

经过广泛的调查和试验后,我们决定使用Batch Transform CPU实例。这是满足我们业务需求的最具成本效益的解决方案,因为:

成本分析示例

使用SageMaker会附带3种类型的成本:SageMaker实例成本,存储Docker映像的ECR成本以及数据传输成本。与实例成本相比,ECR(每月每GB $ 0.1)² 数据传输(进出每GB 0.016美元)的成本可以忽略不计。而且,如果我们使用 预构建AWS Docker映像 并将数据存储在S3中,我们无需为其中任何一项付费。

假设SageMaker实例是唯一的成本,表1说明了对于给定的ML模型,在给定推理时间的情况下,对于1000张图像,每天的粗略估算成本是什么样的。

表1 –在线推断的SageMaker预计成本

 

表2 –离线推理的预计SageMaker成本

 

对于批量推断,重要的是要考虑启动Docker容器和安装必要的程序包可能需要1-2分钟的固定成本。

将SageMaker集成到我们的管道中

 

在SageMaker中部署ML模型

为了运行批处理推断,SageMaker需要一个SageMaker模型。 贤者模型可以视为配置,其中包括有关所创建的EC2实例的属性以及模型工件的位置的信息。 

EC2实例配置 支持设置实例数量,链接到ECR中的Docker映像以及CPU / GPU信息。 模型工件 包括冻结/保存的模型和特定格式的推理代码。根据所使用的基础ML框架和Docker映像,可能需要进一步的自定义。也可以选择编写自定义代码以预处理/后处理数据以及如何提供模型。这些示例可在AWS中找到 贤者容器GitHub 页面。

每个批量转换作业可以总结如下:

  1. 使用SageMaker模型中提供的图像创建EC2实例
  2. 加载ML模型工件并启动特定于ML框架的模型服务器
  3. 给定输入数据集,运行推理并将输出保存在S3中
  4. 杀死EC2实例

我们基于EC2实例和模型工件接触过,但是这些模型服务器是什么?

 

 

图1 –描绘了SageMaker如何创建主机以通过ML模型服务器服务于推理请求的框图。

机器学习模型服务器

ML模型服务器是用于服务使用任何ML / DL框架训练的深度学习模型的工具。它们可以在主机上单独运行,也可以通过Docker映像使用,从而设置端点以处理RESTful请求。这些请求可以用于训练,推论或通过专门的处理程序功能定义的任何其他内容。

如图1所示,可以将它们视为实际模型推断与外界之间的一层,从而可以进行RESTful通信。

存在与不同ML框架兼容的不同模型服务器。 TensorFlow模型服务器 可用于服务TensorFlow模型和 MxNet模型服务器 可以与MxNet,Gluon或Pytorch模型一起使用。在通过TensorFlow训练WDO模型时,我们在该项目中使用了TensorFlow模型服务器。

自动运行多模型批量转换作业

我们的管道从Zillow 3D 首页™导览开始。如图2所示,成功完成3D 首页游览后,所有全景图都已上传到S3。当游览还需要Zillow Floor Plan™时,它会通过Cloudwatch警报触发另一个步进功能。

此步骤功能具有几个步骤,这些步骤具有多个原子操作。首先,我们预处理输入图像以进行清洁以及计算有用信息。然后,我们并行运行多个负责推理的Lambda。这些Lambda负责: 

1-准备数据

2-触发批量转换作业

3-检查这些工作的状态

4-作业完成后,清洗/过滤/映射批处理转换结果。

通过这种“开始-监视-等待-监视-结束”设计模式,我们没有为整个Lambda支付费用,在整个推理过程中,Lambda可以持续长达一个小时的大型图像集。每个Lambda与相同的输入图像并行运行,因此其他ML模型不会增加总处理时间。 拉姆达的编写方式与底层的ML模型无关。因此,为将来的ML模型添加新的Lambda是微不足道的。

最后,我们在S3中将预测存储为JSON对象。我们还将这些JSON对象的密钥存储在DynamoDB中,以便快速,轻松地访问需要它的任何服务。

图2 –流程图,描述了我们从用户接收全景图,运行推断到将预测结果提供给注释者的流程。

结论和下一步是什么?

随着对Zillow 3D 首页和其他虚拟产品的需求增加,我们正在意识到将大量时间投入基础架构的设计和开发以确保可扩展性的好处。既然我们已经拥有完整,可扩展且可靠的基础结构来为我们的ML模型提供服务,那么下一步就是设计一种基础结构,使我们能够在收集新数据时自动训练模型。

在这方面,我们最近将模型工件移到了具有用于CI / CD的GitLab管道的存储库中,如图3所示。该管道执行以下操作以确保代码质量和模型性能:

  1. 根据基础ML框架构建自定义Docker映像
  2. 格式化/删除推理代码
  3. 进行训练/推理
  4. 根据图像集上的预定义指标检查模型的性能

图3 –流程图,显示了我们用于CI / CD的模型工件存储库管道。


预定的再培训仍处于计划阶段,我们目前正在研究不同的框架,例如
Kubeflowmlflow.

 

¹ 这基于m5.large EC2实例($ .096 /小时)与ml.m5.large标准SageMaker批处理转换实例($ .134 /小时)。

² Taken from //aws.amazon.com/ecr/pricing/