使用 Dagger.io 和 KitOps 构建 MLOps 管道
使用 Dagger 和 KitOps 构建 MLOps 管道的步骤
与 MLOps 集成
接下来会发生什么?
结论
据行业分析师称,超过 85% 的机器学习模型永远无法投入生产。原因很简单,就是数据科学家、机器学习工程师和 DevOps 工程师之间的沟通脱节。将机器学习模型从概念转化为生产需要稳健、可扩展且高效的流程。
典型的机器学习生命周期涉及从各种数据源提取原始数据、数据预处理、模型训练、超参数调整、模型评估和模型部署的迭代过程。大多数机器学习项目都以模型部署阶段结束,这会导致多个问题:
- 由于数据和模型漂移,机器学习模型变得适得其反。
- 没有用于持续部署的持续集成和自动化管道。
- 没有模型监控来查看您的模型在生产环境中的表现。
为了解决这个问题,我们使用了 MLOps 流水线,它融合了版本控制、CI/CD(持续集成和持续交付)、模型监控和集成测试。在本文中,我们将向您展示如何使用Dagger.io和KitOps创建 ML 流水线,将您的 AI 项目投入生产。
使用 Dagger,您可以将整个管道定义为代码,无缝集成监控功能,并实现 CI/CD。KitOps 简化了模型及其依赖项的打包,同时提供了版本控制管理等功能。
TL;DR
- MLOps 管道改进您的机器学习应用程序,将监控、版本控制、CI/CD 和自动化纳入您的管道。
- Dagger.io 和 KitOps 简化了构建 MLOps 管道的过程。
- KitOps 使各个团队能够轻松地将模型、代码和数据集等工件组件解压到不同的目录中。
- Dagger.io 可以与现有的 CI 平台集成,例如 GitHub Actions、CircleCI 和 GitLab CI。
使用 Dagger 和 KitOps 构建 MLOps 管道的步骤
先决条件
要学习本教程,您需要以下内容:
- 容器镜像仓库:您可以使用Jozu Hub、GitHub 包镜像仓库或DockerHub。本指南使用 Jozu Hub。
- 代码托管平台:您可以使用 GitHub 或 GitLab。
- KitOps:这是安装KitOps的 指南。
- Dagger.io:按照以下说明安装Dagger.io。Dagger Cloud 将用于帮助您更深入地了解 Dagger 管道。
- Docker:按照本指南中的步骤在本地安装 Docker 。## 安装 KitOps
首先,您必须确保已在本地安装 Kit CLI。安装完成后,运行以下命令验证安装是否成功:
kit version
您应该会看到如图所示的输出:
登录你的 Jozu Hub 账户并创建一个仓库。这里我创建了一个名为 的空仓库llm_repo
。
您可以通过运行以下命令使用 JozuHub 验证您的本地终端:
kit login jozu.ml
这将提示您输入用户名和密码。您的用户名是用于创建 Jozu Hub 帐户的电子邮件地址,密码则为该电子邮件地址。
解压模型套件
成功登录后,请在本地解压一个示例 ModelKit。您也可以从软件包注册表中获取任何 ModelKit。本教程使用Jozu的 Phi3 模型 枢纽。
通过运行下面显示的代码来解压模型:
kit unpack jozu.ml/jozu/phi3:3.8b-mini-instruct-4k-q4_K_M
解压 ModelKit 后,您将看到一个文件列表:Kitfile、 Phi3 模型和一些markdown文档。
解压后创建的 Kitfile 显示在下面的代码片段中。
manifestVersion: 1.0.0
package:
name: phi3
version: 3.0.0
description: The Phi-3-Mini-4K-Instruct is a 3.8B parameters, lightweight, state-of-the-art open model
authors: [Microsoft Corporation]
model:
name: Phi-3-mini-4k-instruct-q4
path: Phi-3-mini-4k-instruct-q4.gguf
license: MIT License
description: medium, balanced quality - recommended
code:
- path: LICENSE
description: License file.
- path: README.md
description: Readme file.
- path: CODE_OF_CONDUCT.md
description: Code of conduct file.
- path: NOTICE.md
description: Notice file.
- path: SECURITY.md
description: Security file.
此时,您的目录结构应如下所示:
|-- 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: The Phi-3-Mini-4K-Instruct is a 3.8B parameters, lightweight, state-of-the-art open model
authors: [Microsoft Corporation]
model:
name: Phi-3-mini-4k-instruct-q4
path: models/Phi-3-mini-4k-instruct-q4.gguf
license: MIT License
description: medium, balanced quality - recommended
code:
- path: docs/LICENSE
description: License file.
- path: docs/README.md
description: Readme file.
- path: docs/CODE_OF_CONDUCT.md
description: Code of conduct file.
- path: docs/NOTICE.md
description: Notice file.
- path: docs/SECURITY.md
description: Security file.
本地测试模型
您可以在本地快速运行模型,以加快集成和实验速度。为此,您可以运行以下命令:
kit dev start
这将启动一个开发服务器,您可以在其中测试您的模型、更改其参数并在 Web 浏览器中查看结果。
现在您的模型已在本地运行,请将它们与 MLOps 集成。
与 MLOps 集成
安装 Dagger
您必须在本地安装 Dagger。您可以按照本指南进行操作。安装完成后,运行以下命令验证安装是否成功。
type dagger
通过运行以下命令登录 Dagger Cloud:
dagger login
这会提示你注册 Dagger Cloud。设置完成后,你必须按照本指南在 Dagger 上安装 Kit 。
dagger install github.com/jozu-ai/daggerverse/kit
初始化 Dagger 模块
首先,确保你的 Docker 守护进程正在运行。初始化 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将其与 Kitfile 集成。
使 Kitfile 更加 Dagger 化
Daggerverse 让发现和分享功能丰富的 Dagger 模块变得轻而易举。为了简单起见,本文将使用Daggerverse 中的Kit 模块。
在您的 中**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()
)
@function
async def version() -> str:
return await (
dag.kit()
.version()
)
@function
async def registry() -> str:
return await (
dag.kit()
.registry()
)
@function
def auth(username: str, password: dagger.Secret) -> dag.Kit:
return (
dag.kit()
.with_auth(username, password)
)
@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)
)
此模块包含 Dagger 函数,用于向 Jozu Hub 注册表进行身份验证、打包 ModelKit 并将其推送到注册表。使用以下命令将您的 Jozu Hub 密码导出到终端:
export PASSWORD=<your-jozuhub-password>
要运行 Dagger 管道,请在终端上执行以下命令:
dagger -m github.com/jozu-ai/modelkit-factory/modules/kit@be110f46791083f69c44a509a7d2a667da50d6e3 call --registry jozu.ml with-auth --username <your-jozuhub-email> --password env:<your-jozuhub-password> pack --directory . --reference jozu.ml/<your-jozuhub-username>/<your-jozuhub-repository>:<tag> --kitfile Kitfile push --reference jozu.ml/<your-jozuhub-username>/<your-jozuhub-repository>:<tag>
接下来会发生什么?
执行 Dagger 流水线后,已部署的模型将被打包成 ModelKit,并推送到 Jozu Hub 注册表。在 Dagger Cloud 的 UI 上,您可以可视化您的流水线、查看日志,并了解流水线每一步的运行情况。
此部署的时间取决于模型的大小。管道运行完成后,您将在 Jozu Hub 注册表中看到您的软件包。
类似地,您可以通过在终端上运行以下命令将推送的 ModelKit 解压到单独的位置:
kit unpack jozu.ml/<your-jozu-username>/<your-jozu-repo>:<tag> --model -d <path-to-create>
将工作流与 CI/CD 管道集成
想象一下,每当您更改数据集、代码或模型时,都需要重复所有这些步骤。这会减慢您的开发速度,并使协作变得麻烦。手动部署效率低下、容易出错,并且难以扩展。
GitHub Actions 和 Jenkins 等 CI/CD 流水线在软件部署和发布的自动化过程中发挥着至关重要的作用。让我们将 Dagger 函数与 GitHub Actions 集成,以实现 ModelKit 的自动打包和推送到容器注册表。
创建一个文件**.github/workflows/master.yml**
*并使用下面的代码片段修改你的* Dagger 函数。
name: dagger
on:
push:
branches: [master]
jobs:
run-dagger:
name: Run Dagger Pipeline
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Kit
uses: jozu-ai/gh-kit-setup@v1.0.0
- name: Run kit unpack
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: Call Dagger Function
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 }}
JOZU_PASS: ${{ secrets.JOZU_PASSWORD }}
JOZU_EMAIL: ${{ secrets.JOZU_EMAIL }}
TAG: champion
每当您进行更改并将其推送到主分支时,都会触发 CI/CD 流水线。此流水线会检出GitHub 仓库,安装 Kit,将 Phi3 模型解压到 Kitfile 中指定的目录中,并在 Dagger Cloud 上运行 Dagger 流水线。
理想情况下,本地构建的模型过于庞大,无法推送到 GitHub。因此,在 CI/CD 流水线中解压模型是一种更高效的做法。推送到主分支后,您将看到类似下图的输出。让我们修改流水线,并将“ latest ”标签版本推送到 Jozu Hub。
如果您检查 Jozu Hub 注册表,您将看到 ModelKit 的新版本,这意味着您的部署已成功。
结论
使用合适的工具可以轻松构建有效的 MLOps 流水线。通过集成 Dagger 和 KitOps,您可以简化模型开发、版本控制和部署,从而更轻松地在生产环境中扩展和维护机器学习模型。
KitOps 在打包模型、管理依赖项和自动化工作流方面发挥着关键作用。Dagger.io 让您可以轻松地将流水线定义为代码并监控 MLOps 流水线。这不仅提高了部署速度和可靠性,还增强了团队协作。
如果您对将 KitOps 与您的团队集成有任何疑问,请加入Discord上的对话并立即开始使用 KitOps!
文章来源:https://dev.to/kitops/building-an-mlops-pipeline-with-daggerio-and-kitops-566m