MLOps 工作流程:使用 Kubeflow 识别数字

发布时间 2023-10-12 12:07:28作者: 戴维德善业福

 

手写数字的 MNIST 数据库深度学习的 Hello-World,因此是不关注 ML 模型本身,而是关注创建 ML 管道的最佳示例。这里的目标是创建一个自动化的 ML 管道,用于获取数据、数据预处理以及创建和服务 ML 模型。您可以在下面看到数字识别器应用程序的概述。

您需要按照以下步骤操作

  1. 部署 Kubernetes 集群并安装 Kubeflow
  2. 访问 Kubeflow 中央仪表板
  3. 设置 Jupyter 笔记本
  4. 为对象存储设置 MinIO
  5. 设置 Kserve
  6. 使用 Kubeflow Pipelines 创建 ML 管道
  7. 测试模型推理

使用的组件

  • Kubeflow 1.5.1 - 笔记本、管道、Kserve
  • 最小IO
  • 库伯内特斯 1.21
  • 硬件:思科 UCS 服务器

YouTube 查看演练视频

1.部署Kubernetes集群并安装Kubeflow

在 Kubernetes 集群上安装 Kubeflow。您可以在Kubeflow 文档中找到更多信息

您可以使用 kubectl 检查所有 pod 是否都成功启动:

flpachin@FLPACHIN-M-MY32 ~ % kubectl get pods --all-namespaces
NAMESPACE                   NAME                                                              READY   STATUS      RESTARTS   AGE
auth                        dex-5ddf47d88d-cksfj                                              1/1     Running     1          3h7m
cert-manager                cert-manager-7b8c77d4bd-m4zht                                     1/1     Running     0          3h7m
cert-manager                cert-manager-cainjector-7c744f57b5-nzfb4                          1/1     Running     0          3h7m
cert-manager                cert-manager-webhook-fcd445bc4-7fkj4                              1/1     Running     0          3h7m
istio-system                authservice-0                                                     1/1     Running     0          3h7m
istio-system                cluster-local-gateway-64f58f66cb-ncnkd                            1/1     Running     0          3h7m
istio-system                istio-ingressgateway-8577c57fb6-c8t9p                             1/1     Running     0          3h7m
istio-system                istiod-6c86784695-bvgqs                                           1/1     Running     0          3h7m
knative-eventing            eventing-controller-79895f9c56-2zpmv                              1/1     Running     0          3h7m
knative-eventing            eventing-webhook-78f897666-n5m5q                                  1/1     Running     0          3h7m
knative-eventing            imc-controller-688df5bdb4-66gvz                                   1/1     Running     0          3h7m
knative-eventing            imc-dispatcher-646978d797-2z2b2                                   1/1     Running     0          3h7m
knative-eventing            mt-broker-controller-67c977497-mgtmc                              1/1     Running     0          3h7m
knative-eventing            mt-broker-filter-66d4d77c8b-gjrhc                                 1/1     Running     0          3h7m
knative-eventing            mt-broker-ingress-5c8dc4b5d7-tgh6l                                1/1     Running     0          3h7m
knative-serving             activator-7476cc56d4-lwtqq                                        2/2     Running     2          3h7m
knative-serving             autoscaler-5c648f7465-wzmzl                                       2/2     Running     0          3h7m
knative-serving             controller-57c545cbfb-nnjcm                                       2/2     Running     0          3h6m
knative-serving             istio-webhook-578b6b7654-s445x                                    2/2     Running     0          3h7m
knative-serving             networking-istio-6b88f745c-887mz                                  2/2     Running     0          3h7m
knative-serving             webhook-6fffdc4d78-ml2mn                                          2/2     Running     0          3h7m
kserve                      kserve-controller-manager-0                                       2/2     Running     0          3h7m
kubeflow-user-example-com   ml-pipeline-ui-artifact-d57bd98d7-s84t4                           2/2     Running     0          174m
kubeflow-user-example-com   ml-pipeline-visualizationserver-65f5bfb4bf-bmtg8                  2/2     Running     0          174m
kubeflow                    admission-webhook-deployment-7df7558c67-d7mfm                     1/1     Running     0          3h7m
kubeflow                    cache-deployer-deployment-6f4bcc969-zh9vx                         2/2     Running     1          3h7m
kubeflow                    cache-server-575d97c95-jc4nw                                      2/2     Running     0          3h7m
kubeflow                    centraldashboard-79f489b55-cr7hn                                  2/2     Running     0          3h7m
kubeflow                    jupyter-web-app-deployment-5886974887-m96wv                       1/1     Running     0          3h7m
kubeflow                    katib-controller-58ddb4b856-9zjtj                                 1/1     Running     0          3h7m
kubeflow                    katib-db-manager-d77c6757f-jt9b6                                  1/1     Running     4          3h7m
kubeflow                    katib-mysql-7894994f88-zzwrz                                      1/1     Running     0          3h7m
kubeflow                    katib-ui-f787b9d88-cwg9l                                          1/1     Running     0          3h7m
kubeflow                    kfserving-controller-manager-0                                    2/2     Running     0          3h6m
kubeflow                    kfserving-models-web-app-7884f597cf-8vg4b                         2/2     Running     0          3h7m
kubeflow                    kserve-models-web-app-5c64c8d8bb-sqtzs                            2/2     Running     0          3h7m
kubeflow                    kubeflow-pipelines-profile-controller-84bcbdb899-rddgd            1/1     Running     0          3h7m
kubeflow                    metacontroller-0                                                  1/1     Running     0          3h6m
kubeflow                    metadata-envoy-deployment-7b847ff6c5-cqvkw                        1/1     Running     0          3h7m
kubeflow                    metadata-grpc-deployment-f8d68f687-kqlgq                          2/2     Running     4          3h7m
kubeflow                    metadata-writer-78fc7d5bb8-t5xp7                                  2/2     Running     0          3h7m
kubeflow                    minio-5b65df66c9-sx8kb                                            2/2     Running     0          3h7m
kubeflow                    ml-pipeline-7bb5966955-87jbv                                      2/2     Running     6          3h7m
kubeflow                    ml-pipeline-persistenceagent-87b6888c4-n9tgd                      2/2     Running     0          3h7m
kubeflow                    ml-pipeline-scheduledworkflow-665847bb9-2mpz6                     2/2     Running     0          3h7m
kubeflow                    ml-pipeline-ui-554ffbd6cd-8sswm                                   2/2     Running     0          3h7m
kubeflow                    ml-pipeline-viewer-crd-68777557fb-k65lr                           2/2     Running     1          3h7m
kubeflow                    ml-pipeline-visualizationserver-66c54744c-cp2np                   2/2     Running     0          3h7m
kubeflow                    mysql-f7b9b7dd4-56gjd                                             2/2     Running     0          3h7m
kubeflow                    notebook-controller-deployment-7474fbff66-26fzm                   2/2     Running     1          3h7m
kubeflow                    profiles-deployment-5cc86bc965-vjfv6                              3/3     Running     1          3h7m
kubeflow                    tensorboard-controller-controller-manager-5cbddb7fb5-cglzr        3/3     Running     1          3h7m
kubeflow                    tensorboards-web-app-deployment-7c5db448d7-84pjw                  1/1     Running     0          3h7m
kubeflow                    training-operator-6bfc7b8d86-l59l8                                1/1     Running     0          3h7m
kubeflow                    volumes-web-app-deployment-87484c848-rl4rl                        1/1     Running     0          3h7m
kubeflow                    workflow-controller-5cb67bb9db-7bfqc                              2/2     Running     2          3h7m
 

2. 访问 Kubeflow 中央仪表板

部署完所有内容后,您可以使用以下命令进行端口转发:

kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80
 

并通过http://localhost:8080远程访问 Kubeflow Central Dashboard 

3. 设置 Jupyter 笔记本

允许从 Jupyter Notebook 访问 Kubeflow Pipelines

在此演示中,您将通过 Jupyter Notebook 中的 Python SDK 访问 Kubeflow Pipeline。因此,需要一项附加设置来实现这一点。

首先在此 Kubernetes 清单中插入您的 Kubeflow 用户名(您的 Kubeflow 用户名也是 Kubernetes 命名空间的名称,所有特定于用户的容器都将在其中启动): kubeflow_config/ access_kfp_from_jupyter_notebook.yaml您可以在“管理贡献者”菜单下提取命名空间名称

完成后,使用以下命令应用它:

kubectl apply -f access_kfp_from_jupyter_notebook.yaml
 

启动新的笔记本实例

现在,您需要启动一个新的 Jupyter 笔记本实例。对于容器映像,选择jupyter-tensorflow-full:v1.5.0这可能需要几分钟的时间,具体取决于您的下载速度。

不要忘记启用此配置:

访问 Jupyter Notebooks 并从 Github 克隆代码

转到Notebooks并单击CONNECT以启动 Jupyter Notebook 容器。

通过 Juypter Lab,您可以在 Web 浏览器中访问终端和 Python 笔记本。您和数据科学团队可以在这里协作探索该数据集并创建您的 Kubeflow Pipeline。

首先,让我们克隆这个存储库,以便您可以访问代码。您可以使用终端或直接在浏览器中执行此操作。

git clone https://github.com/flopach/digits-recognizer-kubeflow-intersight
 

然后打开digits_recognizer_notebook.ipynb以了解数据集及其格式。

更新 Python 包

启动后,仔细检查 Jupyter Notebook 容器中是否安装了最新版本的 Kubeflow python 软件包:

pip list应该列出高于这些的版本::

kfp                      1.8.12
kfp-pipeline-spec        0.1.13
kfp-server-api           1.8.2
kserve                   0.8.0
 

代理修复背后(可选)

如果您使用代理,请将kubeflow_configs/proxy-fix-notebooks.yaml修复应用到您的 kubernetes 集群。

4. 为对象存储设置 MinIO

为了提供单一事实来源,使所有工作数据(训练和测试数据、保存的 ML 模型等)可供所有组件使用,建议使用对象存储。对于我们的应用程序,我们将设置MinIO

由于 Kubeflow 已经设置了 MinIO 租户,因此我们将利用mlpipeline 存储桶但您也可以部署自己的 MinIO 租户。

从 Kubeflow 的集成 MinIO 获取凭证

  1. 使用以下命令获取 MinIO 的 accesskey 和 Secretkey:
kubectl get secret mlpipeline-minio-artifact -n kubeflow -o jsonpath="{.data.accesskey}" | base64 --decode
 
kubectl get secret mlpipeline-minio-artifact -n kubeflow -o jsonpath="{.data.secretkey}" | base64 --decode
 
  1. 为了从 Kubernetes 集群外部访问 MinIO 并检查存储桶,请执行端口转发:
kubectl port-forward -n kubeflow svc/minio-service 9000:9000
 
  1. 然后您可以通过http://localhost:9000访问 MinIO 仪表板并检查存储桶名称或创建您自己的存储桶。或者,您可以使用MinIO CLI 客户端

默认值应该是(已经在代码中,您无需执行任何操作):

  • 快捷键:minio
  • 密钥:minio123
  • 存储桶:mlpipeline

5. 设置 Kserve

在此步骤中,我们将设置 Kserve 来进行模型推理服务。当我们执行下一步将发生的 ML 管道时,将创建 Kserve 容器。

为 kserve 设置 minIO 秘密

我们需要应用这个 yaml 文件,以便 Kserve 可以访问保存在 minIO 上的创建的模型。Kserve 会将保存的模型复制到新创建的推理容器中。

kubectl apply -f kubeflow_configs/set-minio-kserve-secret.yaml
 

故障排除:无法获取 docker 镜像

如果 kserve 在容器启动时无法获取 docker 镜像,则需要编辑配置:

kubectl -n knative-serving edit configmap config-deployment

直接在数据下方添加键值注册表SkippingTagResolving并应用:

apiVersion: v1
data:
registriesSkippingTagResolving: "index.docker.io"
  _example: |
    ################################
    #                              #
    #    EXAMPLE CONFIGURATION     #
    #                              #
    ################################
...
 

查找更多故障排除信息:https ://kserve.github.io/website/developer/debug/

6. 使用 Kubeflow Pipelines 创建 ML 管道

Kubeflow Pipelines (KFP) 是 Kubeflow 最常用的组件。它允许您为 ML 项目中的每个步骤或功能创建一个可重用的容器化管道组件,该组件可以作为 ML 管道链接在一起。

对于数字识别器应用程序,管道已使用 Python SDK 创建。你可以在文件中找到代码digits_recognizer_pipeline.ipynb

以下是 Kubeflow Pipelines 的更详细示例: https://github.com/StatCan/aaw-contrib-jupyter-notebooks/blob/master/kfp-basics/demo_kfp_lightweight_components.ipynb

7. 测试模型推理

现在您可以测试模型推理。最简单的方法是直接在 Jupyter Notebook 中使用 Python 脚本:

或者,您可以使用可在web_app文件夹中找到的 Web 应用程序。请注意,如果您想从集群外部访问推理服务,则需要完成一些配置。

 

 

 

引用:   https://github.com/flopach/digits-recognizer-kubeflow#mlops-workflow-recognizing-digits-with-kubeflow