使用 AIKit 微调和部署容器化开源 LLM - 第 1 部分:在本地机器上运行

社区文章 发布于 2024 年 6 月 4 日

欢迎来到我们关于利用 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 的主要功能

  1. 推理:AIKit 提供跨各种格式的广泛推理功能。它通过即插即用的 REST API 与 OpenAI API 兼容,允许与任何 OpenAI API 兼容的客户端无缝集成,以与开源 LLM 交互。
  2. 微调: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 存储库中提出问题。

社区

注册登录 以评论