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