使用 AIKit 微调和部署容器化开源 LLM - 第 1 部分:在本地机器上运行
欢迎来到我们关于利用 AIKit 部署大型语言模型 (LLM) 的三部分系列文章的第一部分。在本系列中,我们将探索推理和微调,使用 GitHub Actions 和 Kubernetes 自动化这些过程,并解决在生产环境中部署 LLM 的安全隐患。
在第 1 部分中,我们将深入探讨使用 AIKit 进行推理和微调的基础知识。您将学习如何在本地机器上设置 AIKit,配置您的环境,并轻松执行推理和微调任务。我们将提供分步说明和实际示例,以确保您在进入更高级主题之前对基础知识感到满意。
第 2 部分将引导您使用 GitHub Actions 和 Kubernetes(带工作负载身份)自动化推理和微调过程。本节将涵盖设置一个从微调到部署模型并使用 Kubernetes 集群进行扩展的工作流。在本部分结束时,您将能够为您的 AI 项目创建一个强大、自动化的工作流。
在第 3 部分中,我们将讨论在生产环境中运行 LLM 工作负载(与容器和 Kubernetes 相关)的安全隐患。我们将讨论 AIKit 如何解决漏洞(CVE),容器安全运行时最佳实践,使用带有 cosign 的签名镜像确保您的模型安全,并支持带有本地或远程容器注册表的隔离环境。本部分将为您提供维护安全高效 AI 环境所需的工具和最佳实践。
🙋♂️ AIKit 是什么?
AIKit 是一个全面的云原生、与供应商无关的解决方案,旨在帮助开发人员轻松微调、构建和部署 LLM。
🔍 AIKit 的主要功能
- 推理:AIKit 提供跨各种格式的广泛推理功能。它通过即插即用的 REST API 与 OpenAI API 兼容,允许与任何 OpenAI API 兼容的客户端无缝集成,以与开源 LLM 交互。
- 微调:AIKit 提供了一个可扩展的界面,用于快速、内存高效且直接的微调体验。
🤔 为什么选择 AIKit?
- 🐳 无需 GPU、互联网或 Docker 以外的额外工具即可进行推理!
- 🤏 创建的容器镜像尺寸极小,由于采用了自定义的无发行版镜像,可减少漏洞并缩小攻击面,从而增强安全性!
- 🎵 提供强大且快速、内存高效的微调支持!
- 🚀 对推理和微调均采用易于使用的声明式配置。
- ✨ 完全兼容 OpenAI API,可与任何兼容客户端一起使用。
- 📸 支持多模态模型和使用 Stable Diffusion 生成图像。
- 🦙 兼容各种模型格式,如 GGUF、GPTQ、EXL2、GGML、Mamba 等。
- 🚢 已准备好用于 Kubernetes 部署,包括全面的 Helm Chart!
- 📦 能够在单个镜像中支持多个模型。
- 🖥️ 促进使用 NVIDIA GPU 进行 GPU 加速推理。
- 🌈 支持隔离环境,可使用自托管、本地或任何远程容器注册表来存储边缘推理的模型镜像。
- 🔐 通过使用 cosign 签名镜像和使用 Copacetic 持续修补 CVE,确保安全性。
💪 在本地机器上尝试推理!
您可以通过简单的 Docker 命令在没有 GPU 的本地机器上启动 AIKit
docker run -d --rm -p 8080:8080 ghcr.io/sozercan/llama3:8b
curl https://:8080/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "llama-3-8b-instruct",
"messages": [{"role": "user", "content": "explain kubernetes in a sentence"}]
}'
输出应类似于
{
// ...
"model": "llama-3-8b-instruct",
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "Kubernetes is an open-source container orchestration system that automates the deployment, scaling, and management of applications and services, allowing developers to focus on writing code rather than managing infrastructure."
}
}
],
// ...
}
就是这样!🎉 API 与 OpenAI 兼容,因此它可以作为任何 OpenAI API 兼容客户端的即插即用替代品。AIKit 附带了许多预制镜像,可帮助您立即开始使用!
虽然您可以使用 CPU 运行推理,但本教程的其余部分需要您拥有 NVIDIA GPU,因为微调有要求。请参阅 GPU 加速,了解 NVIDIA 运行时要求。
📻 微调
微调过程允许将预训练模型适应特定领域的数据。要开始,您需要创建一个构建器以能够访问主机 GPU 设备
docker buildx create --name aikit-builder \
--use --buildkitd-flags '--allow-insecure-entitlement security.insecure’
AIKit 旨在可扩展,允许多种微调实现。在本教程中,我们将使用 Unsloth,它以其快速且内存优化的微调能力而闻名,来微调我们的模型。
创建一个 YAML 文件,其中包含您的配置。例如,一个最小配置如下所示
cat <<EOF >>aikitfile-finetune.yaml
#syntax=ghcr.io/sozercan/aikit:latest
apiVersion: v1alpha1
baseModel: "unsloth/llama-2-7b-bnb-4bit"
datasets:
- source: "yahma/alpaca-cleaned"
type: "alpaca"
unsloth:
EOF
有关完整规范,请参阅 AIKit 的微调文档。
通过调用 docker build
启动微调过程
docker buildx build --builder aikit-builder --allow security.insecure \
--file aikitfile-finetune.yaml \
--output _output --target unsloth --progress plain .
这将启动微调过程。请记住,这不会创建镜像,而是输出一个文件,该文件位于由 --output
参数指定的文件夹中。根据 GPU、基础模型和数据集的不同,此过程可能需要一些时间。
微调过程完成后,AIKit 将自动转换为输出目录中的 GGUF 格式模型。在我们的例子中,这是 _output
目录。让我们看看
$ ls -al _output
-rw-r--r-- 1 sozercan sozercan 7161089856 Mar 3 00:19 aikit-model-q4_k_m.gguf
现在我们有了微调后的模型,让我们创建一个模型镜像,类似于我们之前运行的预构建 Llama 3 模型。
📦 创建模型镜像
我们将从之前构建的微调模型创建一个模型镜像。首先创建一个 aikitfile-inference.yaml
文件,其结构如下
cat <<EOF >>aikitfile-inference.yaml
#syntax=ghcr.io/sozercan/aikit:latest
apiVersion: v1alpha1
debug: true
runtime: cuda
models:
- name: custom
source: model-q4_k_m.gguf
promptTemplates:
- name: instruct
template: |
Below is an instruction that describes a task. Write a response that appropriately completes the request.
### Instruction:
{{.Input}}
### Response:
config: |
- name: custom
backend: llama
parameters:
model: model-q4_k_m.gguf
context_size: 4096
gpu_layers: 35
f16: true
batch: 512
mmap: true
template:
chat: instruct
EOF
现在,我们将使用 aikitfile-inference.yaml
配置文件创建模型镜像,以 _output
作为上下文,并在本地 Docker 容器存储中创建一个标记为 myllm:demo
的镜像。
docker buildx build _output --tag myllm:demo \
--file aikitfile-inference.yaml \
--load --progress plain
此过程将复制模型和必要的运行时。让我们检查一下我们的镜像
docker images
输出将包含我们刚刚构建的自定义模型
REPOSITORY TAG IMAGE ID CREATED SIZE
myllm demo e8a2da8a320a 3 minutes ago 11.6GB
现在,我们准备好运行我们的微调模型了!
🏃♀️➡️ 运行微调后的模型
与我们之前运行的模型镜像类似,我们将调用 docker run
,但这次启用 NVIDIA GPU,并使用 --gpus all
标志。
docker run -d --rm --gpus all -p 8080:8080 myllm:demo
容器运行后,您可以通过向 AIKit API 发送 POST 请求来执行推理
curl https://:8080/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "custom",
"messages": [{"role": "user", "content": "Compose a haiku about cats"}]
}'
最后,我们从 LLM 得到响应
{
// ...
"model": "custom",
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "Cats are playful and cute,\nThey purr and meow with delight,\nA purrfect companion."
}
}
],
// ...
}
在本教程中,我们介绍了如何部署预制 AIKit 镜像,使用数据集微调模型以创建自定义模型,以及运行该模型以获取响应!
🔮 接下来呢?
在本系列的下一部分中,我们将深入探讨如何使用 GitHub Actions 和 Kubernetes 自动化和扩展此工作流。这将使您能够为您的 AI 项目创建强大、自动化的管道,确保从微调到部署的无缝过渡。敬请关注!
📚 额外资源
有关更多详细信息,您可以参考以下资源
感谢您的关注!如果您有任何问题或反馈,请随时在 AIKit GitHub 存储库中提出问题。