数据科学家和机器学习工程师在将模型从实验阶段推进到生产阶段时,他们经常会遇到重大挑战。机器学习的过程是迭代的,这包括从各种来源收集数据、数据处理、模型训练、超参数调整、模型评估,以及模型部署。每次手动更改模型或其依赖项(如代码、数据集或配置)时,都会导致结果不一致。因此,
- 没有CI/CD(持续集成和持续部署)系统来自动化这个工作流程。
- 有限的版本控制使得跟踪模型迭代中的更改变得困难。
- 难以实时监测模型的性能。
- 在不同环境中的部署一致性较差,导致结果难以预测。
由于这些原因,对MLOps的需求将持续扩大,组织也将继续采用它。MLOps的快速增长源于组织需要减少DevOps与机器学习团队之间的摩擦和障碍。使用MLOps管线的组织通过简化模型部署、监控和扩展获得竞争优势地位。构建MLOps管线并不像想象中那么繁琐。借助KitOps和OpenShift管道,您可以快速构建ML管道,将您的AI模型快速投入生产。本文将教你如何使用KitOps和OpenShift轻松构建和部署机器学习模型。
TL;DR 或 主要内容- MLOps 管道通过引入自动化来优化您的机器学习工作流程。
- KitOps 让各个团队能轻松地将模型及其依赖(如代码和数据集)解包到不同目录。
- OpenShift 管道和 Quay 可轻松运行 KitOps 打包的 AI 项目。
准备工作
要跟着本教程走,您需要准备以下内容:
- 一个容器仓库: 您可以使用Jozu Hub,GitHub 包注册表,或DockerHub。本指南将使用 Jozu Hub。
- 一个代码托管服务平台: 创建一个 GitHub 账户。
- 一个HuggingFace账户。
- KitOps: 这里有一份安装KitOps的指南。
- OpenShift 管道: 创建一个开发者沙盒账户。
第一步:安装Kit CLI
请确保您已经在本地安装了Kit CLI。运行以下命令可以验证安装:
```kit --version
版本
全屏模式。退出全屏(按 Esc 键)
**步骤 2:创建 JozuHub 仓库**
登录到您的 Jozu Hub 账户并创建一个 [仓库](https://jozu.ml/docs/understanding-jozu-hub/repositories.html)。创建一个名为 `qwen-openshift` 的空仓库。
![创建JozuHub仓库](https://imgapi.imooc.com/67510469099e779208000354.jpg)
要将您的本地终端连接到JozuHub,请运行命令:
在命令行输入 kit login jozu.ml
全屏,退出全屏
这会提示你输入用户名和密码。你的用户名就是用来注册Jozu Hub账户的那个电子邮件地址,密码是你的密码。验证通过后,你就可以从HuggingFace下载相应的模型。
**步骤 3:从 HuggingFace 下载一个模型**
访问 HuggingFace 上的 [Qwen](https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GGUF/tree/main) 模型页面。你会看到一个文件列表,其中包括模型、LICENSE 和 README.md 文件。你可以在本地终端运行相应的命令来安装这些文件:具体来说,你可以运行下面的命令:
使用 curl
命令下载许可证文件:
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
命令下载模型文件:
wget https://huggingface.co/Qwen/Qwen2-0.5B-Instruct-GGUF/resolve/main/qwen2-0_5b-instruct-q2_k.gguf
这里的命令用于从指定网址下载文件。curl
和 wget
是常用的命令行工具,用于从网络获取文件。LICENSE
是许可证文件,README.md
是说明文档,而 .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: 0.5B Qwen2 指令调优大型语言模型。
authors: [Emmanuel]
model:
name: qwen2-0.5b-instruct-q2_k
path: models/qwen2-0.5b-instruct-q2_k.gguf
description: 来自Hugging Face的模型
code:
- path: docs/LICENSE
description: 许可证文件。
- path: docs/README.md
description: 读取说明文件。
进入全屏 退出全屏
**步骤 4:打包你的 ModelKit(ModelKit 保持英文原样)**
接下来你要做的就是打包你的 ModelKit。为此,运行以下命令:
kit pack . -t jozu.ml/<你的Jozu用户名称>/<你的Jozu仓库名>:latest
切换到全屏模式,退出全屏.
> 你在上面的第二步创建了Jozu仓库 - qwen-openshift。
将 ModelKit 标记为最新的版本。执行 **'kit pack'** 命令后,你应该会看到类似如下所示的输出:
![打包ModelKit(模型套件)是什么样的过程呢?](https://imgapi.imooc.com/6751046a09ade41208000112.jpg)
**步骤5:推送您的ModelKit模型**
要运行以下命令来推送,请输入:
例如:
kit push jozu.ml/<你的Jozu用户名称>/<你的Jozu仓库名>:latest
进入全屏/退出全屏
执行完命令后,你应该能看到输出。
![让你的ModelKit火起来](https://imgapi.imooc.com/6751046a09bd0a9908000107.jpg)
当你成功地将代码推送到远程仓库后,你可以在 Jozu Hub 的容器注册库中查看你上传的那些包,并检查它们。
![您的 ModelKit 如下](https://imgapi.imooc.com/6751046b096de68f08000433.jpg)
将你的模型推送到Jozu Hub之后,通过OpenShift Pipelines来部署模型。
**步骤 6:创建 OpenShift 管道**
[RedHat Open](https://www.redhat.com/en/technologies/cloud-computing/openshift)[S](https://www.redhat.com/en/technologies/cloud-computing/openshift)[hift](https://www.redhat.com/en/technologies/cloud-computing/openshift) 是一个使应用程序构建、测试和部署大规模地简化的平台。使用 OpenShift 管道,您将获得一个内置到 Kubernetes 中的 CI/CD 框架,每个步骤都可以在独立的容器中运行,以增强可扩展性。
部署您的 Qwen 模型工具包到 OpenShift 流水线系统非常简单,只需几个步骤。首先,[创建一个开发者沙盒账户](https://developers.redhat.com/developer-sandbox)。
创建账户之后,您可以查看您的仪表盘,如下图所示。
![OpenShift 仪表板](https://imgapi.imooc.com/6751046b099467f208000380.jpg)
要创建一个 OpenShift 构建管道,你可以使用 OpenShift web 控制台中的构建管道构建器,或者使用 YAML 文件。在你的 GitHub 仓库中,创建一个名为 `**.tekton/push.yaml**` 的文件,并在其中添加以下代码:
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: qway-openshift-pipeline
spec:
finally:
- name: 打包推送
params:
- name: SCRIPT
value: cd <YOUR-GIT-REPO> && kit pack -t jozu.ml/<YOUR_JOZU_USERNAME>/<JOZU_REPO>:latest && kit push jozu.ml/<YOUR_JOZU_USERNAME>/<JOZU_REPO>:latest
- name: VERSION
value: '4.7'
taskRef:
kind: Task
name: openshift-client
workspaces:
- name: manifest-dir
workspace: workspace
- name: kubeconfig-dir
workspace: workspace
tasks:
- name: 安装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 && mv kit /usr/local/bin/ && kit version'
- name: VERSION
value: '4.7'
taskRef:
kind: Task
name: openshift-client
workspaces:
- name: manifest-dir
workspace: workspace
- name: kubeconfig-dir
workspace: workspace
- name: 登录到jozu
params:
- name: SCRIPT
value: kit login jozu.ml -u <JOZU_USERNAME> -p <JOZU_PASSWORD>
- name: VERSION
value: '4.7'
runAfter:
- 安装kit
taskRef:
kind: Task
name: openshift-client
workspaces:
- name: manifest-dir
workspace: workspace
- name: kubeconfig-dir
workspace: workspace
- name: 移动模型到文件夹
params:
- name: SCRIPT
value: '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: '4.7'
runAfter:
- 登录到jozu
taskRef:
kind: Task
name: openshift-client
workspaces:
- name: manifest-dir
workspace: workspace
- name: kubeconfig-dir
workspace: workspace
- name: 克隆git仓库
params:
- name: url
value: '<YOUR-GIT-REPO>'
- name: revision
value: <YOUR-GIT-BRANCH>
- 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: 'gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.40.2'
- name: userHome
value: /home/git
taskRef:
kind: Task
name: git-clone
workspaces:
- name: output
workspace: workspace
workspaces:
- name: workspace
全屏,退出全屏
此代码创建了一个名为 **qway-openshift-pipeline** 的 OpenShift 管道。该管道执行一系列任务:安装 Kit,登录 JozuHub 仓库,从 HuggingFace 下载模型文件,打包 ModelKit 包,并推送到 JozuHub 注册表中。当你导航到 OpenShift web 控制台时,你会在 OpenShift web 控制台中看到类似下方的输出。
![创建OpenShift流水线](https://imgapi.imooc.com/6751046c097982e708000272.jpg)
您可以手动触发此管道,或通过与 GitHub 集成使用 webhooks。要手动运行管道,请点击 **运行** 按钮。执行后,您将看到如下输出:
![运行 OpenShift 管道流程](https://imgapi.imooc.com/6751046c0973943108000268.jpg)
此时,你已经成功地构建了你的机器学习流水线。在下一节中,我们将展示如何部署并和你从Huggingface导入的聊天机器人模型进行互动。
**步骤7:验证您的部署是否成功**
默认情况下,OpenShift 会为您创建两个项目。您可以在这里查看它们。在开发者门户中,点击 **+添加。** 在 Git 仓库部分,选择容器镜像。为您的部署命名。例如,我们为部署命名了 **llama-cpp。** 并指定一个端口供应用程序运行。
![创建 OpenShift 部署任务](https://imgapi.imooc.com/6751046d098d103408000498.jpg)
在Jozu Hub中选择您想要部署的Qwen ModelKit,然后点击**创建**。
![点击这里部署Qwen模型试试](https://imgapi.imooc.com/6751046d091f99db08000510.jpg)
创建后,该域名资源将分配给您的部署。在后台,会为您创建 **Kubernetes 部署、Pod、服务账户、自动伸缩组** 和 **服务**。在 RedHat OpenShift 控制台中,切换到 **拓扑** 视图以查看您的部署的图表。
![部署的示意图](https://imgapi.imooc.com/6751046e09fd1d1108000547.jpg)
接下来,如果你访问分配的域名,你会看到部署的 **llama-cpp** 容器实例。其中包含一个 web UI,你可以通过它发送提示并查看响应。
如图所示
![结果](https://imgapi.imooc.com/6751046f0904bb4208000836.jpg)
在上面的图片中,Qwen模型被提示讨论“大革命”。只需几个简单的步骤,你就成功地为聊天机器人搭建了一个MLOps流水线。
## 总结一下
使用合适的工具构建有效的MLOps管道可以很简单。借助KitOps和OpenShift管道,您可以自动构建和部署您的MLOps应用程序。这也非常有用,因为您可以轻松观察到您的模型,并实时观察它们的表现。
KitOps 在打包模型和管理依赖方面起着关键作用。OpenShift 可帮助您在每次更改后自动部署,从而实现更快捷、更可靠的部署并促进团队协作。
如果你有关于将KitOps与团队整合的问题,请加入[Discord](https://discord.com/invite/Tapeh8agYy)参与讨论,并现在就从[开始](https://kitops.ml/docs/quick-start.html)使用KitOps之旅吧!