根据行业分析师的说法,超过85%的机器学习模型最终无法进入实际应用。原因很简单,就是数据科学家、机器学习工程师和DevOps工程师之间的沟通障碍。将一个机器学习模型从概念变为实际应用需要一个稳健、可扩展且高效的流程。
典型的机器学习生命周期包括从各种数据源提取原始数据,进行数据预处理工作、模型训练、超参数调优、模型评估以及模型部署的迭代流程。大多数机器学习项目通常在模型部署阶段结束,这通常会导致一些问题。
- 由于数据和模型漂移,机器学习模型产生了适得其反的效果。
- 没有持续集成和自动部署的管道。
- 没有模型监控来观察你训练的模型在实际应用环境中的表现。
为了解决这个问题,我们使用了包含版本控制、CI/CD(持续集成和持续交付)、模型监控和集成测试等的MLOps流水线。这篇文章会展示如何利用Dagger.io和KitOps来创建一个ML管道,帮助您的AI项目顺利进入生产环境。
使用 Dagger,您可以将整个工作流定义为代码,无缝地集成监控和日志,并实现持续集成和持续部署。KitOps 简化了模型及其依赖项的打包过程,并管理版本控制等功能。
TL;DR (即不读全文,直接看结论)- MLOps 管道可以提升您的机器学习应用程序的性能,将其监控、版本控制、CI/CD 和自动化融入到管道中。
- Dagger.io 和 KitOps 简化了搭建 MLOps 管道的过程。
- KitOps 可以让不同的团队成员轻松地将模型、代码和数据集等工件组件解包到不同的目录中。
- Dagger.io 能够集成到现有的 CI 平台(如 GitHub Actions、CircleCI 和 GitLab CI)。
为了跟上本教程,您需要以下内容:
- 一个容器注册表: 可以使用Jozu Hub,GitHub 包注册表或DockerHub。本指南使用的是Jozu Hub。
- 代码托管平台: 可以使用GitHub或GitLab。
- KitOps: 参见安装KitOps的指南。
- Dagger.io: 按照这些说明安装Dagger.io。将使用Dagger Cloud来帮助您更好地理解Dagger流水线。
- Docker: 按照此指南中的步骤在本地安装Docker。
首先,你得确保本地安装了Kit命令行工具。安装完成后,然后可以使用以下命令来验证安装:
kit --version
这个套件的版本
切换到全屏查看 结束全屏
你应该看到如下图所示的输出。
登录您的Jozu Hub账户并创建一个仓库。这里,我创建了一个空的代码仓库,名叫llm_repo
。
你可以通过运行命令来验证你的本地终端是否连接到JozuHub:
# 命令内容保持英文原样
运行 kit 登录 jozu.ml
全屏模式,退出全屏
这会要求你输入用户名和密码。你的用户名是你用来注册 Jozu Hub 账户的 电子邮件地址,而密码则是另一个单独输入的。
拆开 ModelKit 包装:成功登录后,可以本地解包一个ModelKit示例。您也可以从包注册表获取任何ModelKit。本教程使用来自Jozu的Phi3模型。
请运行下面的代码来解包模型:
执行 kit unpack: jozu.ml/jozu/phi3:3.8b-迷你指令-4k-q4_K_M
全屏,退出
打开ModelKit安装包后,你会看到如下文件:Kitfile,Phi3,模型,以及一些markdown格式的文档。
解压后生成的Kitfile如下所示。
manifestVersion: 1.0.0
package:
name: phi3
version: 3.0.0
description: Phi-3-Mini-4K-Instruct 是一个拥有 38 亿参数,轻量级且最先进的开源模型
authors: [Microsoft Corporation]
model:
name: Phi-3-mini-4k-instruct-q4
path: Phi-3-mini-4k-instruct-q4.gguf
license: MIT 许可证
description: 中等质量,平衡 - 推荐
code:
- path: LICENSE
description: 许可证文件。
- path: README.md
description: README 文件。
- path: CODE_OF_CONDUCT.md
description: 行为规范文件。
- path: NOTICE.md
description: 说明文件。
- path: SECURITY.md
description: 安全指南文件。
点击全屏按钮进入或退出全屏模式
到这个时候,你的目录结构应该像这样:
如下图所示:
|-- models
|-- Phi-3-mini-4k-instruct-q4.gguf
|-- docs
|-- README.md
|-- CODE_OF_CONDUCT.md
|-- NOTICE.md
|-- SECURITY.md
|-- LICENSE
|-- kitfile
全屏 / 退出全屏
把Kitfile修改一下,让它反映出目录结构。
manifestVersion: 1.0.0
package:
name: phi3
version: 3.0.0
description: Phi-3-Mini-4K-Instruct 是一个拥有 380 亿参数的轻量级、顶尖的开源模型
authors: [Microsoft Corporation]
model:
name: Phi-3-mini-4k-instruct-q4
path: models/Phi-3-mini-4k-instruct-q4.gguf
license: MIT License
description: 中等平衡的质量 - 推荐
code:
- path: docs/LICENSE
description: 许可证文件。
- path: docs/README.md
description: 说明文件。
- path: docs/CODE_OF_CONDUCT.md
description: 行为准则文件。
- path: docs/NOTICE.md
description: 通知文件。
- path: docs/SECURITY.md
description: 安全文件。
进入全屏 退出全屏
本地测试:模型你可以快速地在本地运行你的模型来加快集成和实验过程。你可以通过运行以下命令试试看。
kit dev start
全屏/退出全屏
这会启动一个可以用来测试和调整你的模型参数的开发服务器,并通过浏览器查看结果。
现在你的模型已经在本地跑起来,接下来就把它们和MLOps整合起来。
集成MLOps技术 安装 Dagger您必须在本地安装 Dagger。为此目的,您可以遵循此指南。安装完成后,您可以运行以下命令来验证安装是否成功。
类型:匕首
切换到全屏模式。退出全屏
要登录 Dagger Cloud,只需运行这个命令。
运行 dagger 登录命令
进入全屏 退出全屏
注册Dagger Cloud账号后,完成设置后,您必须使用此指南在Dagger上安装Kit插件。
dagger install github.com/jozu-ai/daggerverse/kit
进入全屏,退出全屏
初始化 Dagger 模块首先,确保Docker守护进程正在运行。最简单的方法是通过在您的本地终端输入如下命令:
运行以下命令初始化dagger, 使用Python SDK并指定源目录./dagger:
dagger init --sdk=python --source=./dagger
全屏模式 退出全屏
你也可以指定SDK,这可以是用Go、Python或TypeScript编写。使用`--source`标志来指定源代码所在的目录。这将创建一些文件,例如**dagger.json**、**LICENSE**和一个dagger文件夹,其中包含`dagger/src/main/__init__.py`文件的源代码模板文件,一个`dagger/pyproject.toml`文件,以及一个供本地开发使用的`dagger/sdk`文件夹。
在初始化 Dagger 模块之后,使用 Daggerverse 将其与 Kit 文件进行集成。
## 增强你的Kitfile
Daggerverse 让发现和分享包含 Dagger 函数的模块变得简单。为了简单起见,本文将使用来自 Daggerverse 的 [**Kit 模块**](https://daggerverse.dev/mod/github.com/jozu-ai/modelkit-factory/modules/kit@be110f46791083f69c44a509a7d2a667da50d6e3#kit.constructor)。
在你的 `dagger/src/__init__.py` 文件中,用下面的代码片段来修改你的 Dagger 函数。
import dagger
from dagger import dag, function, object_type
@object_type
class KitopsDagger:
@function
def kit() -> dag.Kit:
return (
dag.kit()
)
# 异步获取Kit的版本信息
@function
async def version() -> str:
return await (
dag.kit()
.version()
)
# 异步获取Kit的注册表信息
@function
async def registry() -> str:
return await (
dag.kit()
.registry()
)
# 使用用户名和密码进行身份验证并返回一个Kit实例
@function
def auth(username: str, password: dagger.Secret) -> dag.Kit:
return (
dag.kit()
.with_auth(username, password)
)
# 打包指定目录并返回一个Kit实例
@function
def pack(directory: dagger.Directory, reference: str) -> dag.Kit:
return (
dag.kit()
.pack(directory, reference)
)
# 异步推送指定引用
@function
async def push(reference: str) -> None:
return await (
dag.kit()
.push(reference)
)
切换到全屏 退出全屏
此模块包含用于与Jozu Hub注册表进行身份验证的dagger函数,将ModelKit打包并推送到注册表。执行以下命令将您的Jozu Hub密码导出至终端:
export PASSWORD=<你的jozuhub密码> (请替换为你的实际密码)
进入全屏 退出全屏
要运行您的Dagger管道,在终端中执行以下命令:
请在此处输入实际命令
```sh
# 执行实际的命令
dagger -m github.com/jozu-ai/modelkit-factory/modules/kit@be110f46791083f69c44a509a7d2a667da50d6e3 call --registry jozu.ml 带认证 --username <你的邮箱> --password env:<你的密码> pack --directory . --reference jozu.ml/<你的用户名>/<你的仓库>:<标签> --kitfile Kitfile push --reference jozu.ml/<你的用户名>/<你的仓库>:<标签>
注意:此命令用于将本地目录中的内容打包并推送到指定的仓库,需要替换 <你的邮箱>
、 <你的密码>
、 <你的用户名>
、 <你的仓库>
和 <标签>
为实际值。
进入全屏,退出全屏
接下来会怎样?
在执行您的Dagger管道之后,您的部署模型会被打包成一个ModelKit并推送到Jozu Hub注册表中。在Dagger Cloud的UI上,您能够可视化管道,查看日志,了解管道在每个步骤的运行情况。
部署所需的时间取决于您的模型大小。当管道运行结束后,您可以在Jozu Hub的注册表中找到您的包。
你也可以在终端运行这个命令,把ModelKit解压到另一个地方。
kit unpack jozu.ml/<你的jozu用户名>/<你的jozu仓库>:<版本号> --model -d <路径>
全屏 退出全屏
将工作流与持续集成和持续部署(CI/CD)管道集成想象每次更换数据集、代码或模型时,都需要重复这些步骤。这会拖慢你的开发进度并使合作变得复杂。手动部署效率低且容易出错,并且难以扩展和管理。
CI/CD 流水线,如 GitHub Actions 和 Jenkins 等,在自动化软件部署和发布方面起到了至关重要的作用。让我们把 Dagger 函数和 GitHub Actions 整合起来,以便自动打包并将 ModelKits 推送到容器仓库。
创建一个名为 **.github/workflows/master.yml**
的文件,并修改您的 Dagger 函数,并在其中加入以下片段。
name: dagger
on:
push:
branches: [master]
jobs:
run-dagger:
name: 运行 Dagger 任务
runs-on: ubuntu-latest
steps:
- name: 拉取代码
uses: actions/checkout@v4
- name: 安装 Kit
uses: jozu-ai/gh-kit-setup@v1.0.0
- name: 解包 Kit
run: |
kit version
kit unpack jozu.ml/jozu/phi3:3.8b-mini-instruct-4k-q4_K_M --model -d models/Phi-3-mini-4k-instruct-q4.gguf
- name: 执行 Dagger 函数
uses: dagger/dagger-for-github@v6
with:
version: "latest"
verb: call --registry jozu.ml
module: github.com/jozu-ai/daggerverse/kit
args: with-auth --username $JOZU_EMAIL --password env:JOZU_PASS pack --directory . --reference jozu.ml/emmanueloffisongetim/llm_repo:$TAG --kitfile Kitfile push --reference jozu.ml/emmanueloffisongetim/llm_repo:$TAG
cloud-token: ${{ secrets.DAGGER_CLOUD_TOKEN }}
env:
KIT_PAT: ${{ secrets.KIT_PAT }} # 密钥: KIT_PAT
JOZU_PASS: ${{ secrets.JOZU_PASSWORD }}
JOZU_EMAIL: ${{ secrets.JOZU_EMAIL }}
TAG: champion
进入全屏。退出全屏。
每当您做出更改并将其推送到主分支时,CI/CD流水线会被触发。此流水线将会检出(checkout)GitHub仓库,安装Kit工具,将Phi3模型解压到您Kitfile中指定的目录,并在Dagger Cloud上执行Dagger流水线。
理想情况下,本地构建的模型太大以至于无法推送到GitHub。因此,在您的CI/CD管道中解包模型更为有效。当您推送到主分支时,您将看到类似于下方图片的输出内容。我们来修改管道,并将‘latest’标签版本推送到Jozu Hub。
如果你检查你的Jozu Hub注册表(Registry),你会看到ModelKit的新版本,这意味着你的部署已经成功。
结尾使用正确的工具,构建有效的MLOps管道其实很简单。通过集成Dagger和KitOps,你可以将模型开发流程、版本管理和部署简化成,使得扩大和维护生产中的机器学习模型更容易。
KitOps 在打包模型包、管理依赖项和自动化工作流中发挥着关键作用。Dagger.io 是一个简化管道定义和监控的平台,使以代码形式定义管道并监控您的 MLOps 管道情况变得容易。这使得部署更快更可靠,同时团队协作也得到了提升。
如果你有关于将KitOps与你的团队集成有任何疑问,加入Discord和大家一起讨论,并从这里开始今天就开始使用KitOps吧!
共同学习,写下你的评论
评论加载中...
作者其他优质文章