根据行业分析师的说法,超过85%的机器学习模型最终无法进入实际应用。原因很简单,就是数据科学家、机器学习工程师和DevOps工程师之间的沟通障碍。将一个机器学习模型从概念变为实际应用需要一个稳健、可扩展且高效的流程。
典型的机器学习生命周期包括从各种数据源提取原始数据,进行数据预处理工作、模型训练、超参数调优、模型评估以及模型部署的迭代流程。大多数机器学习项目通常在模型部署阶段结束,这通常会导致一些问题。
为了解决这个问题,我们使用了包含版本控制、CI/CD(持续集成和持续交付)、模型监控和集成测试等的MLOps流水线。这篇文章会展示如何利用Dagger.io和KitOps来创建一个ML管道,帮助您的AI项目顺利进入生产环境。
使用 Dagger,您可以将整个工作流定义为代码,无缝地集成监控和日志,并实现持续集成和持续部署。KitOps 简化了模型及其依赖项的打包过程,并管理版本控制等功能。
TL;DR (即不读全文,直接看结论)为了跟上本教程,您需要以下内容:
首先,你得确保本地安装了Kit命令行工具。安装完成后,然后可以使用以下命令来验证安装:
kit --version
这个套件的版本
切换到全屏查看 结束全屏
你应该看到如下图所示的输出。
登录您的Jozu Hub账户并创建一个仓库。这里,我创建了一个空的代码仓库,名叫llm_repo
。
你可以通过运行命令来验证你的本地终端是否连接到JozuHub:
# 命令内容保持英文原样
运行 kit 登录 jozu.ml
全屏模式,退出全屏
这会要求你输入用户名和密码。你的用户名是你用来注册 Jozu Hub 账户的 电子邮件地址,而密码则是另一个单独输入的。
成功登录后,可以本地解包一个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整合起来。
您必须在本地安装 Dagger。为此目的,您可以遵循此指南。安装完成后,您可以运行以下命令来验证安装是否成功。
类型:匕首
切换到全屏模式。退出全屏
要登录 Dagger Cloud,只需运行这个命令。
运行 dagger 登录命令
进入全屏 退出全屏
注册Dagger Cloud账号后,完成设置后,您必须使用此指南在Dagger上安装Kit插件。
dagger install github.com/jozu-ai/daggerverse/kit
进入全屏,退出全屏
首先,确保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 流水线,如 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吧!