【ML on Kubernetes】第 10 章:构建、部署和监控模型

 🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

技术要求

使用 JupyterHub 可视化和探索数据

使用 JupyterHub 构建和调整模型

使用 MLflow 跟踪模型实验和版本控制

跟踪模型实验

版本控制模型

将模型部署为服务

调用你的模型

监控您的模型

了解监控组件

配置 Grafana 和仪表板

概括


在上一章中,您构建了数据管道并创建了一个可供数据科学团队使用的基本飞行数据集。在本章中,您的数据科学团队将使用飞行数据集来构建机器学习ML ) 模型。该模型将用于预测航班的准点率。

在本章中,您将看到该平台如何帮助您可视化和试验数据以构建正确的模型。您将看到如何调整超参数并比较不同模型训练运行的结果。您将看到如何使用平台提供的组件注册和版本模型。您将模型部署为 REST 服务,并开始使用平台提供的组件监控部署的模型。

请记住,这本书不是关于数据科学的,相反,重点是让团队能够自主高效地工作。您可能会看到前面章节中重复了一些概念和步骤。这是为了向您展示前面章节中提供的概念如何帮助您构建完整的生命周期。

牢记目标,您将了解以下主题:

  • 使用 JupyterHub 可视化和探索数据
  • 使用 JupyterHub 构建和调整模型
  • 使用 MLflow 跟踪模型实验和版本控制
  • 通过 Seldon 和 Airflow 将模型部署为服务
  • 使用 Prometheus 和 Grafana 监控模型

技术要求

本章包括一些动手设置和练习。您将需要一个配置了Operator Lifecycle Manager ( OLM ) 的正在运行的 Kubernetes 集群。第 3 章探索 Kubernetes”中介绍了构建这样的 Kubernetes 环境。在尝试本章中的技术练习之前,请确保您有一个正常工作的 Kubernetes 集群,并且在您的 Kubernetes 集群上安装了开放数据中心ODH )。第 4 章机器学习平台剖析”中介绍了 ODH 的安装。

使用 JupyterHub 可视化和探索数据

记起第 9 章构建您的数据管道数据工程师与业务的 SME 合作,准备了可用于预测航班准点率的航班数据。

在本节中,您将了解数据工程团队生成的数据。这是负责构建模型的数据科学家的角色。您将看到该平台如何使您的数据科学和数据工程团队能够协作,以及数据科学家如何使用该平台为给定问题构建模型。

让我们使用该平台进行一些基础数据探索。请记住,本书的重点是使您的团队能够有效地工作。重点不是数据科学或数据工程,而是构建和使用平台:

1.启动 JupyterHub,但这次选择与数据科学生命周期相关的图像。SciKit 就是平台上可用的此类图像之一。暂时不要单击“启动服务器”按钮。

图 10.1 – JupyterHub 登陆页面

2.上JupyterHub 登录页面,添加一个AWS_SECRET_ACCESS_KEY变量并使用 S3 环境的密码填充它。本练习中此键的值将是minio123。请注意,我们使用了容器大小来容纳数据集。现在,点击Start server按钮启动 JupyterHub IDE。

图 10.2 – JupyterHub 登陆页面

3.在 JupyterHub IDE 中打开chapter10/visualize.ipynb文件笔记本。

4.首先就是读取数据工程团队提供的数据。请注意,数据在同一平台上可用,这提高了团队的速度。笔记本中的单元格 2使用PyArrow库将数据作为 pandas 数据框读取。您将从数据团队放置数据的航班数据存储桶中读取数据。可以看到数据读取代码如下:

图 10.3 – 第 10 章/可视化笔记本的单元格 2

5.您要做的第一件事是查看数据。尝试理解它并熟悉可用的东西可能是这里的理想选择。您可以在单元格 3中看到 DataFrame 的head函数已用于查看前几行。你会注意到字段名称和其中的数据,看看你是否能理解一条记录。请注意,有些字段是NaN,有些是None。这为您提供了一个线索,即数据集可能尚未准备好构建模型。这下列的screen 捕获部分输出,并且预计您在您的环境中运行此代码以获得完整的图片:

图 10.4 – 第 3 章的单元格 10/可视化笔记本

6.下一阶段是做一个简单的验证,看看有多少数据可供您使用,以及您是否正在阅读所有记录。您可以在单元格 4中看到 DataFrame 的count函数已用于此目的。以下屏幕捕获了部分输出,预计您在您的环境中运行此代码以获得完整的画面:

图 10.5 – 第 10 章/可视化笔记本的单元格 4

7.单元格 56使用DataFrame 的形状和列的功能是不言自明的。

8.单元 7使用 DataFrame 的describe函数为数据集生成一些基本统计信息。您可以使用它来验证是否存在一些可能没有意义的数据。例如, taxi_in时间的最大值可能非常高。在这种情况下,您将与您的 SME 一起根据需要澄清和调整记录。以下屏幕捕获了部分输出,预计您在您的环境中运行此代码以获得完整的画面:

图 10.6 – 第 10 章/可视化笔记本的单元格 7

9.接下来,您要查看数据是否具有空值。您在第 3 步中已经看到,数据中有一些NaNNone值。您发现有很多列存在数据缺失问题。以下屏幕截图部分的输出,并且预计您在您的环境中运行此代码以获得完整的图片:

图 10.7 – 第 8 章的单元格 10/可视化笔记本

10.您将使用 Dataframe 的isnull函数来找出有多少记录有此缺失数据。使用df.isnull().sum().sort_values(ascending = False)代码的输出,有两个不同的组。输出的前六行显示具有非常高的缺失数据率的列名称,对于这些列,您可以与数据工程和 SME 联系以查找可以从中获取数据的资源。对于我们的示例,我们将只删除这些列。

图 10.8 – 第 10 章/可视化笔记本的单元格 9

11.在里面第二组,从wheels_on列开始,您可以选择删除不包含数据的行或尝试使用合适的统计函数填充数据。例如,缺少的tax_in列可能是同一机场和同一时间的平均值。该策略必须与团队讨论。对于本练习,我们将只删除行。

图 10.9 – 第 10 章/可视化笔记本的单元格 9

12.通常,调查特定列没有数据的示例行是一个好主意。您可能会在数据中找到一种模式,这对于进一步理解数据非常有用。您已选择查看tail_number字段没有值的行,并查看是否可以找到任何模式。这下列的screen 捕获部分输出,并且预计您在您的环境中运行此代码以获得完整的图片:

图 10.10 – 第 10 章的单元格 10/可视化笔记本

13.然后,您将运行 Dataframe 的info函数来找出列的数据类型。很多时候,列的数据类型不是您所期望的。然后,您将与 SME 和数据团队交谈以提高数据质量。以下屏幕捕获了部分输出,预计您在您的环境中运行此代码以获得完整的画面:

图 10.11 – 第 11 章的单元格 10/可视化笔记本

14.可视化理解数据的一个特别重要的工具。你可以使用任何你觉得舒服的库。例如,在此笔记本的最后一个单元格中,您构建了一个图表以找出DELAYED列的数据分布。想象一下,99% 的记录的DELAYED列为0。如果是这种情况,数据可能不足以预测航班的准点率,您需要聘请 SME 和数据团队来获取更多数据。对于本练习,我们将使用现有的数据分布。

图 10.12 – 第 10 章/可视化笔记本的单元格 12

现在我们更好地理解了飞行数据,让我们开始构建我们的模型。在现实世界中,你会投入更多是时候了解数据了。本书的重点是向您展示如何执行模型开发生命周期,因此我们将示例保持在最低限度。

使用 JupyterHub 构建和调整模型

作为数据科学家,你会想尝试不同的具有不同参数的模型以找到合适的拟合。在开始构建模型之前,请回顾第 8 章使用平台构建完整的 ML 项目,您需要定义评估标准,并且对于许多用例来说,准确性可能是一个误导性标准。

对于飞行用例,我们假设您的团队和 SME 就PRECISION指标达成一致。请注意,精确度衡量的是提供的数据集中正确肯定识别的部分。

让我们开始编写我们的模型,看看该平台如何使数据科学家高效地执行他们的工作:

1.在 JupyterHub 环境中打开chapter10/experiments.ipynb文件笔记本。

2.在Cell 2中,将连接信息添加到 MLflow。回想一下,MLflow 是平台中记录模型实验并用作模型注册表的组件。在代码中,您将配置EXPERIMENT_NAME,它为您的实验运行提供一个名称。该单元格的最后一行提到了 MLflow 将如何记录实验运行。自动日志功能使MLflow能够在训练期间注册自动回调,以记录参数以供以后使用。

提供 S3 存储桶的配置,MLflow 将使用它来存储您的实验工件:

图 10.13 – 第 10 章/实验笔记本的单元格 2

3.单元 3读取数据工程团队提供的数据,单元 4再次提供有关多列缺失数据的信息。在此笔记本中,您将使用此信息删除您认为无用的列。以下屏幕捕获了部分输出,预计您在您的环境中运行此代码以获得完整的画面:

图 10.14 – 第 10 章/实验笔记本的单元格 3

4.单元格 5下降两组列。第一组删除大多数行中没有数据的列。您根据上一步选择了这些列。我们在这里保持简单并删除了列;但是,强烈建议您与数据团队合作,找出这种异常的原因,并争取尽可能多的数据。您要删除的列是"cancellation_reason""late_aircraft_delay""weather_delay""airline_delay""security_delay""air_system_delay",如下图所示:

图 10.15 – 第 10 章/实验笔记本的单元格 5

第二个drop语句正在删除tail_number列。此栏可能对航班延误没有任何作用。在现实世界的场景中,您需要与 SME 讨论这个问题:

图 10.16 – 第 10 章/实验笔记本的单元格 5

5.单元格 6正在使用 Dataframe 的dropna函数删除数据不可用的行。回想一下步骤 3中缺少数据的行数与可用的总行数相比,这些列更少。air_timearrival_delayelapsed_time是第 5 步中此类列的示例。我们采用这种方法来保持简单;更好的方法是找到一种方法来获取丢失的数据或从现有值创建这些数据。

图 10.17 – 第 10 章/实验笔记本的单元格 6

6.在单元格 7中,您将删除没有未来航班数据的列。回想一下,该模型旨在预测未来的航班准点率。但是,诸如离开时间和到达时间之类的包含实际的出发和到达时间。为了预测未来的航班,您在预测时将无法获得此类数据,因此您需要在训练模型时删除这些列。

图 10.18 - 第 10 章/实验笔记本的单元格 7

7.在数据集中,计划出发和到达时间以 HHMM 格式提供,其中 HH 是小时,MM 是分钟。在Cell 8中,作为数据科学家,您可以选择将此数据拆分为两个不同的列,其中一列代表小时,另一列代表分钟。如果预期分类和拆分数据之间存在某种相关性,则这样做可以简化数据集并提高模型性能。你可以根据直觉来做,或者你可以讨论这个中小企业的选择。

您已选择拆分schedule_departureschedule_arrival列:

图 10.19 - 第 10 章/实验笔记本的单元格 8

8.在Cell 9中,您再删除几列。第一组包含我们必须将时间分成小时和分钟的列,例如schedule_arrival

图 10.20 - 第 10 章/实验笔记本的单元格 9

第二组包含在其他列中表示的列。例如,origin_airport列有一个机场键,而ORIG_AIRPORT列是一个描述性名称。这两列代表相同的信息:

                                         图 10.21 - 第 10 章/实验笔记本的单元格 9

9.在单元格 10中,您可以使用head语句再次直观地看到数据集。你有注意到您有一些字符串格式的数据,例如航空公司列:

图 10.22 - 第 10 章/实验笔记本的单元格 10

您选择对该数据进行编码以将其转换为数字。有许多可用的技术,例如序数编码单热编码,仅举几例。对于这个例子,我们选择使用简单的OrdinalEncoder。该编码器将分类值编码为整数数组。在单元格 12中,您已将类别编码应用于选定的字段,例如航空公司origin_airport

图 10.23 – 第 10 章/实验笔记本的单元格 12

这意味着这些字段的输入字符串数据将被转换为整数。这对训练有好处;但是,在推理时,调用者可能不知道您刚刚执行的这种编码。一种方法是保存此编码器并在推理时使用它将值从字符串转换为整数。因此,您的推理管道将包括两个步骤。第一步是应用编码,第二步是使用保存模式预测响应。在单元格 12的最后四行,您已经保存了编码器,并且必须将其注册到 MLflow:

图 10.24 – 第 10 章/实验笔记本的单元格 12

10.在单元格 13中,您使用head语句验证数据。请注意,航空公司列(您已应用类别编码的列之一)已更改。例如,比较单元格 10单元格 13中航空公司列的值,注意航空公司列中WN的值已更改为1。这确认编码已成功应用于数据集:

图 10.25 – 第 10 章/实验笔记本的单元格 13

11.在单元格 14中,您使用了dftype语句来验证数据集中每一列的数据类型。许多算法需要采用数字格式的数据,并且根据可用的模型,您可能需要将所有字段移动为数字格式。

12.在Cell 15中,您已将数据拆分为训练集和测试集。您将使用X_Trainy_train集训练模型,并使用X_Testy_test验证模型性能。您可以执行交叉验证进一步评估模型在未见数据上的性能。我们假设您作为数据科学家已经了解这些概念,因此不会提供更多详细信息。

图 10.26 – 第 10 章/实验笔记本的单元格 15

13.在单元格 16中,您可以可视化数据集的数据分布。以下屏幕截图捕获了部分输出,预计您在您的环境中运行此代码以获得完整的图片:

图 10.27 – 第 10 章/实验笔记本的单元格 16

你可以从上图可以看出,数据偏向于准点航班。这可能会影响模型的性能。幸运的是,SciKit库的RandomForestClassifier对象提供了一个class_weight参数。它可以采用 Python字典对象,我们可以在其中为各个标签提供所需的权重。一个这样的示例是为DELAYED列中的值0分配较少的权重,该值表示准时飞行。可以平衡class_weight的不同值,这将指导算法按照与标签出现频率成反比的方式对标签进行加权。简单地说,在我们的例子中,与 DELAYED 列中的 0 值相比,平衡将更重视1

14.在Cell 19中,您定义一个随机森林分类模型,在Cell 20中,您训练模型。您已经注意到我们定义了非常少的超参数,然后使用GridSearchCV为给定数据集找到最佳估计器。我们在此单元格的注释中放置了一组单独的超参数。我们鼓励您尝试不同的组合。

图 10.28 - 第 10 章/实验笔记本的单元格 19

图 10.29展示了如何通过执行model.fit()函数来进行模型训练:

图 10.29 – 第 10 章/实验笔记本的单元格 20

培训将要需要一些时间才能完成,因此对于要训练模型的Cell 20,请耐心等待。

15.在单元格 21中,您已使用predict方法捕获测试数据的模型预测。注意rf_best_model模型是GridSearchCV对象的输出:

图 10.30 – 第 10 章/实验笔记本的单元格 21

16.在Cell 22中,您使用了混淆矩阵函数来计算矩阵并验证模型的性能:

图 10.31 – 第 10 章/实验笔记本的单元格 22

17.在单元格 23中,您使用了precision_score函数来计算您的模型在测试数据集上的召回分数。你可以看到你已经达到了 72% 的精度,这对于第一次实验运行来说是很好的。你可以跑更多实验和改进使用该平台的模型的指标:

图 10.32 – 第 10 章/实验笔记本的单元格 23

您已使用多个参数和RandomForestClassifier模型完成了一项实验运行。在这个阶段,您可能想要检查 MLflow 并查看网格搜索执行的所有运行、捕获的参数和模型性能数据。

通常,数据科学家会尝试多种算法来找到最适合给定问题的算法。由您来执行和增强代码并使用 MLflow 比较不同的算法。

让我们看看 MLflow 为我们记录了什么。

使用 MLflow 跟踪模型实验和版本控制

在这个部分,你会使用 MLflow 跟踪您的实验并为您的模型版本化。这个小部分是对第 6 章机器学习工程中向您强调的功能的回顾,我们在其中详细讨论了 MLflow。

跟踪模型实验

在这个部分,你将看到 MLflow 为您的实验记录的数据。请注意,您刚刚注册了 MLflow 并调用了autolog函数,MLflow 会自动记录您的所有数据。这是您平台中的一项强大功能,您可以通过它比较多次运行并与您的团队成员分享您的发现。

以下步骤向您展示了如何在 MLflow 中执行实验跟踪:

1.登录平台的 MLflow UI。

2.在左侧,您将看到Experiments部分,其中包含名为FlightsDelay-mluser的实验。单击它,您将看到以下屏幕。右侧显示所有运行。回想一下,我们使用了 GridSearchCV,所以会有多次运行:

图 10.33 – MLflow 中的模型跟踪细节

3.点击+图标,它将显示所有运行。根据超参数,我们有四次运行,并自动选择最佳运行。作为数据科学家,此功能将改善您的工作方式,并提供一个可以记录所有实验的系统,并且无需太多更改即可使用。您刚刚启用了自动日志功能, MLflow将自动捕获大部分指标。选择所有四个运行并点击比较按钮。

图 10.34显示了每次运行的比较以及与运行相关的超参数:

图 10.34 – 在 MLflow 中比较模型

4.点击运行下一个+图标,MLflow 将显示此运行的详细信息。在工件部分,您会发现模型文件可用。您还可以看到序数编码器文件也可以使用名称为FlightsDelayOrdinalEncoder.pkl

图 10.35 – MLflow 捕获的文件和数据

在本节中,您已经看到 MLflow 从您的训练运行中捕获所有指标并提供帮助通过提供比较功能来选择正确的模型。

下一阶段是对模型进行版本化。

版本控制模型

给了一些之后对模型性能的思考并与其他团队成员共享数据,您已选择可用于此项目的模型。在本节中,您将对要使用的模型进行版本化。请参阅第 6 章机器学习工程,我们在其中详细讨论了模型版本控制。

以下步骤将指导您如何对模型进行版本控制:

1.转到 MLflow 并单击左侧的FlightDelay-mluser实验。

2.然后,在在屏幕的右侧,单击在您跑步的+图标上。您将看到以下屏幕:

图 10.36 – MLflow 捕获的文件和数据

3.单击 artifacts 下的模型文件夹,将出现一个带有Register Model标签的蓝色按钮:

图 10.37 – 在 MLflow 中对模型进行版本控制

4.单击注册模型按钮并输入一个标识您的模型的名称。一个例子是航班准时

图 10.38 – MLflow 中的模型注册

作为一名数据科学家,你已注册您的模型将航班延误预测到模型注册表中。下一步是部署您的模型。

将模型部署为服务

在这个部分,您将把模型部署为 REST 服务。您将看到使用第 7 章模型部署和自动化中提到的细节,团队可以将模型打包并部署为服务。然后,您的模型的用户将使用此服务。我们强烈建议您在继续本节之前从第 7 章模型部署和自动化”中更新您的知识。

第 7 章模型部署和自动化中,您已经使用Predictor类部署了模型,该类将模型公开为 REST 服务。您将在此处使用相同的类,但是,在飞行项目中,您在将数据用于模型训练之前对数据应用了分类编码。这意味着您需要在推理时对输入数据应用相同的编码。回想一下,在本章前面,您将文件保存为FlightsDelayOrdinalEncoder.pkl,它在 MLflow 存储库中可用。

下一步是编写一个简单的类,可以将转换应用于输入数据。定义此类后,您将使用 Seldon 定义推理管道,然后将模型打包为容器。因此,您的推理管道将包括两个阶段;第一阶段是应用编码,第二阶段是使用模型来预测类别。

听起来很难?您将看到平台抽象了大部分细节,并且您将提供一些配置参数来打包和部署您的模型作为服务。

我们先来看看Transformer类,它将加载FlightDelayOrdinalEncoder.pkl文件并将编码应用于输入数据。打开chapter10/model_deploy_pipeline/model_build_push/Transformer.py文件。你会看见__init__函数加载编码器文件,而transform_input函数使用标准转换函数将转换应用于输入数据。这与您在模型训练期间使用的功能相同。图 10.39显示了代码文件:

图 10.39 – 变压器类

第二个工件是定义模型推理图。回想一下第 7 章模型部署和自动化,您已经使用SeldonDeploy.yaml文件在推理图中定义了一个容器和一个阶段。在本节中,您将扩展推理图以适应推理管道的转换和预测部分。自然,当您在图表中定义新组件时,您还需要定义相应的容器,该容器将作为图表节点的服务。

请注意,您可以选择在Predict.py中执行转换逻辑以保持简单。但是,我们想展示 Seldon 如何构建复杂的图表,并且每个图表都可以是容器的一个单独实例。这种方法为以弹性方式运行生产模型带来了多功能性。

所以,让我们看一下chapter10/model_deploy_pipeline/model_deploy/SeldonDeploy.yaml文件。这个文件已从第 7 章模型部署和自动化中复制而来,并对其进行了以下更改。

第一个变化是构建推理图。您需要先应用转换,然后运行模型预测。图 10.40显示了这个图表。请注意,图的根元素属于TRANSFORMER类型,名称为transformer,并且图中有一个节点。节点将在根节点之后执行。此设置允许您根据模型要求拥有不同的图表。此示例中的子节点是实际预测:

图 10.40 – Seldon 部署 YAML

Chapter10/model_deploy_pipeline/model_deploy/SeldonDeploy.yaml文件的第二个更改是为根节点和子节点注册容器。图中的名称字段是将容器与图节点相关联的字段。所以,我们将有两个容器的实例,一个用于变压器,第二个用于预测器转换器实例将执行Transformer.py文件,而预测器实例将执行Predictor.py文件。我们所做的是用所有这些文件创建一个容器镜像,所以我们的容器镜像是一样的。您可以检查chapter10/model_deploy_pipeline/model_build_push/Dockerfile.py文件,在该文件中将所有文件打包到容器映像中。图 10.41突出显示了SeldonDeploy.yaml中已配置容器的部分。

请注意,第一个容器的名称为transformerMODEL_NAME变量提到了 Python 文件的名称,SERVICE_TYPE变量提到了 Seldon 调用的回调类型。回想一下,Transformer.py有一个transform_input方法,SERVICE_TYPE引导 Seldon 系统调用正确的函数。这同样适用于预测器容器实例,请注意预测器实例的MODEL_NAMESERVICE_TYPE有何不同:

图 10.41 – Seldon 部署 YAML

这就对了!为了你们中的一些人,这可能有点压倒性,但是一旦你为你的项目定义了结构,这些文件就可以标准化,数据科学家不需要为每个项目更改它们。您已经看到 ML 平台如何让您在构建模型和打包模型方面自给自足。

下一步是编写一个简单的 Airflow 管道来部署您的模型。在开始本节之前,我们建议您更新有关使用 Airflow 部署模型的知识,详见第 7 章模型部署和自动化。您已构建的管道无需更改,您只需更改一些配置参数即可为管道提供正确的模型名称和版本。

我们已经为您预先构建了这个管道,因此,打开chapter10/model_deploy_pipeline/flights_model.pipeline文件。打开此文件并验证它是否具有与第 7 章“模型部署和自动化”中提到的相同的两个阶段。第一阶段构建容器镜像并将其推送到容器注册表,第二阶段使用 Seldon 部署模型。

图 10.42显示了用于构建和推送容器镜像的参数的第一阶段。运行时映像文件依赖项具有与前面所示相同的值。请注意环境变量部分,其中变量名称相同但值不同:

图 10.42 – 航班模型部署管道

让我们来看看他们每个人:

  • MODEL_NAME的值为flight -ontime。这是您在使用 MLflow 注册模型时获得的模型名称。
  • MODEL_VERSION的值为1。这是您要部署的模型版本。此版本记录在 MLflow 系统中。
  • CONTAINER_DETAILS的值为flight-ontime。这是您在使用 MLflow 注册模型时获得的模型名称。
  • CONTAINER_REGISTRY是容器注册表 API 端点。对于 DockerHub,位于Docker Hub。将此变量的值设置为https://index.docker.io/v1/。在此示例中,我们使用quay.io作为注册表。这是您可以使用的另一个免费注册表。
  • CONTAINER_REGISTRY_USER是将图像推送到图像注册表的用户的用户名。将此设置为您的 DockerHub 用户名或 Quay 用户名。
  • CONTAINER_REGISTRY_PASSWORD是您的容器注册表用户的密码。在生产,你不想这样做。您可以使用秘密管理工具来提供您的密码。

CONTAINER_DETAILS也是图像将被推送到的存储库的名称以及图像名称和图像标签。图 10.43显示了第二阶段,其中包含用于使用 Seldon 部署容器映像的参数。运行时映像文件依赖项具有与前面所示相同的值。请注意,环境变量是您为此部署设置变量值的部分。必需的变量是MODEL_NAMEMODEL_VERSIONCONTAINER_DETAILSCLUSTER_DOMAIN。您已经看到了上一段中的所有变量,但CLUSTER_DOMAIN是 Kubernetes 集群的 DNS 名称。在这种情况下,minikube 的 IP 地址是<Minikube IP>.nip.io

图 10.43 – 航班模型部署管道

保存并部署将此 DAG 添加到您的 Airflow 环境,并且在 Airflow DAG 完成执行后,该模型将可供使用。通过登录 Airflow 并检查 DAG 的状态来验证此 DAG 是否已正确执行。图 10.44显示了您已验证 DAG 状态的 Airflow UI。请注意,我们已将 DAG 保存在名称flight-model-deploy下;如果您选择了其他名称,您的 DAG 名称将相应反映。

图 10.44 – 飞行管道的气流 DAG

回想一下,MLflow 为每个实验关联了一个运行 ID。您在模型注册表中注册这些实验之一,以便可以部署它。请参阅图 10.34,它显示了此模型的运行 ID 的屏幕截图。

此模型运行将与部署的模型相关联,因此您的团队可以跟踪环境中运行的模型到单个运行。此功能可追溯在不同环境中运行的模型版本。运行以下命令查看模型创建的资源:

kubectl get service,ingress,SeldonDeployment -n ml-workshop | grep bf32

您应该得到以下响应。如您所见,对于本示例,Kubernetes 服务和入口有一个以bf32开头的运行 ID 。请注意,对于您的情况,它将具有不同的值,您需要在前面的命令中调整运行 ID:

图 10.45 – 平台创建的 Kubernetes 对象

现在,模型已部署;您现在通过对模型运行 RESTful 调用来测试模型。

调用你的模型

回顾该模型通过由自动化创建的 Kubernetes Ingress 公开。为了测试模型是否作为 RESTful API 正常运行,请执行以下步骤:

1.运行以下命令以获取入口对象。请注意,入口对象的名称因您的设置而异:

kubectl get ingress <INGRESS_NAME> –n ml-workshop

2.现在,对模型可用于推理的位置进行 HTTP 调用。运行以下命令。Chapter10/inference文件夹包含飞行数据的有效载荷,作为回报,模型将预测航班延误的概率。

3.首先,将目录更改为chapter10/inference文件夹:

cd chapter10/inference

4.然后,运行curl命令将有效负载发送到模型。请注意根据您的设置更改 HTTP 地址:

curl -vvvvk --header "content-type: application/json" -X POST -d @data.json https://flights-ontime.192.168.39.216.nip.io/api/v1.0/predictions; done

Windows 用户可以选择使用优秀的 Postman 应用程序 ( Postman ) 进行 HTTP 调用。

5.打开chapter10/inference/data.json文件以查看我们发送到模型的有效负载。您会注意到json有效负载有两个部分。第一部分是names键,它捕获您用于训练模型的特征列。请注意,这里没有DELAYED列,因为模型将预测DELAYED列的概率。第二部分是ndarray键,它具有特征列的值。请注意,分类列的值是原始形式,推理管道将在执行模型之前将它们转换为分类值。图 10.46显示以下文件:

图 10.46 – 飞行模型推断的样本载荷

现在你有通过 HTTP 成功执行了推理调用,让我们看看监控系统是如何捕获信息的。

监控您的模型

在最后一节中,您将看到平台如何自动开始捕获模型的典型性能指标。该平台还可以帮助您可视化推理的性能。该平台使用 Seldon 来打包模型,Seldon 公开要捕获的默认指标。Seldon 还允许您为特定模型编写自定义指标;但是,这超出了本书的范围。

让我们从了解指标捕获和可视化的工作原理开始。

了解监控组件

道路指标捕获的工作原理是您的模型由 Seldon 包装。然后,Seldon 将指标公开给定义良好的 URL 端点,这在第 7 章模型部署和自动化中有详细介绍。Prometheus 收集这些信息并将其存储在其数据库中。该平台的 Grafana 连接到 Prometheus 并帮助您可视化记录的指标。

图 10.47总结了模型和监控组件之间的关系:

图 10.47 – ML 平台监控组件

让我们了解此图的每个组件:

  • 开放数据中心 (ODH) 运营商:这是我们平台的基础运营商。它的作用是为您的平台提供所有不同的组件。我们已经在本书的各个章节中讨论了这个运算符,因此我们在本节中不对其进行描述。
  • Prometheus Operator:Prometheus Operator 负责创建 Prometheus 服务器。ODH 操作员为 Prometheus 操作员创建 Kubernetes 订阅。您可以在manifests/prometheus/base/subscription.yaml找到订阅文件。以下片段显示它使用 OLM 机制安装 Prometheus 算子:

图 10.48 – Prometheus 算子订阅

  • Prometheus 服务器:Prometheus 操作员为您安装和配置 Prometheus 服务器。平台配置指示 Prometheus 操作员创建 Prometheus 服务器的文件。您可以在manifests/prometheus/base/prometheus.yaml找到该文件。以下片段显示了该文件:

图 10.49 – Prometheus 服务器配置

  • 服务监视器:服务监视器是您配置 Prometheus 的对象服务器从正在运行的 Kubernetes 服务和 pod 中查找和收集信息。服务监视器由平台定义,您可以在manifests/prometheus/base/prometheus.yaml找到一个示例。以下代码段显示了该文件。请注意,配置使用端口8000,这是 Seldon 公开指标信息的端口。选择对象定义了过滤器,Prometheus 将通过该过滤器决定从哪些 pod 中抓取数据:

图 10.50 – Prometheus 服务器监控 Seldon pod

  • Grafana Server:Grafana 是为 Prometheus 捕获的数据提供可视化的组件。Grafana 在使用 Prometheus 时更喜欢创建仪表板,并且正在不断改进其对 Prometheus 的支持。该平台通过manifests/grafana/base/deployment.yaml文件部署 Grafana。

在本节中,您已经了解了该平台如何提供和连接不同的组件来为您提供可视化框架来满足您的可观察性要求。

接下来是配置 Grafana。

配置 Grafana 和仪表板

在这个部分,你将要配置 Grafana 以连接到 Prometheus 并构建仪表板以可视化模型的指标。什么是仪表板?它是模型的一组图形、表格和其他可视化。您将为飞行模型创建仪表板。

请注意,这是一次性配置,不需要对每个模型都重复。这意味着一旦您有了仪表板,您就可以将它用于多个模型。您的团队可能会创建一些标准仪表板,一旦部署了新模型,平台就会自动找到它并使其可用于监控。

开始吧配置Grafana 实例:

1.使用 https://grafna.192.128.36.219.nip.io 登录 Grafana。请注意,您需要根据您的设置更改 IP 地址。在登录页面上,单击登录窗口底部的使用 KeyCloak 登录按钮:

图 10.51 – Grafana 登录页面

2.首先你将要需要添加数据源。数据源是一个系统,它将提供 Grafana 将帮助您可视化的数据。Prometheus 中的数据提供者从您的模型中抓取指标数据。选择配置| 左侧菜单中的数据源选项:

图 10.52 – Grafana 数据源菜单选项

3.点击添加数据源按钮,如如以下屏幕截图所示:

图 10.53 – 添加新的 Grafana 数据源

4.选择数据源类型,对于您的案例,它将是 Prometheus。您可能会注意到 Grafana 可以与各种数据源通信,包括 InfluxDB 和 YYYY,仅举几例。

图 10.54 – 添加新的 Prometheus Grafana 数据源

5.现在,你需要添加Prometheus 服务器的详细信息。Grafana 将使用这些详细信息从 Prometheus 服务器连接和获取数据。在提到的屏幕中添加以下属性:

  • 名称普罗米修斯
  • 网址:http://prometheus-operated:9090

6.然后单击保存和测试按钮。URL 是平台创建的 Prometheus 服务的位置。因为 Grafana pod 将使用内部 Kubernetes 网络与 Prometheus pod 通信,所以这个 URL 对于您的设置也将是相同的:

图 10.55 – Prometheus Grafana 数据源的配置

你可以寻找普罗米修斯服务_通过发出以下命令获取详细信息:

kubectl get service –n ml-platform | grep 普罗米修斯

7.将 Grafana 配置为连接到 Prometheus 后,下一步是构建仪表板。如前所述,仪表板是一组可视化,每个可视化都由一个查询支持。Grafana 运行这些查询并为您绘制数据。构建仪表板超出了本书的范围,但我们提供了一个可供您使用的仪表板。从左侧菜单中选择导入选项:

图 10.56 – 在 Grafana 中添加新仪表板

8.上导入屏幕,复制Chapter10/ grafana -dashboard/sample-seldon-dashboard.json文件中的内容并将其粘贴到Import via panel json文本框中。单击加载按钮以导入仪表板:

图 10.57 – 在 Grafana 中导入 Seldon 仪表板

9.设置名称为了您的导入仪表板,然后单击“导入”按钮以完成仪表板的导入过程。您可以根据自己的喜好命名;我们选择了Flight Prediction Analytics的名称,如您在以下屏幕截图中所见:

图 10.58 – 在 Grafana 中导入 Seldon 仪表板

10.导入后仪表板,格拉法纳将立即开始显示仪表板。您可以看到一些指标,例如响应时间、成功率和已部署模型的其他相关指标。您可能需要多次点击您的模型才能开始填充此板。有关如何调用已部署模型的信息,请参阅本章前面的调用模型部分。

图 10.59 – Seldon 模型的仪表板

您可以看到该板捕获了由包装在 Seldon 中的模型发出的指标。随着更多模型的部署,它们将在此仪表板中可用,您可以通过仪表板顶部栏中提供的过滤器过滤模型。

您的航班准点预测服务现已可供使用。您现在将与您组织的产品开发团队和网站团队合作,以便他们可以集成此功能并为您的客户提供更好的服务。你的工作还没有完成这里; 您将需要不断查看模型的性能,并通过新数据和/或进一步优化模型来进行改进。该平台将帮助您以更快的速度执行此周期,并不断改进为您的客户提供的产品。

概括

这是另一个长篇,涵盖了航班准点性能项目的模型开发和部署生命周期。您已经了解了该平台如何使您和您的团队在 EDA、模型试验和跟踪、模型注册和模型部署方面变得自主。

在下一章中,我们将退后一步,总结我们整个平台的历程,以及如何将其用作适合您垂直行业的解决方案。您可以使用这些概念和工具为您的团队构建一个平台,让您的企业实现人工智能的力量。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonhhxg_柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值