工程的博客

使用MLOps与MLflow和Azure

2020年10月13日 工程的博客

分享这篇文章
该博客包含了Azure Databricks、Azure DevOps和纯Python的代码示例。请注意,大部分代码依赖于Azure环境,不能在Databricks社区版或基于aws的Databricks中工作。

如今,大多数组织都有一个已定义的流程来将代码(如Java或Python)从开发提升到QA/测试和生产。很多人都在使用持续集成和/或持续交付(CI/CD)进程和经常使用的工具,如Azure DevOps或者詹金斯来帮忙。Databricks提供了许多资源,详细介绍了Databricks统一分析平台如何与这些工具集成bob体育亚洲版bob体育客户端下载Azure DevOps集成詹金斯集成).此外,还有一个数据实验室项目-CI / CD模板——以及一个相关的博客它为GitHub Actions和Azure DevOps提供了自动化模板,这使得集成更加容易和快速。

然而,当涉及到机器学习时,大多数组织都没有同样的纪律严明的过程。这有很多不同的原因:

  • 数据科学团队不遵循与普通开发人员相同的软件开发生命周期(SDLC)过程。机器学习生命周期(MLLC)的关键差异与目标、质量、工具和结果有关(见下图)。
  • 机器学习仍然是一个年轻的学科,它通常没有很好地整合在组织上。
  • 数据科学和部署团队不会将结果模型视为需要正确管理的单独工件。
  • 数据科学家正在使用大量的工具和环境,这些工具和环境没有很好地集成,也不容易插入到上面提到的CI/CD工具中。

为了解决这些问题和其他问题,Databricks正处于领先地位MLflow,一个机器学习生命周期的开源平台。bob体育客户端下载虽然MLflow有许多不同的组件,但我们将重点关注MLflow模型注册表在这个博客里。

MLflow Model Registry组件是一个集中的模型存储、一组api和一个UI,用于协作管理机器学习模型的整个生命周期。它提供了模型沿袭(MLflow实验和运行后生成模型)、模型版本控制、阶段转换(例如从登台到生产)和注释。

Azure Databricks统一数据和分析平台包括托管MLflow,可以非常容易地利用MLfbob体育客户端下载low模型注册表等高级MLflow功能。此外,Azure Databricks与其他Azure服务紧密集成,例如Azure DevOps而且Azure毫升

Azure DevOps是一个集成了许多Azure服务的基于云的CI/CD环境。Azure ML是一个机器学习平台,在本例中,它将为生成的模型bob体育客户端下载提供服务。这篇博客提供了一个端到端的例子,说明如何有效地将所有这些部分连接起来。

端到端模型治理过程

为了说明为什么MLOps管道是有用的,让我们考虑以下业务场景:Billy是在Wine公司工作的数据科学家。Wine Inc.是一家全球葡萄酒批发商,以能够找到并推广比同类质量葡萄酒便宜得多的高质量葡萄酒而自豪。Wine Inc.成功的关键因素是葡萄酒的机器学习模型,它可以预测葡萄酒的质量(例如,我们正在使用一个公共模型葡萄酒品质数据集(由Cortez等人发表。).该数据集的主要特征包括化学特征,如固定酸度、柠檬酸、残留糖、氯化物、密度、pH值和酒精。它还包括一个基于感官的质量评分,介于0到10之间。比利不断地对模型进行改进,使其尽可能准确。该模型的主要消费者是现场葡萄酒测试员。现场葡萄酒测试员在全球范围内测试葡萄酒,并可以快速分析葡萄酒的主要特征。品酒师立即在手机应用程序中输入葡萄酒的特征,该应用程序立即向品酒师返回预测质量分数。如果得分足够高,品酒师可以当场获得葡萄酒进行批发销售。

比利已经开始使用MLFlow模型注册表储存和管理不同版本的葡萄酒质量模型。MLflow模型注册中心建立在MLflow现有功能的基础上,为组织提供一个共享ML模型的中心场所,协作将模型从实验转移到测试和生产,并实现审批和治理工作流。

注册表在管理模型及其生命周期的不同版本方面有很大的帮助。

一旦机器学习模型经过适当的训练和测试,就需要将其投入生产。这也被称为模型服务或评分环境。有多种类型ML模型服务体系结构.正确的ML生产架构类型取决于两个关键问题的答案:

  1. 数据刷新的频率:多久提供一次数据,例如一天一次,一天几次,连续的,还是临时的?
  2. 推理请求响应时间:我们需要多快地响应这个模型的推理请求,例如在小时、分钟、秒或亚秒/毫秒内?

如果频率是一天几次,并且所需的推理请求响应时间是几分钟到几小时,那么批量评分模型将是理想的。如果数据是连续提供的,则应该考虑流架构,特别是在需要快速得到答案的情况下。如果数据是临时提供的,并且需要在几秒或几毫秒内得到答案,那么基于REST api的评分模型将是理想的。

在Wine Inc.的案例中,我们假设后一种情况,即现场测试人员请求临时结果并期望立即响应。提供基于REST的模型服务有多种选择,例如使用Databricks REST模型服务或者简单的基于Python的模型服务器由MLFlow支持。在Azure生态系统中提供模型服务的另一个流行选择是使用AzureML。Azure ML提供了一个基于容器的后端,允许部署基于rest的模型评分。MLflow直接支持Azure ML作为服务端点。本文的其余部分将重点讨论如何最好地利用这个内置的MLflow功能。

上面的图说明了需要哪些端到端步骤。我将使用该图作为向导,详细介绍管道的不同步骤。请注意,为了演示的目的,这个管道仍然有些简化。

主要步骤如下:

  • 步骤1、2和3:训练模型并将其部署到model Registry中
  • 步骤4到9:设置管道并在QA中运行ML部署
  • 步骤10到13:将ML模型推广到生产环境

步骤1、2和3:训练模型并将其部署到model Registry中

请参考以下笔记本进行指导:

Azure Databricks模型通过MLflow进行培训和部署

Billy使用Azure Databricks统一数据和分析平台不断开发他的葡萄酒模型。bob体育客户端下载他使用Databricks管理的MLflow来训练他的模型,并使用MLflow的跟踪服务器运行许多模型变体,以找到可能的最佳模型。一旦Billy找到了更好的模型,他就使用下面的Python代码将结果模型存储在MLflow模型注册表中。

结果mlflow.register_model (model_uri,model_nametime . sleep (10版本result.version

(需要睡眠步骤来确保注册中心有足够的时间注册模型)。
一旦Billy确定了他的最佳模型,他就将其作为“分期”模型注册到模型注册表中。

客户端= mlflow.tracking.MlflowClient()client.transition_model_version_stage (name = model_name,version =版本,阶段=“暂存”

Azure DevOps提供了一种在Azure生态系统中自动化推广、测试和部署模型的端到端流程的方法。它需要创建一个Azure DevOps管道。本博客的其余部分将深入探讨如何最好地定义Azure DevOps管道,并将其与Azure Databricks和Azure集成。

一旦Billy定义了Azure DevOps管道,他就可以以编程方式触发管道,这将测试模型并将其推广到移动应用程序使用的生产环境中。

Azure Pipeline是Azure DevOps的核心组件。它包含了访问和运行代码的所有必要步骤,这些代码将允许ML管道的测试、推广和部署。关于Azure管道的更多信息可以找到在这里

Azure DevOps的另一个核心组件是repo。repo包含与构建和部署管道相关的所有代码。回购存储了所需的所有工件,包括:

  1. Python笔记本和/或源代码
  2. 与Databricks和MLflow交互的Python脚本
  3. 管道源文件(YAML)
  4. 文档/阅读我等等。

下图显示了Wine Inc.管道的DevOps项目和回购:

示例DevOps项目和管道存储库。

DevOps管道在YAML中定义。这是这篇博文中管道的YAML文件示例,

定义DevOps管道的YAML示例文件。

第3行:触发器:通常情况下,管道将由代码更改自动触发。由于在model Registry中提升模型不是代码更改,Azure DevOps REST API可以用于以编程方式触发管道。管道也可以通过UI手动触发。

这是代码培训笔记本使用DevOps REST API来触发管道:

azure.devops.connection进口连接msrest.authentication进口BasicAuthenticationazure.devops.v6_0.pipelines.models进口RunPipelineParameters、变量填写您的个人访问令牌和组织URLPersonal_access_token = dbutils.secrets.get(“ml-gov”“ado-token”organization_url =“https://dev.azure.com/ML-Governance”#与组织建立联系凭证= BasicAuthentication(''personal_access_token)connection = connection (base_url=organization_url, creds=凭证)#获得客户(“核心”客户提供项目、团队等的访问权限)pipeline_client = connection.clients_v6_0.get_pipelines_client ()#设置管道的变量变量=变量(值= model_name)变量= {“model_name”:变量}run_parameters = RunPipelineParameters(变量=变量)打印(run_parameters)在MKL治理项目V2中运行管道,id为6 (ML治理V3))runPipeline = pipeline_client.run_pipeline(run_parameters=run_parameters,project=“ML治理V2”pipeline_id =6

步骤4到9:设置管道并在QA中运行ML部署

Azure管道是一个YAML文件。它将首先设置环境(全部基于Python),然后将模型部署到Azure QA环境中进行测试。

第15到19行:先决条件:管道安装一组运行脚本所需的库。我们使用Python来运行脚本。在使用Azure Databricks时,有各种不同的选项可以在Python中运行代码。我们将在这篇博客中使用其中的一些。

使用Databricks命令行接口:Databricks CLI提供了一种与REST API交互的简单方法。它可以创建和运行作业,上传代码等。当不需要复杂的交互时,CLI是最有用的。在本例中,管道用于将Azure ML的部署代码上传到Azure Databricks工作空间的独立部分,以便执行。执行稍微复杂一些,因此将在下面的Python脚本中使用REST API来完成。

第32至37行:执行Python脚本executenotebook.py。它以一些值作为参数,例如Databricks主机名等。它还允许将参数传递到笔记本中,例如应该部署和测试的模型的名称。

代码与Databricks笔记本和管道本身一起存储在Azure DevOps存储库中。因此,总是可以复制执行管道时使用的精确配置。

-任务:PythonScript@0输入:scriptSource:“filePath”scriptPath:“$ (Build.Repository.LocalPath) / cicd-scripts / executenotebook.py”参数:——shard $(DATABRICKS_HOST)——token $(DATABRICKS_TOKEN)——cluster $(EXISTING_CLUSTER_ID)——localpath $(Build.Repository.LocalPath)/notebooks/Users/(电子邮件保护)/ML/deploy——workspacepath /Demo/Test——outfilepath /home/vsts/work/1/ notebooks/ users /(电子邮件保护)——params model_name = $ (model_name)”displayName:将MLflow模型从注册表部署到Azure ML进行测试

笔记本“deploy_azure_ml_model”执行该场景中的一个关键任务,主要是使用内置MLflow部署功能将MLflow模型部署到Azure ML环境中。笔记本是参数化的,所以它可以重复用于不同的模型、阶段等。

使用MLflow库在Azure ML中部署模型的Azure Databricks示例代码片段。

以下来自Notebook的代码片段是使用MLflow库在Azure ML中部署模型的关键部分:

进口mlflow.azureml
              Model_image, azure_model = mlflow.azureml.build_image(model_uri=model_uri,工作区=工作区,model_name = model_name +“-”+阶段,image_name = model_name +“-”+阶段+“图像”描述= model_name,标签= {“阿尔法”str(latest_sk_model.alpha),“l1_ratio”str(latest_sk_model.l1_ratio),},同步=真正的

这将在Azure ML工作空间中创建一个容器映像。下面是Azure ML工作区中的结果视图:

在ML工作区中通过Azure Databricks笔记本中的代码创建的示例容器图像。

下一步是创建一个提供REST API的部署:

在Azure Databricks笔记本中通过代码创建必要的REST API的示例部署。

这个Notebook的执行大约需要10-12分钟。executenotebook.py提供了允许Azure DevOps环境等待Azure ML部署任务完成的所有代码。它将每10秒检查一次作业是否仍在运行,如果确实在运行,则返回睡眠状态。当模型成功部署到Azure ML上时,Notebook将返回结果模型REST API的URL。这个REST API将进一步用于测试模型是否正确地对值进行评分。

当管道运行时,用户可以监视进度。屏幕截图显示了API调用,然后在调用之间等待10秒。

从Azure Databricks笔记本上执行AzureML的ML模型示例部署。

下一步是执行Notebook的测试。像前面的步骤一样,它触发executenotebook.py代码,并传递测试笔记本的名称(“test_api”)以及前面步骤中的REST API。

任务:PythonScript@0输入:scriptSource:“filePath”scriptPath:“$ (Build.Repository.LocalPath) / cicd-scripts / executenotebook.py”参数:——shard $(DATABRICKS_HOST)——token $(DATABRICKS_TOKEN)——cluster $(EXISTING_CLUSTER_ID)——localpath $(Build.Repository.LocalPath)/notebooks/Users/(电子邮件保护)/ML/test——workspacepath /Demo/ test——outfilepath /home/vsts/work/1/ notebooks/ users /(电子邮件保护)- - - params model_name = $ (model_name) scoring_uri = $(响应)displayName:使用REST API从注册表中测试MLflow模型

测试代码可以根据需要简单或复杂。的“test_api”笔记本简单地使用初始训练数据中的记录,并通过Azure ML的模型REST API提交它。如果它返回一个有意义的值,则认为测试成功。更好的测试方法是使用API定义一组预期结果,并使用一组更大的记录。

步骤10到13:将ML模型推广到生产环境

给定一个成功的测试,接下来需要发生两件事:

  1. MLflow模型注册表中的模型应该提升为“生产”,这将告诉Billy和其他数据科学家哪个模型是正在使用的最新生产模型。
  2. 该模型需要在Azure ML内部投入生产。

下一步会照顾到第一步。它使用Azure Databricks上托管的MLflow REST API。使用API,模型可以提升(在Dev Ops中使用mlflow.py脚本),而无需在Azure Databricks本身执行任何代码。只需要几秒钟。

该脚本将具有给定名称的最新模型从登台升级到生产

该脚本升级最新的模型给定的名称从暂存到生产中进口importlib pprint, json,操作系统mlflow_http_client进口MlflowHttpClient、get_host get_token进口pprint
              客户端= MlflowHttpClient(host=get_host(),token=get_token()))Pp = pprint。PrettyPrinter(缩进=4model_name = os.environ.get (“MODEL_NAME”打印“模式名称为:”+ model_name)RSP = client.get(“registered-models / get-latest-versions吗?name = "+ model_name +“阶段=分期”如果len(负责)> =1版本= rsp[“model_versions”] [0] [“版本”其他的提高BaseException ('没有命名为:'的模型的分段模型+ model_name)结果=负责(“model_versions”] [0] [“版本”数据= {“名称”: model_name,“版本”:版本,“舞台”“生产”“archive_existing_versions”RSP = client.post(“模型版本/过渡阶段”、数据)pp.pprint(负责)响应=负责(“model_version”] [“版本”打印返回值为:+反应)打印“# # vso[任务。setvariable变量=反应;]% s的%(响应))

我们可以用Azure Databricks Model UI来验证这种情况确实发生了:我们可以看到有一个新的生产级模型(版本4)。作为一个提示,虽然生产中可能有多个模型,但我们不认为这是一个好做法,所以所有其他生产版本都应该存档(MLflow提供了一个通过设置自动启用此功能的功能)archive_existing_versions = true).

从Azure Databricks笔记本在AzureML中执行ML模型部署到生产的示例。

下一步只是重复第4步到第11步。我们将在Azure ML中重新部署模型,并指出这是生产环境。请注意,Azure DevOps有一组单独的部署管道,为了让事情更简单,我们在本博客中没有使用这些管道。

讨论

这篇文章演示了如何通过使用Azure Databricks、Azure DevOps和Azure ML自动化MLLC。它演示了使用Databricks REST API、notebook和Databricks CLI与Azure中的不同服务集成的不同方式。下面是本博客中提到的三本笔记本的链接

如有疑问或意见,请联系(电子邮件保护)

免费试用Databricks

相关的帖子

看到所有工程的博客的帖子