温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github: https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢
1.概述
CDSW1.4提供了一个新的模型模块,可以让数据科学家通过REST API的方式来构建,部署和管理模型,从而提供预测。如下图所示,这个功能可以帮助数据科学家实现第四个步骤 - 部署和跟踪模型。
2.目的
2.1.挑战
数据科学家经常使用各种Python/R开源软件包开发模型。而测试人员又需要知道你这些模型的一切。在多数企业组织架构中,模型部署过程需要DevOps团队的参与,因为他们对部署新的系统有他们的要求。
比如,数据科学家用Python开发了一个模型,但是DevOps团队在实际部署前可能用另一种语言重建。这个过程可能很慢且容易出错。然后导致部署新的模型需要几个月的时间。当重新构建的模型与原始模型不一致时,还会带来合规的风险。
一旦模型部署完成,还需要确保DevOps团队可以根据实际情况回滚模型到以前的某个版本。这意味着数据科学团队还需要一种可靠的方法来保留他们构建的模型的历史记录,并确保他们可以根据需要重建特定版本。任何时候数据科学家(或其他相关人)必须能够准确地识别部署的模型版本。
2.2.解决方案
CDSW1.4允许数据科学家以REST API的方式构建和部署模型。数据科学家现在可以在项目文件中选择Python或R函数,CDSW将:
1.创建模型代码,模型参数和依赖项的快照。
2.将训练好的模型打包到不可变的工件中并提供基本的服务代码。
3.添加一个REST endpoint,它会自动接受与该函数匹配的输入参数,并返回与返回类型匹配的数据结构。
4.保存模型以及一些元数据。
5.部署指定数量的模型API副本,自动进行负载均衡。
3.概念和术语
模型部署流程
3.1.创建
1.File - 包含要在模型启动时调用的函数的R或Python文件。
2.Function - 要在文件中调用的函数。此函数应将单个JSON编码对象(例如,python字典)作为输入,并将JSON可编码对象作为输出返回,以确保可以与使用API访问模型的任何应用程序兼容。CDSW中内置了模型输入/输出的JSON解码和编码。
Function功能包括以下组件:
3.2.构建
此阶段将调用函数的文件作为输入,并返回实现单个具体模型的工件,称为模型构建。
1.Built Model: 构建的模型是静态的,不可变的工件,包括模型实现,其参数,任何运行时依赖性及其元数据。如果需要更改任何这些组件,例如,需要修改代码实现或者重新训练参数,则必须重新构建模型。模型构建使用构建编号(build numbers)来实现版本控制。
为了创建模型构建,CDSW会基于项目的默认引擎创建Docker镜像。这个镜像提供了一个隔离的环境,模型实现代码会在这个镜像中运行。
要配置镜像环境,你可以在构建脚本cdsw-build.sh中指定要安装的依赖项列表。
2.Build Number: 构建编号用于在单个模型的范围内跟踪构建的不同版本。从1开始,然后随着创建的模型新构建而递增。
3.3.部署
此阶段主要是指为模型提供所需的内存/CPU资源,所需的副本数,以及将前一阶段创建的模型构建部署到REST API。
1.Deployed Model:部署的模型是执行中的模型构建。构建模型部署在模型服务环境中,可能具有多个副本。
2.Environmental Variable:你可以在每次部署模型时设置环境变量。模型会默认继承全局(project and global level)的环境变量。如果两者有冲突,以你设置的环境变量为主。
注意:如果你使用特定的环境变量,则每次重新部署模型时都必须指定这些环境变量。模型不会继承之前部署中的环境变量。
3.Model Replicas:为模型提供传入请求的引擎。注意每个副本一次只能处理一个请求。多个副本的作用主要是用来负载均衡,容错和并发。CDSW允许为每个模型部署最多9个副本。
4.Deployment ID:部署ID是一个数值类型,主要用来跟踪CDSW中部署的模型。它们不受模型和项目的约束。
4.创建和部署模型(QuickStart)
Fayson会在下一篇文章以实操的方式详细介绍。
5.调用模型
本节列出了模型请求的一些要求以及如何使用CDSW测试模型。
5.1.(Requirement) JSON for Model Requests/Responses
CDSW中的每个模型函数都以JSON编码对象的形式获取单个参数,并返回另一个JSON编码对象作为输出。此格式可确保与使用API访问模型的任何应用程序兼容,并使你可以灵活地定义如何使用JSON数据类型映射模型的数据类型。
但是,JSON不适用于非常大的请求,并且对于二进制对象(如图像或视频)的开销很高。考虑使用对图像或视频(例如URL)的引用来调用模型,而不是对象本身。理想情况下,请求的大小不应超过100KB。对于较大的请求,性能可能会降低并且内存使用会增加。
确保JSON请求代表模型调用的请求或响应中的所有对象。例如,JSON本身不支持日期。 在这种情况下,考虑将日期作为字符串传递,例如以ISO-8601格式。
5.2.(Requirement) Access Key
CDSW中的每个模型都有一个与之关联的唯一access key。这个access key有两个作用:1)它是模型的唯一标识符,2)它是你调用模型的身份认证令牌。
使用CDSW部署的模型不公开。为了调用活动的模型,你的请求必须包含模型的access key以进行身份认证。
要找到模型的access key,请转到模型的Overview页面然后点击setting。
注意:每个模型每次只有一个access key处于活动状态。如果重新生成access key,则需要将新的access key重新分发给用户/应用程序。
或者,你可以使用此机制通过重新生成access key来撤消对模型的访问。拥有较旧版本access key的人则无法调用该模型。
5.3.测试调用模型
CDSW提供两种方法测试调用模型
1.测试模型的小工具:在每个模型的Overview页面上,CDSW提供了一个小工具,它可以对已部署的模型进行示例调用,以确保模型可以接收输入并按预期返回结果。
2.在每个模型的Overview页面上,CDSW也提供可用于curl或POST的请求字符串,你可以用来测试对模型的调用。将curl请求直接复制/粘贴到终端中以测试调用。
注意这些示例请求已包含你在构建模型时的样例输入值,以及查询模型所需的access key。
6.更新一个活动模型
Active Model - 是指一个模型在 Deploying, Deployed或Stopping状态
即使在模型已经部署并提供服务之后,也可以对模型进行更改。根据业务或者资源需求,可以修改模型代码,或模型需要的CPU/GPU数量。此外你也可以停止和重启活动模型。
6.1.重部署已有的构建
重新部署模型涉及在新的环境中重新发布以前部署的模型 - 更新副本数量或内存/CPU/GPU。如下所示,需要重新部署的情况可能包括:
注意:目前CDSW仅允许每个模型进行一次活动部署。所以当你重新部署构建时,当前的活动部署就会下线,直到重新部署完成并且新部署已经可以接收请求。准备相应的模型停机时间。
重新部署已有的模型:
1.进入模型的Overview页面
2.点击Deployments
3.选择你需要部署的版本,然后点击Re-deploy this Build
注意:如果你使用了一些特定的环境变量,则每次重新部署模型时都需要重新指定这些变量。模型不会继承先前部署中的环境变量。
4.根据需要修改模型提供服务的环境
5.点击Deploy Model
6.2.为模型部署新的构建
为模型部署新构建包括重新构建模型的Docker镜像以及部署此新构建。如果你只是需要修改模型所需要的资源,则不需要这样做。需要重新部署新构建包括如下几种情况:
注意:目前,CDSW不允许在不部署模型的情况下为模型创建新构建。这与每个模型只能有一个活动部署是一个道理,一旦构建了新的模型,当前活动部署的模型将下线,以便可以部署新构建。所以需要准备相应的模型停机时间。
要创建新构建并部署它:
1.进入模型的Overview页面
2.点击Deploy New Build
3.完成填写表单,然后点击Deploy Model
6.3.停止模型
要停止一个模型(包括所有副本),进入模型的Overview页面,然后点击Stop。点击OK确认。
6.4.重启模型
要重启一个模型(包括所有副本),进入模型的Overview页面,然后点击Restart。点击OK确认。
重新启动模型不允许你对模型进行任何代码更改。主要是指快速重新初始化或重新连接资源。
7.使用指南
本章主要包括使用CDSW部署模型的最佳实践。
7.1.Model Code
CDSW中的模型旨在执行包含在函数中的任何代码。所以你可以部署一个模型,该模型在非常大的表上返回select *查询的结果。但是Cloudera强烈建议不要将CDSW的模型功能用于此类用例。
最佳实践是你的模型应该是准实时的返回简单的JSON。如果你有一个长时间运行的操作需要大量计算,并且需要15秒以上才能完成,请考虑使用批处理。
7.2.Model Artifacts
一旦开始构建较大的模型,请确保将这些模型工件存储在HDFS,S3或其他外部存储中。不要使用项目文件系统来存储较大的输出工件。
通常,任何大于50MB的项目文件都必须是项目的.gitignore文件的一部分,而不会包含在快照中被以后的实验/模型构建使用。如果你的模型需要一些外部资源比如存储,则需要确保这些资源可用且不可变,因为模型副本随时会重新启动。
7.3.Resource Consumption and Scaling
同其他长期运行的应用程序一样,模型也会持续的消耗内存和计算资源。如果你在首次部署模型时不确定资源需求,可以从单个副本开始,监视其使用情况,并根据需要进行扩展。
如果你发现模型在部署过程的某些阶段卡住了,请检查监控页面以确保集群有足够的资源来完成部署操作。
7.4.Security Considerations
如前所述,模型不会对它们可以执行的代码施加任何限制。此外,可以创建模型的用户就可以运行模型(与会话和作业相同)。因此,需要注意潜在的数据泄露风险,尤其是在查询数据集以进行预测时。
CDSW中的模型默认不是公开的。每个模型都有一个与之关联的access key。只有拥有此access key的用户/应用程序才能调用该模型。请注意谁有权限查看此access key。
CDSW还会将模型的stderr/stdout日志打印到UI的输出面板中。确保你没有在日志中写入一些敏感信息。
7.5.Deployment Considerations
CDSW目前不支持模型的高可用。另外,在给定的时间内每个模型都只能有一个活动部署。也就是如果要部署模型的新版本或调整副本数,则需要规划停机时间。
使用CDSW开发和训练的模型本质上是Python/R代码,可以使用通用的序列化格式(如Pickle,PMML,ONYX等)保存并导出到外部环境。
8.限制
1.不支持Scala模型。
2.模型不支持跨CDSW的Worker节点执行(Spawning worker threads)。
3.如果项目文件系统对于Git快照进程而言太大,则模型部署将失败。一般来说,任何大于50 MB的项目文件(代码,生成的模型工件,依赖项等)都应该包含在项目的.gitignore文件中,以便它们不包含在模型构建的快照中。
4.对活动模型发出的JSON请求大小不应超过100KB。这是因为JSON不适合非常大的请求,并且对于二进制对象(如图像或视频)的开销很高。通过引用图像或视频(例如URL)而不是对象本身来调用模型。
5.外部连接比如数据库连接或Spark context,都必须由模型的代码管理。需要此类连接的模型负责自己初始化,执行完成后的回收或刷新。
6.使用CDSW部署的模型不具备高可用。
7.重新部署或重新构建模型会导致模型停机(一般来说时间较短)。
8.目前不支持动态缩放和自动缩放。 要更改服务中的副本数,你必须重新部署构建。
9.只有单个副本处于活动状态时,才会保留模型日志和统计信息。CDSW会在认为必要时随时重启副本(比如模型输入错误)。
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。