如何将 OpenShift 流水线转换为 MLOps 流水线
请注意,本文已更新以解决技术错误,原帖发布于 2025 年 12 月 3 日。
数据科学家和机器学习工程师在将模型从实验阶段迁移到生产阶段时,常常面临诸多挑战。机器学习是一个迭代过程,包括从各种来源收集数据、数据处理、模型训练、超参数调优、模型评估和模型部署。每次更改模型或其依赖项(代码、数据集或配置)时都手动执行这些操作,会导致结果不一致,原因如下:
- 目前还没有持续集成和持续部署系统来自动化这个工作流程。
- 版本控制的局限性使得跟踪模型迭代过程中的变更变得困难。
- 实时监控模型的性能很困难。
- 不同环境下的部署不一致,导致结果难以预测。
鉴于以上原因,MLOps 的需求将持续增长,越来越多的组织也将采用它。MLOps 的快速发展源于组织需要减少 DevOps 团队和机器学习团队之间的摩擦。使用 MLOps 流水线的组织可以通过简化模型部署、监控和扩展来获得竞争优势。构建 MLOps 流水线不必繁琐。借助 KitOps 和 OpenShift 流水线,您可以快速构建机器学习流水线,将 AI 模型投入生产环境。本文将教您如何使用 KitOps 和 OpenShift 轻松构建和部署机器学习模型。
太长不看
- MLOps 流水线通过集成自动化功能来改进您的机器学习工作流程。
- KitOps 使各个团队能够轻松地将模型及其依赖项(例如代码和数据集)解包到不同的目录中。
- OpenShift 流水线和 Quay 让运行 KitOps 打包的 AI 项目变得轻松简单。
使用 OpenShift pipeline 和 KitOps 构建 MLOps 流水线的步骤
前提条件:
要学习本教程,您需要以下物品:
- **A container registry:** You can use [Jozu Hub](https://jozu.ml), [GitHub Package](https://docs.github.com/en/packages/learn-github-packages/introduction-to-github-packages) registry, or [DockerHub](https://hub.docker.com/). This guide will use Jozu Hub.
- A **c****ode hosting platform:** [Create a GitHub account](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github).
- A [HuggingFace](https://huggingface.co/login) account.
- **KitOps:** Here’s a [guide to install](https://kitops.ml/docs/cli/installation.html)[ing](https://kitops.ml/docs/cli/installation.html) [KitOps](https://kitops.ml/docs/cli/installation.html).
- **OpenShift pipeline:** Create a [developer sandbox](https://developers.redhat.com/developer-sandbox) account.
步骤 1:安装 KitOps
首先,您必须确保本地已安装 Kit CLI。安装完成后,运行以下命令验证安装:
kit version
步骤 2:创建 Jozu Hub 存储库
登录您的 Jozu Hub 帐户并创建一个存储库。在这里,您创建一个名为 . 的空存储库qwen-openshift。
要将本地终端验证到 Jozu Hub,请运行以下命令:
kit login jozu.ml
系统会提示您输入用户名和密码。用户名是您创建 Jozu Hub 帐户时使用的电子邮件地址,密码即为用户名和密码。验证成功后,您将从 HuggingFace 下载一个模型。
步骤 3:从 HuggingFace 下载模型
前往HuggingFace 上的Qwen模型页面。您将看到一个文件列表,其中包括模型、LICENSE 文件和 README.md 文件。您可以通过在本地终端运行以下命令来安装所有这些软件包:
curl -L -O https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GGUF/blob/main/LICENSE
curl -L -O https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GGUF/blob/main/README.md
wget https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GGUF/resolve/main/qwen2-0_5b-instruct-q2_k.gguf
这将把软件包安装到当前工作目录中。让我们让目录结构更易于阅读。
目前,您的目录结构应如下所示:
|-- Kitfile
|-- models
|-- qwen2-0_5b-instruct-q2_k.gguf
|-- docs
|-- LICENSE
|-- README.md
创建Kitfile 文件,并将你的软件包整理到两个新文件夹中:models 和 docs。将 Qwen 模型移动到 models 文件夹,将许可证和 Markdown 文档移动到 docs 文件夹。将以下代码复制到你的 Kitfile 文件中:
manifestVersion: 1.0.0
package:
name: qwen2-0.5B
version: 2.0.0
description: The instruction-tuned 0.5B Qwen2 large language model.
authors: [Emmanuel]
model:
name: qwen2-0_5b-instruct-q2_k
path: models/qwen2-0_5b-instruct-q2_k.gguf
description: The model downloaded from hugging face
code:
- path: docs/LICENSE
description: License file.
- path: docs/README.md
description: Readme file.
步骤 4:打包模型套件
接下来,您需要打包模型套件。为此,请运行以下命令:
kit pack . -t jozu.ml/<your-Jozu-username>/<your-Jozu-repository-name>:latest
您在上面的步骤 2 中创建了 Jozu 存储库 - qwen-openshift。
将模型套件标记为最新版本。执行kit pack命令后,您应该会看到类似以下的输出:
步骤 5:推送模型套件
要推送模型套件,请运行以下命令:
kit push jozu.ml/<your-Jozu-username>/<your-Jozu-repository-name>:latest
命令执行完毕后,您应该会看到以下输出:
成功推送至远程仓库后,您可以查看已上传到 Jozu Hub 容器注册表的软件包。
将模型依赖项推送到 Jozu Hub 后,使用 OpenShift Pipelines 部署模型。
步骤 6:创建 OpenShift 流水线
Red Hat OpenShift是一个平台,可简化大规模应用程序的构建、测试和部署。借助 OpenShift Pipelines,您可以获得一个内置于 Kubernetes 的 CI/CD 框架,该框架允许流水线的每个步骤在各自的容器中运行,从而实现更好的可扩展性。
将 Qwen Modelkit 部署到 OpenShift 流水线非常简单,只需几个步骤即可完成。第一步是创建一个开发者沙箱帐户。
创建账户后,请访问您的控制面板,如下图所示。
下一步是创建持久卷声明。创建持久卷声明的目的是为了在创建管道时,能够在各个任务之间共享数据。在左上角,切换到管理员。使用此管理员帐户,您将拥有创建持久卷声明所需的足够权限。
切换到管理员配置文件后,导航到存储部分,然后单击“创建持久卷声明”。
此时,您可以配置持久卷声明并为其指定存储大小。
创建持久卷声明后,切换回位于左上角的“开发者”配置文件。然后,点击“创建管道”开始构建 OpenShift 管道。
您可以通过两种方式创建管道:使用OpenShift Web 控制台上的管道构建器,或使用YAML以编程方式创建。本教程将使用 YAML 视图。
要继续操作,请在管道构建器中打开YAML 视图,并将以下代码粘贴到其中:
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: kit-pipeline
spec:
finally:
- name: login-pack-push-kit
params:
- name: SCRIPT
value: './kit login jozu.ml -u $(params.EMAIL) -p $(params.PASSWORD) && ./kit pack . -t jozu.ml/emmanueloffisongetim/qwen-openshift:latest && ./kit push jozu.ml/emmanueloffisongetim/qwen-openshift:latest'
- name: VERSION
value: latest
taskRef:
kind: ClusterTask
name: openshift-client
workspaces:
- name: manifest-dir
workspace: workspace
- name: kubeconfig-dir
workspace: workspace
params:
- default: <your-password-for-jozu>
name: PASSWORD
type: string
- default: <your-email-address-for-jozu>
name: EMAIL
type: string
tasks:
- name: git-clone
params:
- name: url
value: 'https://github.com/Techtacles/kitops-openshift'
- name: revision
value: master
- name: refspec
value: ''
- name: submodules
value: 'true'
- name: depth
value: '1'
- name: sslVerify
value: 'true'
- name: crtFileName
value: ca-bundle.crt
- name: subdirectory
value: ''
- name: sparseCheckoutDirectories
value: ''
- name: deleteExisting
value: 'true'
- name: httpProxy
value: ''
- name: httpsProxy
value: ''
- name: noProxy
value: ''
- name: verbose
value: 'true'
- name: gitInitImage
value: 'registry.redhat.io/openshift-pipelines/pipelines-git-init-rhel8@sha256:48daa3092248256fd0538e4ecbecf2dfe5aff0373c4eed52601f11a9035f872f'
- name: userHome
value: /home/git
taskRef:
kind: ClusterTask
name: git-clone
workspaces:
- name: output
workspace: workspace
- name: install-kit
params:
- name: SCRIPT
value: 'wget https://github.com/jozu-ai/kitops/releases/latest/download/kitops-linux-x86_64.tar.gz && tar -xzvf kitops-linux-x86_64.tar.gz && ls && ./kit version'
- name: VERSION
value: latest
runAfter:
- git-clone
taskRef:
kind: ClusterTask
name: openshift-client
workspaces:
- name: manifest-dir
workspace: workspace
- name: kubeconfig-dir
workspace: workspace
- name: unpack-kit
params:
- name: SCRIPT
value: 'mkdir models && wget https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GGUF/resolve/main/qwen2-0_5b-instruct-q2_k.gguf && mv qwen2-0_5b-instruct-q2_k.gguf models'
- name: VERSION
value: latest
runAfter:
- install-kit
taskRef:
kind: ClusterTask
name: openshift-client
workspaces:
- name: manifest-dir
workspace: workspace
- name: kubeconfig-dir
workspace: workspace
workspaces:
- name: workspace
在以下代码片段中,请将 `<your_jozu_email_address>` 替换为您的Jozu 邮箱地址,将 `<your_jozu_password>` 替换为您的Jozu 密码。完成这些更改后,点击“创建”按钮生成流程。流程完成后,流程视图应与下图所示一致。
管道创建完成后,下一步是运行它。首先,单击“启动管道”。在“工作区”部分,选择“PersistentVolumeClaim”,然后选择您之前创建的卷。完成后,单击“启动”以运行管道。
管道运行完成后,您将能够查看日志和成功图表,以指示管道的状态。
流水线部署完成后,请导航至您在 Jozu Hub 上创建的仓库。在那里,您将找到流水线部署的新镜像。
部署成功,新部署的镜像已在 Jozu Hub 上验证。
这段代码创建了一个名为qway-openshift-pipeline的 OpenShift 流水线。该流水线执行以下几个任务:安装模型套件、登录 Jozu Hub 代码库、从 HuggingFace 下载模型、打包模型套件并将其推送到 Jozu Hub 注册表。当您访问 OpenShift Web 控制台时,您将看到类似于下图的输出。
您可以手动触发此流水线,也可以使用 Webhook与 GitHub集成。要手动运行流水线,请单击运行命令。执行后,您将看到如下所示的输出:
至此,您已成功构建了机器学习管道。下一节将向您展示如何部署和使用从 Huggingface 导入的聊天机器人。
步骤 7:验证部署
OpenShift 默认会创建两个项目。在开发者门户中,点击“ +添加”。在 Git 仓库下,点击“容器镜像”。为您的部署命名。在本例中,部署名称为llama-cpp。此外,还要指定应用程序运行的端口。
从 Jozu Hub 选择要部署的 Qwen ModelKit,然后单击“创建”。
创建完成后,系统会为您的部署分配一个域。在后台,Kubernetes 部署、Pod、服务账号、自动伸缩组和服务都会自动创建。在 Red Hat OpenShift 控制面板中,导航至“拓扑”视图即可查看代表您部署的拓扑图。
接下来,如果您打开分配的域,您将看到已部署的llama-cpp容器。其中包含一个 Web 用户界面,您可以在其中发送提示并查看响应。
在上图中,Qwen 模型被提示讨论“法国大革命”。只需几个步骤,您就成功构建了一个用于聊天机器人的 MLOps 流水线。
结论
使用合适的工具,构建高效的 MLOps 流水线可以很简单。借助 KitOps 和 OpenShift 流水线,您可以自动化构建和部署 MLOps 应用程序。此外,您还可以轻松地可视化模型并实时查看其性能,这非常实用。
KitOps 在打包模型和管理依赖项方面发挥着关键作用。OpenShift 可帮助您在每次变更时自动部署。这可以实现更快、更可靠的部署,并改善团队协作。
如果您对将 KitOps 集成到您的团队有任何疑问,请加入Discord上的讨论,并立即开始使用 KitOps!
文章来源:https://dev.to/jozu/how-to-turn-your-openshift-pipelines-into-an-mlops-pipeline-56na

















