详细讲解用Jenkins构建和部署AI项目的CI/CD流程。对需要自动化部署AI系统的DevOps工程师有直接实用价值。
注意,本文自首次发表时间(2024年11月20日)后已更新。
想象一下,你构建了"完美的机器学习模型",却要面临繁琐且易出错的流程:手动打包代码、将容器镜像推送到注册表、每次更改后重启服务器。没有持续集成/持续部署(CI/CD),这就是开发者和机器学习工程师的日常工作。
CI/CD 是一种 DevOps 概念,通过自动化构建、测试和部署模型,为开发者和机器学习工程师减轻手工劳动的负担。通过自动构建、测试和版本化你的模型及其依赖项——数据集、代码和配置——CI/CD 使大团队能够无缝协作和部署,最大限度地降低错误或冲突的风险。
Jenkins 是一个开源 CI/CD 平台,可促进 AI 项目的构建、测试和部署。它还拥有一个用户界面,可以直观地跟踪流水线的运行。本文将介绍如何通过 Jenkins 流水线自动部署你的 AI 项目。
- KitOps 使团队能够轻松将模型、代码和数据集等工件组件解包到不同的目录。
- Jenkins 让你通过可视化界面跟踪流水线运行并监控你的 AI 流水线。
- Jenkins 和 KitOps 简化了构建和部署 AI 项目的过程。
要跟进本教程,你需要以下内容:
代码托管平台:创建一个 GitHub 账户。如果你还没有,可以按照此指南创建一个。在 GitHub 上创建一个仓库。该仓库稍后将与 Jenkins 集成。
KitOps:这是 KitOps 的安装指南。
Linux 环境:本教程是为 Linux 环境设计的,可以通过创建虚拟机或使用 Amazon Linux AMI 启动 Amazon EC2 实例来完成。如果你更喜欢使用不同的操作系统,你需要相应地调整 Jenkinsfile 中的命令。
Jenkins:按照步骤在你的本地机器、虚拟机或你选择的操作系统上安装 Jenkins。
容器注册表:你可以使用 Jozu Hub、GitHub Package registry 或 DockerHub。本指南将使用 Jozu Hub。
安装后,在你的本地终端运行以下命令来验证 KitOps 已安装:
kit version
登录你的 Jozu Hub 账户并创建一个仓库。这里,我创建了一个名为 jenkins_repo 的空仓库。
你可以通过运行以下命令使用你的本地终端与 JozuHub 进行身份验证:
kit login jozu.ml
这会提示输入你的用户名,即创建 Jozu Hub 账户时使用的电子邮件地址和密码。
登录到 Jozu Hub 后,你可以从其包注册表中获取任何可用的 ModelKit。首先,从 Jozu Hub 解包 Qwen 模型。
在你的本地终端上,运行以下命令:
kit unpack jozu.ml/jozu/qwen2-0.5b:0.5b-instruct-q2_K
解包一个 ModelKit 后,你将看到一些文件:Kitfile、Qwen 模型、许可证和 markdown 文档。
目前,目录结构如下所示:
|-- Kitfile
|-- qwen2-0_5b-instruct-q2_k.gguf
|-- README.md
|-- LICENSE
解包 ModelKit 后创建的 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: [Alibaba Cloud]
model:
name: qwen2-0_5b-instruct-q2_k
path: qwen2-0_5b-instruct-q2_k.gguf
license: Apache 2.0
description: 0.5B-instruct-q2_k.
code:
- path: LICENSE
description: License file.
- path: README.md
description: Readme file.
创建一些新文件夹,如 models 和 docs,并将目录结构修改为:
|-- Kitfile
|-- models
|-- qwen2-0_5b-instruct-q2_k.gguf
|-- docs
|-- LICENSE
|-- README.md
修改 Kitfile 以反映修改后的目录结构。在这个修改的 Kitfile 中,模型路径改为 models/qwen2-0_5b-instruct-q2_k.gguf。LICENSE 和 README.md 的路径也分别改为 docs/LICENSE 和 docs/README.md。
manifestVersion: 1.0.0
package:
name: qwen2-0.5B
version: 2.0.0
description: The instruction-tuned 0.5B Qwen2 large language model.
authors: [Alibaba Cloud]
model:
name: qwen2-0_5b-instruct-q2_k
path: models/qwen2-0_5b-instruct-q2_k.gguf
license: Apache 2.0
description: 0.5B-instruct-q2_k.
code:
- path: docs/LICENSE
description: License file.
- path: docs/README.md
description: Readme file.
现在你的 Kitfile、模型和依赖项已准备好,让我们使用 Jenkins 构建 CI/CD 流水线。在继续之前,请验证 Jenkins 的安装。
安装 Jenkins 后,通过访问 http://localhost:8080 来验证你的本地安装。你将看到一个与下图所示的页面类似的页面。根据你的操作系统,你将看到管理员密码的路径。
输入管理员密码后,你将被提示创建一个管理员用户。创建该用户后,你应该会看到 Jenkins 主屏幕。
你可以创建 Jenkins 凭证来安全地输入你的 Jozu Hub 用户名和密码。导航到 Manage Jenkins → Credentials → Global credentials 并创建两个凭证。第一个凭证的类型为 Secret text,包含 Jozu Hub 用户名。
类似地,为你的 Jozu Hub 密码创建另一个凭证,如下图所示。
创建凭证后,构建你的流水线。
在你的 GitHub 仓库设置中,添加一个 webhook 来连接 Jenkins。将 Payload URL 设置为 JENKINS_URL/github-webhook/,用你的 Jenkins 服务器的 URL 替换 JENKINS_URL。然后选择 Just the push event 仅在代码被推送时触发通知,并保存配置。
现在你的 webhook 已创建,每当你推送到 GitHub 时,它都会搜索 Jenkinsfile 然后运行你的 Jenkins 流水线。如果你现在进行推送,它将抛出一个错误。该错误是由于配置查找 jenkinsfile 来运行代码,但该文件不存在。
在你的根目录中创建一个名为 Jenkinsfile 的文件。该文件包含登录到 Jozu Hub、打包 ModelKit 和将 ModelKit 推送到远程仓库的步骤。
在你的 Jenkinsfile 中写入以下代码:
pipeline {
agent any
environment {
USERNAME = credentials('USERNAME')
PASSWORD = credentials('PASSWORD')
}
stages {
stage('install kitops') {
steps {
cleanWs()
git(url: 'https://github.com/Techtacles/kitops-jenkins.git', branch: 'master')
sh 'wget https://github.com/jozu-ai/kitops/releases/latest/download/kitops-linux-x86_64.tar.gz'
sh 'tar -xzvf kitops-linux-x86_64.tar.gz'
sh './kit version'
}
}
stage('Login to JozuHub'){
steps {
sh './kit login jozu.ml -u $USERNAME -p $PASSWORD'
echo 'Successfully logged in to jozuhub'
}
}
stage('Tagging and pushing to remote repository'){
steps{
sh './kit unpack jozu.ml/jozu/qwen2-0.5b:0.5b-instruct-q2_K --model -d models/qwen2-0_5b-instruct-q2_k.gguf'
sh './kit pack . -t jozu.ml/<your-jozu-username>/<your-jozu-repo>:latest'
sh './kit push jozu.ml/<your-jozu-username>/<your-jozu-repo>:latest'
}
}
}
}
上面的代码片段概述了一个具有三个阶段的 Jenkinsfile;第一个阶段安装最新版本的 Kitops,第二个阶段使用之前配置的用户名和密码凭证登录到 JozuHub,最后一个阶段标记 Modelkit 并将其推送到 JozuHub。根据你的操作系统,安装 Kitops 的命令可能会有所不同。按照相应操作系统的步骤安装 Kitops。
一旦你将代码推送到 GitHub,Jenkins 流水线就会启动。
此脚本登录到你的 Jozu Hub,将模型解包到 models/ 目录,打包 ModelKit,然后将其推送到远程仓库。
在 Jenkins UI 上,转到 New Item 并创建一个流水线。下面的屏幕截图中创建的流水线命名为 kitops_pipeline。
创建后,配置你的流水线并选择你的 GitHub 项目。在项目 url 中,添加你在 GitHub 上创建的仓库的链接。
选择 GitHub hook trigger 作为构建触发器。
在流水线定义下,配置你的 Jenkins 流水线以从 GitHub 仓库获取 Jenkinsfile。指定你的仓库 URL、你当前工作的分支和你的 Jenkinsfile 的名称作为脚本路径。
流水线完成后,导航到 Jozu Hub 并检查你创建的仓库。你会注意到一个新的 ModelKit 已被推送到它。
每次进行更改时手动部署 AI 项目是非常令人沮丧的。使用 Jenkins 和 KitOps,你可以自动化模型及其依赖项在生产环境中的构建、测试和部署。
KitOps 在打包模型和管理依赖项中起着关键作用。Jenkins 帮助你在进行更改时自动化部署,从而实现更快、更可靠的部署和改善团队协作。
如果你有关于将 KitOps 与团队集成的问题,请加入 Discord 上的对话并立即开始使用 KitOps!
关于进一步的操作,你可能需要考虑屏蔽此人和/或举报滥用行为。