MLflow模型服务

2021年5月27日下午03:15(太平洋时间)

下载幻灯片

讨论了MLflow服务于模型的不同方式。我们将介绍开源MLflow和Databrickbob下载地址s管理的MLflow方式来服务模型。将涵盖批评分和实时评分之间的基本区别。特别强调即将推出的Databricks生产就绪模型服务。

在本节中观看:
Andre Mesarovic,高级驻地解决方案架构师,Databricks

成绩单

安德烈·梅萨罗维奇:大家下午好。我叫安德烈·梅萨罗维奇。我是Databricks的高级常驻解决方案架构师。今天我要讲的是MLflow模型服务。我假设在座的每个人都熟悉MLflow。MLflow是一个端到端机器学习框架,自2018年6月以来一直存在。它是一个基于类似bob下载地址Spark模型的开源包,因为它有一个开源版本。然后是Databricks提供的托管服务。它是由Databricks的人发起的。但就像我说的,它是开源的,有很多非Databricbob下载地址ks贡献者。 So we’re not going to be talking about training here, I mean, MLflow handles experiment tracking, model registry, and ultimately, serving. We’re going to be focusing on the serving component in this discussion.
基本上有两种类型的服务,正如你们许多人所知道的。一种是离线评分,本质上也称为批量评分。Spark就是为此而设计的。另一种类型的评分是在线评分或实时评分,本质上,你基本上是在低延迟要求下一次对一条记录进行评分。所以在离线评分中,你通常会消耗大量的数据。举个例子,比如说,顾客对药店的推荐。除了用于实时评分的标准MLflow模型服务器之外,我们还将讨论自定义部署。最后,我们将研究Databricks实时模型服务器,它最近刚刚发布,在这个领域有一些令人兴奋的新进展。
所以,正如我之前提到的,这两种类型的评分或预测,我们可以称之为。左边的离线是高吞吐量,批量预测,Spark Databricks,你基本上会,你有一个表,创建一个数据帧,消费它,通过直接代码或UDF。在内部,在离线评分中,你可以把它分为两类。一个是批处理预测,这是一个经典的Spark任务。您还可以使用结构化流预测,它使用Spark结构化流来消费提要。另一方面,在线预测,正如我提到的,这是低延迟的,典型的个人预测,我的意思是,如果你让他们进来,你可以得到不止一分。这主要用于web服务器、物联网设备等。这是在Spark之外,这里不涉及Spark。
MLflow提供了多种形式的实时计分服务器。它本质上是一个烧瓶,一个由Gunicorn包装的Python烧瓶服务器。您可以将其构建为容器,具体来说,是Azure ML容器,还是SageMaker容器。然后构建Docker容器并将其推送到云端,特定的云提供商。最后,但并非最不重要的是Databricks模型服务,它本质上是在Databricks中公开公共端点的能力,建立web服务器,并避免将容器推出给给定云提供商有时涉及的耗时和繁重的步骤。
在这里,我们将讨论一些词汇,同义词。因此,模型服务可以被认为等同于模型评分或模型预测,模型推理和模型部署是将模型推出到目标平台的过程。bob体育客户端下载正如我提到的,有两种类型的预测如果我们把预测分成不同的类别,我们有离线预测和批量预测。其中我们有两个子类Spark批处理,Spark流,还有在线,也被称为实时评分。这是评分类别的图表。在左边,我们有MLflow的核心是MLflow模型注册表。所以在你完成训练之后,通常,你会用不同的超参数进行多次迭代训练。当你满意的时候,你选择最好的模型,有最好指标的模型,你把它推到模型注册表中,在那里你可以有,一个给定模型的一个或多个版本。
而且,每个版本都是一个单调递增的整数。除此之外,你还可以用我们所说的阶段来标记这些版本,要么是制作阶段,要么是舞台阶段。所以你最喜欢的模型是生产。然后你可以用一个模型URI访问它来检索它并将它部署到你喜欢的目标环境。在右上方,我们讲过离线服务,有两种模式,要么是Spark批处理,要么是Spark结构化流。然后是在线服务,这是一个更广泛的类别,有点像狂野的西部。从某种意义上说,有许多可能的目标部署,您可以从MLflow评分容器开始,这是一个Docker容器。它是为SageMaker或Azure ML或只是一个普通的Docker容器。然后MLflow有一个部署插件API。本质上是一个扩展点,你可以实现你自己的目标。 And currently there are four deployment targets.
有TorchServe, RedisAI, Ray框架和Algorithmia。当然,你也可以推出你自己的自定义web服务器,如果你有特殊需要,你可以从头开始编写。在下面,我将演示稍后的自定义TensorFlow服务。因此,TensorFlow服务是TensorFlow的服务平台,我将演示如何获取注册模型并将bob体育客户端下载其部署到TensorFlow服务中。然后是边缘设备的美丽新世界,你可以,没有什么可以阻止你采取注册模型,并将其推出到你最喜欢的任何边缘设备,你在物联网,移动等。最后一个类别是硬件设备,如果你真的想走这条路,有英特尔,英伟达等。
所以,当我们谈到离线评分时,这是Spark的最佳点,我们如何利用Spark的分布式特性。如果我们有数百万或数十亿的输入要评分,它可能是结构糟糕的流。MLflow的真正优点之一是能够创建UDF用户定义函数。这可以是在Python或SQL中,然后瘫痪非并行框架的评分。例如Scikit-learn,它不是一个并行框架,它是一个单节点框架,但是使用UDF你可以并行化评分。在我看来,这是一个很酷的功能。MLflow提供了一行方法来检索模型并返回带有该模型的UDF。这显然是从MLflow注册表完成的。所以,在这里我们说明不同的计分方式。在顶部,我们创建一个URI。
因此,MLflow具有模型URI的概念。它可以是这里的方案,这个例子的第一部分模型。这引用了一个已注册的模型,如果您愿意,您可以直接访问带有runs方案前缀的run。我们将关注注册模型。所以MLflow有这个味道的概念,本质上来说味道就是机器学习框架。它是Scikit-learn TensorFlow PyTorch,那是原生的。所以在这种情况下,当你调用本地风味负载模型时,你将得到与scikit学习完全相同的结果。这是你得到的一个Scikit-learn对象,然后你可以调用本地风味。此外,每种风格都有称为Pyfunc风格的东西,它只是一个单一方法包装器API。
这允许我们用预测函数来调用模型。所以在这个例子中,巧合的是,Scikit-learn和Pyfunc都调用了predict方法。但是,例如,在SparkML中,预测方法通常称为transform。但是有了Pyfunc风格,我们就不用担心这些了。这允许使用强大的工具,构建容器,并以通用的方式进行评分。下面,我们来看一下如何检索UDF。因此,我们将使用单节点Scikit-learn对象,并创建一个Spark UDF用户定义函数。然后我们可以在一个数据帧上调用它然后它就会分布到所有工人的得分中。
最后,在最后一个示例中,我们将展示如何从SQL中执行此操作。因此,我们只需以给定名称注册UDF,然后使用SQL模式,在Databricks中,我们可以使用SQL语法进行评分。在线评分,就像我提到的,有很多不同的选择。这里的关键是我们需要做即时的,非常低延迟的评分,通常是一次一个记录,并有即时反馈。一个非常常见的选择是使用REST API web服务器。就像我说的,MLflow自带容器,您可以构建自己的容器。没有什么可以阻止你在浏览器中嵌入你的评分,比如TensorFlow Lite。然后是边缘设备——手机、传感器、路由器,然后是硬件加速器。这取决于具体的用例你想如何部署它。
这是来自著名的Martin Fowler的团队,基本上他对不同的实时发球选项进行了很好的分解。通常,许多人采用的一种方法是将模型直接嵌入到应用程序代码中。这当然会引入耦合,您要么遇到技术堆栈问题,要么遇到兼容库。另一种非常常见的方法是将其作为web服务来实现,正如我们之前讨论的那样。第三个是将这个作为数据发布到注册表中,然后在需要时检索它。因此,MLflow模型服务器是MLflow实时部署的实际基石。这实际上是一个Python Flask服务器。或者,在一个非常独特的情况下,有一个Java Jetty服务器,用于MLeap。我们稍后会讲到这个。
web服务器公开了一个非常简单的API。只有一个端点称为调用。它接受三种类型的输入,一种是CSV。有两种JSON格式,它们被称为panda -split或panda -records格式,这是pandas规范的一部分。最近刚刚宣布的是对TensorFlow输入的支持。不好意思,张量,只是张量输入,实际上是用JSON表示的。输出只是一个预测列表。
因此,CLI MLflow基本上有两种可以使用的模式。一个是命令行界面(CLI)。因此,您可以从shell调用许多方法。在这个例子中,我们要做的是建立一个服务器,或者你可以通过API来做。因此,在Python代码中,您可以构建一个包含服务器的容器。在最后一行中,有指向MLflow文档的链接,该文档描述了所有这些。MLflow模型服务器的不同模式,是本地web服务器,这基本上在你的笔记本电脑上运行。这是一个Python Flask服务器,你可以使用cURL,或者Python请求提交预测。另一个是SageMaker Docker容器。这显然是针对SageMaker的。 One of the nice things about the SageMaker Docker container is you can run it in local mode. So before pushing up the SageMaker, you can actually test it and see if it’s working fine. So this is great. I actually use this one a lot on my laptop.
有一个类似的Azure ML Docker容器。还有一个通用的Docker容器。当然,正如我之前提到的,还有自定义部署插件目标。这是去年秋天发布的一个非常好的功能。而且它已经被第三方供应商热切地采用了。在这个例子中,TorchServe, RedisAI, Ray和Algorithmia。事实上,在11月的MLflow 1.12中,我们与核心PyTorch/torch服务器团队密切合作,共同开发该插件。因此,为了深入了解这里的一些技术问题,MLflow模型服务器有三种形式。标准的是左边的一个简单的Python Flask服务器。所以我们要做的是从模型注册表中获取模型,获取相关的conda YAML文件,这是ML项目概念的一部分。
每个模型都有代码,实际的Python代码,在本地框架中序列化。例如,对于Scikit-learn,它会是TensorFlow的pickle文件,它会是一个保存的模型。pv文件。此外,还有一个叫做ML项目的元数据概念,它的组件中包含一个conda。列出所有包的Yaml文件,因此可以为您构建它。这只适用于非SparkML模型。所以在中间的盒子里,如果你想部署一个SparkML模型,用于实时评分,事情会变得有点复杂,因为现在我们需要两个过程。一个是Flask web服务器,然后我们需要一个Spark运行时。因此,您将向Python web服务器提交请求,它将简单地将其委托给Spark服务器。
这显然只适用于SparkML模型。你可以想象,它的性能不是很好,因为Spark本质上不是为实时评分而设计的,它本质上更倾向于ETL批处理模式。然后在右边,我们最后有一个叫做MLeap的概念。MLeap是一个开源包,bob下载地址它可以将SparkML模型转换为自己的格式,而不需要Spark运行时。它只适用于Scala和Java,也就是JVM。它基本上更快,唯一的问题是Mleap的商业支持不再可用,支持Mleap的公司已经转向其他东西,它不像人们希望的那样成熟。所以这是买家需要注意的。
更有策略的是,这里有一个底部的例子,我们有一个客户端提交请求,把内容类型放在那里。它是一个HTTP POST,一个请求,然后我们有三个选择。如果我们部署了Python,标准的Python服务器,那么我们在中间有SparkML服务器,然后在右边,我们有MLeap运行时。这是三种不同的方式,我们可以部署它,然后它返回,一个预测。下面是一个如何启动的示例,这是启动服务器最简单的方法。这将在您的笔记本电脑上启动,因此我们在这里使用命令行界面,在给定的端口上创建服务器。在本例中为5001。正如我前面提到的,选项model-uri在注册表中指定了模型的地址。在这种情况下,这是一个Scikit-learn虹膜模型,我们正在抓取它的生产版本。
下面是一个如何使用CSV格式评分的示例。所以我们使用的是标准的cURL命令。正如我前面提到的,我们提交的服务器只有一个端点,称为调用。我们告诉它内容类型,这里是CSV。然后我们提交我们想要评分的数据,在这个例子中,我们提交了两条记录。然后我们得到响应,这两条记录的预测。这是一个使用JSON面向分割格式的类似示例。这是一种标准的pandas格式,您在其中指定输入的第一行或列名,然后,您可以有一个或多个数据行并开始相同的响应。
这是另一个选项,面向记录的格式。这是一种略显冗长的JSON格式,因为除了数据之外,每一行还指定了列。显然,如果您有多个记录,面向拆分可能是首选。最后,这是几个月前刚刚发布的,正如我提到的,现在有一种叫做张量输入的新格式,所以请求将被转换为标准的Python Numpy数组。它实际上是JSON格式的输入,每个TensorFlow文档有两种子类型的格式。你可以在TensorFlow服务网页上看到这个。这里有一个例子,如果你提交一个张量输入[听不清],它会是什么样子。与JSON输入非常相似。这里,我们将看两个标准容器,MLflow拥有的云提供商容器。
就像我说的,基本上有两个Python容器可以构建。一种是标准的Python容器,其中嵌入了模型。然后是SparkML容器,正如我之前提到的,SageMaker是最通用的容器,因为它可以在笔记本电脑上运行,这是一个非常有用的特性。有些人可能知道,Flask是一个非常流行的Python web服务器框架。当然,我们用Gunicorn包装它,以允许可伸缩性并发请求。它包含序列化模型本身,并由Pyfunc包装,因此该工具可以以通用方式工作。SparkML容器中有两个进程。一个是Flask web服务器,它将请求委托给Spark服务器。它是一个通用的,开源的Sparkbob下载地址,没有任何关于那个容器的Databricks特定的东西。
这里有一些文档链接。这些都是在CLI中可以构建的示例。首先构建一个容器,然后可以将其部署到SageMaker,因此必须首先进入SageMaker,创建端点,执行所有与SageMaker相关的操作。或者你可以在本地运行,在你的笔记本电脑上运行。
下面是一个使用CLI进行构建的示例。在第一个例子中,我们正在构建容器。然后把它推到SageMaker,我们指定模型URI,那是注册表,然后是你的图像URL,这是你之前在SageMaker中创建的东西,这都是特定于SageMaker的。第二个例子是,我们实际上构建了那个容器,然后在本地机器上运行它,端口5051。正如我提到的,在我看来,这是一个非常非常酷的功能。因为众所周知,将容器推送给云提供商的整个过程非常乏味。有很多手动步骤,事情可能会出错,周转时间通常是10分钟,如果幸运的话。所以它不适合测试,每次你做出改变,如果你想测试它,它需要你通过。
因此,Azure ML也有一个非常相似的命令行。因此,您可以将其部署到Azure Kubernetes服务(这是首选模式)或Azure Container实例。这里有到CLI和API的链接。因此,您可以通过Python API或CLI进行编排。这里有一个例子最后一个链接会带你到实际的代码并告诉你如何去做。下面是Azure ML映像构建部署的示例。您指定了指向注册模型的模型URI,当然,您必须有一个Azure ML工作区。这些都是Azure ML特有的东西。这是很标准的东西。我们提到了MLeap。 So MLeap, like I said, is a… The intent of MLeap is to provide you the ability to take a SparkML model. So those are the serialized bits in the SparkML format, and translated into an MLeap format, that can be then deployed without a Spark server runtime.
这就是低延迟评分的能力。它肯定比使用Spark服务器快。正如我之前提到的,支持MLeap的公司不再提供支持。还有稳定性、错误、bug和文档等问题。所以这基本上是一个买家要小心的问题,但它是可用的。这里有一个示例,这里有一些代码的链接,这些代码向您展示了使用MLflow的端到端ML管道。因此,如果您访问该链接,您将看到ML管道中每个阶段的Python示例。在左边,我们基本上经历了经典的训练周期。调整所有的超参数,为每个超参数提供不同的值,通常需要数百或1000次不同的运行。我们将每次运行记录在MLflow存储库中。 When we are done in the second box there, we select the best model that is being defined by your favorite metric. So for example RMSE will take the lowest score, then you take that, the best run and push that model into the model registry.
所以现在你可以,使用注册表特性,你有能力跟踪治理,可审计性,将其提升到不同的阶段。在这里,一旦我们完成了这个阶段,我们就可以启动带有生产模型的服务器容器。要么使用Azure或SageMaker,要么使用我们自己的。最后,我们有一个客户端提交HTTP POST请求,可以是JSON格式,也可以是CSV格式。所以那些想看源代码的人,可以去那个链接。
去年刚刚推出了一个非常好的特性,即MLflow,现在它有了一个标准化的插件API。因此,您可以创建插件,为您喜欢的目标部署插件。所以,一般MLflow都有插件的概念,这些插件可以触及到MLflow的各种特性。例如,一个是元数据存储。因此,通常情况下,MLflow将存储作为数据放在两个地方。一个是元数据,这些是实验,运行,运行的输入参数,输出指标。这通常存储在SQL数据库中。它可以是MySQL, Postgres, SQLite,也有一个插件。比如说,有人为SQL Server写了一个插件。我们在这里关心的另一种类型的插件是部署插件。 So here, as I have links to the four, current plugins, TorchServe, RedisAI, and Algorithmia and Ray serve.
以下是这些插件示例的示例,以及如何部署它们。因此,我们只需使用MLflow CLI部署命令,我们创建。在第一个例子中,显然是TorchServe。我们在那里给它一个部署名,因为-M是模型和模型注册中心的标准URI。然后我们有定制的提供商特定的配置文件。然后对于RedisAI,也是类似的事情。在这里我们给它,名字将是Redis键下这个模型被存储。端点在哪里,不好意思,然后-M当然是URI射线模型,和射线类似。Ray是一个非常酷的新功能,由一家名为Anyscale的初创公司支持,在这种情况下,它是面向超参数调整的。在这种情况下,配置指定了集群中的副本数量。
最后,也是最重要的,Algorithmia。如果你碰巧在Algorithmia部署,你可以把MLflow注册的模型部署在那里。好的,这里我们将深入研究PyTorch。去年11月,随着MLflow 1.12.0的发布,Databricks团队或MLflow团队与核心PyTorch进行了非常密切的合作,并整合了PyTorch闪电、TorchScript和Torch服务。对于那些熟悉PyTorch生态系统的人来说,PyTorch闪电本质上是一个基于Rob PyTorch代码的高级接口。在TensorFlow的世界里,它有点类似于Keras和TensorFlow。现在有一种格式,一种称为TorchScript的序列化格式,它可以将你的PyTorch代码转换成一种通用的Python自由优化格式。所以你可以在Python之外给它打分。
最后是TorchServe,它是PyTorche对TensorFlow服务的模拟。这是TorchScript模型的服务框架。正如我们之前提到的,MLflow现在使用部署插件与之进行了深度集成。在我看来,这真的非常非常令人兴奋,因为PyTorch是一个越来越流行的深度学习框架,它得到了很多关注,现在我们有了与MLflow的本地集成。因此,在这条路上会有很多令人兴奋的事情发生。这是PyTorch网站上的一个图表。本质上,你有你的数据科学家,你有标准的训练程序,你在构建你的PyTorch模型,你经历大量的分布式训练,然后你生成一个优化的模型,这是TorchScript,引用不引用,Python免费序列化位。然后将其注册到模型注册中心。
在本例中,我们使用MLflow、自定义概念来完成此操作。MLflow,当你在做训练时,有两种模式,你可以用经典的方式。在自动记录出现之前,您必须在代码API中对MLflow API进行显式调用,这只是简单的日志指标。那么log参数,假设你你明确地记录了所有的输入参数,然后你记录了你的指标最后你记录了实际的序列化模型。这些都是你需要自己手动执行的步骤。现在有了这个新功能,或者说它已经存在一段时间了,但它被增强了,它被称为自定义。本质上,一旦你打开自动开关,根本就没有MLflow调用。实际上,你甚至不需要在代码中导入MLflow,它会自动自省。
对于给定数量的框架,我们有不断扩展的框架。我们实际上已经将代码内省调整到Scikit-learn的实际训练ML框架代码示例中,它叫什么?猴子在修补大猩猩。实际上,我们会对参数调用进行触发,我们会自动将所有输入参数输入到为您登录的给定框架中。所以你不需要显式地记录任何东西,这实际上非常酷,非常酷。然后,一旦它在注册表中,我们就可以访问MLflow TorchServe插件。然后我们最终把它推送到TorchServe框架,部署框架,无论它在哪里,在云提供商中,等等。然后我们可以使用标准的TorchServe功能和API在那上面做推断。这里有一些关于TorchServe和PyTorch的资源。有一篇来自Databricks的博文,还有一篇来自PyTorch团队的博文。 And there’s some third party articles out there, Medium. And of course, there’s the source of truth is always on GitHub, in the source code.
这里有一个例子。以下是RedisAI的一些资源。你们可能不知道RedisAI是一个节点SQL内存数据库已经存在很长时间了,它非常强大。他们最近已经扩展到人工智能领域。所以有一个新功能叫做RedisAI,他们为你提供了非常非常低延迟的快速访问,在内存中访问数据,模型等。他们已经为MLflow实现了自己的部署插件。这里有一些资源文章,一个视频。这是我过去和Redis合作过的,我对它印象深刻,很兴奋。所以这是MLflow和RedisAI向前迈出的一大步。正如我之前提到的,Ray serve是一个开源项目,由一家名为Anyscalebob下载地址的公司支持,该公司专注于模型的分布式超参数调优。
他们最近,我想是今年年初,开发了一个插件,在Databricks上有一篇Ray的博客文章。这是一个blog,你可以看源代码,和Ray文档,关于如何使用这个。我们在这张幻灯片前面演示过,实际的MLFlow, CLI命令如何部署它。还有Algorithmia,它也创建了自己的插件。这里有很多关于Algorithmia的文章和视频。这里,我要用一个segue给你展示你如何能完全。比如说,你还没有MLflow部署插件,或者你对它不感兴趣,你想做一个完全习惯的部署。所以我们要做的本质上是,构建一个标准的TensorFlow服务Docker容器并从模型注册表中提取它。
所以,我把这个作为一个副业来做,只是为了突破MLflow的极限,看看我们如何与TensorFlow服务集成。你们中的一些人可能知道Keras,它是TensorFlow上的一个高级接口,实际上被合并到TensorFlow主分支中。所以现在Keras和TensorFlow基本上是结合在一起的,在Keras有不同底层提供者的概念之前。现在它本质上是TensorFlow包的一部分。以前,它支持,Keras是在HD5上标准化的,我不打算详细讲,那是一种旧的遗留格式。它基本上是文件中的文件系统。它在Keras TensorFlow中是默认的,它最初在MLflow中是默认的,现在不再是,所以我们不打算深入研究这个,如果你有遗留问题,我们可以稍后讨论。当前的TensorFlow格式称为save model,这是一种原生的TensorFlow序列化模型格式,有时也称为。pd。这是TensorFlow 2x的默认值,它是合并的Keras TensorFlow产品的当前版本。
从Mlflow 1.15开始,它也是默认的。这里有一个例子,我们只关注当前的图表。这只是为大家提供信息的目的,因为我们在这里的过渡,如果人们有以前的HD5遗留用例,你可以看看右边,有一个步骤,将HD5格式转换为保存模型。但如果你是从头开始,你可以跳过这一步。默认情况下你会得到相同的模型。在这个例子中,如果你去到前面的链接,这不仅仅是我在这里展示的TensorFlow服务,我还展示了其他TensorFlow服务选项,主要是TensorFlow lite模型,它是为边缘设备移动设备制作的。然后是tensorflow。js这是浏览器的一种格式。因此,你可以将你的评分嵌入浏览器或边缘设备中。TensorFlow提供了两种不同的格式。
现在,这些不是原生的,它们不是内置于MLflow本身,但是它们可以集成。MLflow有这个工件的概念,正如我之前提到的。所以工件本质上是用来存储序列化位的。它们本质上是基于云存储的,或者任何你想要的任意对象。它可以是PNG,绘图,数据,任何你想要的。因此,您的模型存储在称为模型工件的托管概念下。这是本地风味,在这个例子中,是保存的模型。此外,如果你有其他想要存储的工件,因为MLflow没有原生支持TensorFlow Lite,对于TensorFlow.js,我们实际上可以将它们简单地存储为那些位。因此,我们使用TensorFlow代码将该模型序列化为life模型格式或JS模型格式,并将其存储为任意工件。然后我们可以检索它来记分。这就展示了MLflow可扩展的强大功能。
这里有一个TensorFlow服务的例子。这是基于标准的TensorFlow服务文档,我们只是旋转一个TensorFlow服务Docker容器。代码已经从模型注册中心提取了一个已注册的模型。它使用TensorFlow服务API,将保存的模型格式嵌入到TensorFlow中。所以本质上,我们从MLflow中提取它,通过步骤,标准的TensorFlow服务步骤,我们构建一个容器,然后我们用TensorFlow JSON语法提交请求,这与MLflow语法略有不同,但本质上是一样的,我们在那里得到一个预测。下面是一个侧面MLflow的例子。对于熟悉MLflow运行的人,这里有一个。每次运行,除了元数据,就像我之前提到的,它存储在单个数据库中,其他部分存储在称为工件的云存储中。在这种情况下,我们有一个很漂亮的例子。
我们在上面有一个叫做ONNX的。我稍后会详细介绍,ONNX基本上是一种可互操作的模型格式,得到了大量供应商的支持,主要是微软、SageMaker、Facebook等,英伟达、英特尔,它的目标是拥有一种通用的、通用的模型格式。因此,正如您所熟知的,每个框架都有自己的专有或自定义模型格式。把它转换成另一种格式是非常困难或耗时的。假设你在TensorFlow中训练,出于某种原因你想在TorchServe中计分,没有简单的方法可以做到。ONNX基本上可以通过把TensorFlow格式转换成通用的ONNX格式来解决这个问题。然后有一个ONNX运行时会执行它。
然后在ONNX模型下面,我们有一个定制的工件,就像我提到的。ONNX是一个MLflow概念,因此您可以将ONNX模型保存为托管MLflow模型。下面的TensorFlow.js模型工件及其子工件是一个自定义工件。所以它不支持Mlflow,所以你必须使用本地TensorFlow.js命令来保存它。TensorFlow Lite模型也是一样,那是一个定制的工件。TensorFlow模型工件实际上是一个托管MLflow工件。所以你可以看到通过子工件,对于ONNX模型,你会看到ML模型,你也会在TensorFlow模型下看到它,有一个工件叫做ML模型,和conda yaml。这是两个元数据概念,ML模型围绕模型定义元数据,然后是conda。Yaml定义了它的依赖关系。很明显,这些对于客户工件来说并不存在。
如果你看右边的盒子,你会看到更多关于管理模型和非管理模型之间差异的细节。当然,管理模型都利用了Python概念,这是一个通用的包装器,带有一个名为predict的方法,它允许所有这些神奇的工具为您发生。GitHub上有这些例子的链接。所以当我谈到ONNX时,这里,它是一种可互操作的模型格式,有很多重量级的供应商支持它。理论上是火车一旦部署到任何地方。这里需要注意的是,它取决于每个框架的实际转换器。想象一下,你有20个输入框架,你有20个输出框架,有人需要创建一个从TensorFlow到ONNX格式的转换器。这些都因期限而异。所以这本质上是一个开源项目。bob下载地址
根据我的经验,我最幸运的是使用Scikit-learn和TensorFlow。这取决于客户的兴趣需求等等。微软是这方面的巨大支持者。根据他们的文档,Bing搜索引擎和其他许多产品都大量使用了这个功能。所以它确实有很大的吸引力。ONNX是一个本地的MLflow模型。所以你可以处理这个问题,你基本上需要,比如说,你的TensorFlow模型叫做标准ONNX转换器。然后将其保存在MLflow中,作为本地风味。它也是嵌入式的,你也可以从MLflow模型服务器上运行ONNX模型。所以对那些感兴趣的人来说,这绝对是一个选择。
好,现在我们要讲到Databricks。就像我提到的,Databricks有一个托管的MLflow产品,本质上是给MLflow带来企业特性,在Databricks笔记本、安全、连接、权限等方面紧密集成。这是MLflow的四个组成部分,四大支柱。我们在左边有模型,基本上是序列化的部分,口味。所以Scikit-learn是一种风格,TensorFlow是一种风格,Python是一种风格。然后是实验跟踪。这是你的训练周期。所以你基本上是在经历超参数循环。我们本质上记录输入参数,输出度量,任何工件,模型的序列化位,和任何任意工件。
一旦你完成了你的训练,你选择最好的模型,把它推到注册表中。我们有一个叫做模型服务的新功能,它与Databricks紧密结合在一起。所以你不必像我之前提到的那样,如果你想把你的模型推出给第三方,云提供商,在Databricks之外有很多手动步骤,所以很多客户都要求一个更简单,更集成的解决方案。因此,Databricks现在提供了一种服务。它目前并不打算用于生产。是的,你可以称之为轻量级。它越来越受欢迎,Databricks在它的路线图上,实际上是一个生产级的服务模型,它将处理规模和低延迟的sla。
本质上,我们有一个端点一个HTTP端点使用标准Databricks身份验证公开暴露你的个人令牌。现在,正如我提到的,它基本上是在公开预览中,它是一个实验模式。只有一个节点,是一个单节点集群。您可以选择您的实例类型,因此您有选择和您的实例类型。它是用于轻负荷和测试的。假设你最终想要在云提供商上大规模运行这个,但你要经历迭代,测试迭代,所以你可以在Databricks中测试所有这些。这个模型服务器会包含模型的所有版本。所以在某种意义上,它有一个多模型的概念,不是不同的模型,而是同一模型的不同版本。
有一个很好的特性,为了方便,您可以直接从UI中得分,当然,也可以使用标准的HTTP协议。正如我在路线图上提到的,这是非常令人兴奋的。提供生产级服务是一项重大任务。因此,这将是一个具有自动缩放、模型监控、模型漂移和度量的多节点集群。你将能够访问输入请求和响应,如果你想做自定义模型监控,低延迟,高可用性,可扩展,Databricks提供的所有有趣的东西,此外,它将支持GPU。这里有个例子,如果你去到注册表,你会去到服务选项卡,你可以选择你的实例类型。也就是说,您启动模型,您可以看到不同的版本,当然,您可以通过模型事件跟踪它。
这里有一个UI评分的例子。这里有两个端点,一个是原始版本。这是第七版,你可以在model URL, widget下面看到。此外,该版本已被标记为生产阶段。你可以调用其中任何一个。如前所述,输入是pandas JSON格式。在左边,你可以剪切和粘贴请求,然后响应在右边。
下面是如何使用cURL完成此操作的示例。您只需获取该端点URI,指定适当的JSON,然后向其提供数据。这和我们之前看到的语法完全一样。这是实际的MLflow评分服务器,所以格式完全相同。这只是它的一个不同的化身。这里有一些关于Databricks模型服务的资源。有好几篇博文都是关于它的。在Databricks上有官方文档。所以你可以去获取更多的信息。反馈对我们来说非常重要,所以如果你对这次演讲有任何问题或意见,请随时与我们联系。 And we’ll be looking forward to your feedback. Okay, that’s basically it. Have a good day and have fun with model serving. Thanks.

安德烈Mesarovic

Databricks的高级常驻解决方案架构师,专注于MLflow和ML生产管道。
阅读更多