MLOps 工作流程:使用 Kubeflow 识别数字
手写数字的 MNIST 数据库是深度学习的 Hello-World,因此是不关注 ML 模型本身,而是关注创建 ML 管道的最佳示例。这里的目标是创建一个自动化的 ML 管道,用于获取数据、数据预处理以及创建和服务 ML 模型。您可以在下面看到数字识别器应用程序的概述。
您需要按照以下步骤操作:
- 部署 Kubernetes 集群并安装 Kubeflow
- 访问 Kubeflow 中央仪表板
- 设置 Jupyter 笔记本
- 为对象存储设置 MinIO
- 设置 Kserve
- 使用 Kubeflow Pipelines 创建 ML 管道
- 测试模型推理
使用的组件:
- Kubeflow 1.5.1 - 笔记本、管道、Kserve
- 最小IO
- 库伯内特斯 1.21
- 硬件:思科 UCS 服务器
查看演练视频!
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 获取凭证
- 使用以下命令获取 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
- 为了从 Kubernetes 集群外部访问 MinIO 并检查存储桶,请执行端口转发:
kubectl port-forward -n kubeflow svc/minio-service 9000:9000
- 然后您可以通过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