阅读我们的文章

.

MLflow 是机器学习实验跟踪、模型版本管理和服务的常用工具。在 “大规模服务 ML 模型 ”系列的第一篇文章中,我们介绍了如何在 Kubernetes 上部署跟踪实例,并用它来记录实验和存储模型。.

第 1 部分 - 如何在 Kubernetes 上部署 Mlflow 跟踪实例?

导言

Mlflow 是 data 科学/ML 社区广泛使用的工具,用于在不同阶段跟踪实验和管理机器学习模型。利用它,我们可以存储指标、模型和工件,从而轻松比较模型的性能并处理其生命周期。此外,Mlflow 还提供了一个模块,可将模型作为 API 端点提供,从而方便将其集成到任何产品或网络应用程序中。.

也就是说,在在线产品中使用机器学习很酷,但根据模型的大小、性质(ML、深度学习......)和负载(用户请求),对所需资源进行维度调整并保证合理的响应时间可能具有挑战性。因此,使用 Kubernetes 集群等可扩展基础设施是在推理阶段保持服务可用性和性能的关键。.

为此,我们将发表三篇系列文章,回答以下问题:

  • 如何在 Kubernetes 上部署和使用 Mlflow 跟踪实例?
  • 如何使用 Mlflow 将机器学习模型作为 API 提供?
  • 如何处理大量请求,并使我们的推理任务可以扩展到工业化产品?

因此,让我们从第一篇文章开始,介绍 Kubernetes 及其组件,并通过日志模型部署跟踪实例。.

Kubernetes 概述

Kubernetes 是谷歌在 2014 年发布的一个开源项目。它是一个容器控制和编排系统,可实现应用程序的自动部署、扩展和调度。其架构如下:

Image

主人:它处理输入配置,调度不同节点上的容器化应用程序,并监控它们的状态。主节点由以下部分组成

  • 应用程序接口服务器: 允许与群集交互,并验证开发人员发送的更新群集或应用程序状态的命令。.
  • 调度员决定 应在哪些节点上运行新对象,以确保稳定性和负载平衡。.
  • 等等: 存储不同资源配置和状态的键值 database
  • 主计长经理:监控集群状态和不同资源,确保当前状态与所需状态一致。.

节点: 它们是已部署容器所在的执行节点。它们的主要组成部分是

  • 花苞 是 Kubernetes 中最基本的执行单元。Pod 将应用程序封装为单个容器或多个容器,这些容器通过共享存储卷和网络协同工作。.
  • Kubelet: 一个 代理,用于检查容器状态并与 Kubernetes 主站通信。.

当应用程序有多个服务相互通信时,它是首选,因为它能确保每个服务都有自己的容器化环境,并有一套与其他服务交互的规则。此外,它还提供了一种有趣的功能,即可以扩展应用程序,而不必担心管理或同步新服务以及平衡不同机器之间的资源。.

从高层次的角度来看,作为 data 科学家或 ML 工程师,我们将通过 Kubernetes 的服务器 API,使用 CLI 命令或 YAML 配置文件与 Kubernetes 进行交互,以部署和公开应用程序或获取资源状态。.

实践前要求

在本次实践中,我们将使用 GCP 作为 cloud 提供商。首先,我们需要.NET Framework:

1.创建基础设施要素

  • mlflow_gke: 存储文件的桶,datasets...
  • mlflow-k8s部署跟踪模块和机器学习模型:部署一个三节点(e2-highcpu-4)GKE 集群。.

  • 负载测试: 一个三节点(e2-标准-2)GKE 集群来执行负载测试。它将在本系列的第三篇文章中使用。.

Image

2.配置本地工作站

  • 安装与 GCP 和 mlflow cli 交互所需的 python

    pip install mlflow gcsfs google-cloud google-cloud-storage kubernetes
  • 有 gcloud 和 kubectl 配置了访问 GCP 项目和群集的凭证
  • 已安装并初始化 Helm CLI。请 在此找到说明 以防您还没有客户端。.

3.克隆实践项目仓库以获取代码

Mlflow 跟踪实例部署

1.设置群集环境

  • 创建服务账户,以便与 GCS 交互
    可以通过 google cloud 控制台的 我的部门. .我们需要创建一个具有存储对象管理权限的服务账户,生成一个身份验证密钥,并将其下载为 keyfile.json 文件。
  • 将验证文件挂载为密文
    秘密允许我们以安全的方式处理凭证,使其只对相关资源可见。. 为此,我们将创建一个秘密卷,并只向需要的容器公开身份验证文件。.
    kubectl create secret generic gcsfs-creds -from-file=./keyfile.json
Image

2.跟踪服务器部署情况

  • Postgres 存储
    Postgre 是 mlflow 的后端存储单元,用于保存模型 metadata 和指标。.
    要部署它,我们将使用 Helm:Kubernetes 的资源管理器,其中许多应用程序都以图表或模板的格式提供,可以通过简单的命令进行配置。.

    #docs: https://artifacthub.io/packages/helm/bitnami/postgresqlhelm repo add bitnami https://charts.bitnami.com/bitnamihelm install mlf-db bitnami/postgresql --set postgresqlDatabase=mlflow_db --set postgresqlPassword=mlflow --set service.type=NodePort
  • 跟踪实例
    我们还将使用 Helm 图表来部署跟踪服务器,但首先,我们需要用我们想要的版本构建一个 docker 镜像,以便 Helm 能够下载和部署它。请注意,Postgres 的镜像已经在公共存储库中,但在这里我们将创建自己的镜像。.

    cd mlflow-serving-exampledocker build --tag $/mlflow-tracking-server:v1 --file dockerfile_mlflow_tracking .docker push $/mlflow-tracking-server:v1

将镜像推送到镜像注册表后,我们就可以使用以下命令通过 helm 将其部署到群集上。.

helm repo 添加 mlflow-tracking https://artefactory-global.github.io/mlflow-tracking-server/helm install mlf-ts mlflow-tracking/mlflow-tracking-server
--set env.mlflowArtifactPath=$
--set env.mlflowDBAddr=mlf-db-postgresql
--设置 env.mlflowUser=postgres
--设置 env.mlflowPass=mlflow
--设置 env.mlflowDBName=mlflow_db
--set env.mlflowDBPort=5432
--设置 service.type=LoadBalancer
--设置 image.repository=$/mlflow-tracking-server
--set image.tag=v1

现在,Mlflow 应已启动并运行,用户界面应可通过负载平衡器 IP 访问。我们可以使用 kubectl get services.A此外,我们还可以通过访问日志来调试部署 经由 kubectl describe pods.
到目前为止,我们目前的架构如下:

Image

请注意,互联网上的任何人都可以访问负载平衡器,因此必须考虑通过添加验证层来保护我们的跟踪实例。这可以通过 身份识别代理 但本文不涉及。.

3.创建基本模型

现在,我们的基础架构和 Mlflow 实例已经准备就绪,我们可以尝试运行一个简单的 ML 模型,并将其保存在模型注册表中,以供以后使用。.
我们将使用葡萄酒质量 dataset,它由约 4900 个样本和 11 个反映葡萄酒特征的特征组成。标签范围从 3 到 9,可视为评级。.
这是一个经典示例,我们在其中训练了一个 Xgboost 回归模型,并将其与参数和指标一起存储。完整代码如下 笔记本.
您可能已经注意到,Mlflow 的集成非常简单,可以用下面的代码片段来概括,即调用 mlflow.start_run()、mlflow.log_param()、mlflow.log_metric() 和 mlflow.xgboost.log_model()分别用于创建新实验、存储训练参数、评估指标和训练模型本身。.

使用 mlflow.start_run() 作为运行: # 启动 mlflow 会话 mlflow.log_param("max_depth", max_depth) mlflow.log_param("min_child_weight", min_child_weight) mlflow.log_param("estimators", estimators) # 创建并拟合模型 model = xgb.XGBRegressor( max_depth=max_depth、 min_child_weight=min_child_weight、 n_estimators=estimators random_state=42) model.fit(X_train, y_train) # MLflow 指标 predictions = model.predict(X_test) rmse = np.sqrt(mean_squared_error(y_test, predictions)) mlflow.log_metric("rmse", rmse) # 对数模型 mlflow.xgboost.log_model(model, "xgboost-model", registered_model_name = model_name)

运行所提供的笔记本后,跟踪实例界面中将新增一行,与新实验相对应。.

Image

最后,如果我们对模型的性能感到满意,就可以从跟踪实例中加载模型,并在 python 中使用它进行推理。这也可以通过之前共享的笔记本来实现。请注意,在本例中,我们使用运行 ID 加载了模型,但请记住,Mlflow 还提供了其他有趣的方法,可以通过标签、版本或阶段来识别模型。更多详情请参考模型注册文档 这里.

结论

在这篇文章中,我们设法部署了 Mlflow 跟踪实例来处理我们的 data 科学实验,并通过一个快速示例演示了如何记录模型并将其保存起来,以便将来在 python 上进行推理。在本系列的下一篇文章中,我们将学习如何将此模型作为 API 提供。这一点非常重要,因为它有助于与模型进行交互并将其集成到产品或应用程序中。此外,在 Kubernetes 上运行可确保模型易于扩展,并能处理不同的负载水平。.

中号 Blog by Artefact。.

本文最初发表于 Medium.com.
在我们的 Medium Blog 上关注我们!