系统教程覆盖 sLLM 的微调、部署全流程,含数据处理和模型优化实践。
Large Language Model(简称 LLM)已经席卷了机器学习领域。仅 2024 年,就有超过 20,000 篇与 LLM 相关的论文发表。随着 ChatGPT 于 2022 年 11 月发布并迅速普及,LLM 展现出了增强和自动化业务流程的巨大潜力。LLM 可以帮助回答用户问题、总结信息,以及生成类似人类撰写的文本(例如电子邮件、文章等)。
尽管 LLM 能力强大,企业仍不愿采用它们,主要有两个原因:
规模: LLM 通常拥有超过 800 亿个参数,因此部署它们是一项资源密集型任务。当用户希望近乎实时地获得响应时,这项挑战会更加突出。
回答过于通用: LLM 通常使用互联网上由用户生成的数据进行训练,而这些数据可能不准确,或内容过于宽泛。此外,由于 LLM 的参数数量庞大,使用特定应用的数据对其进行 fine-tuning,既消耗资源,也耗费时间。
本文将介绍 sLM——一种能够解决上述规模问题的 LLM 替代方案。我们还将逐步介绍如何快速部署你的 SLM,并使用 KitOps 提供的 Dev Mode——一个便于用户与 LLM 交互的友好界面。
Small Language Model(SLM)是 LLM 的微型版本,其参数数量大约只有对应 LLM 的十分之一。LLM 使用 16 位和 32 位浮点数等高精度数据类型存储参数。相比之下,SLM 使用 4 位或 8 位整数数据类型,因此模型体积更小。另一个关键区别是,LLM 同时包含 encoder 和 decoder,而 Mistral 7B 等 SLM 仅包含 decoder。这让模型的参数量大幅减少:SLM 只有 70 亿至 80 亿个参数,而 LLM 则有 800 亿个参数。
与 LLM 相比,SLM 有三项关键优势:
轻量: SLM 的参数更少,部署所需的资源也更少。
领域专用性: SLM 的 fine-tuning 速度更快,也可以轻松使用新的领域专用数据进行训练。
推理更快: SLM 的参数更少,意味着需要执行的计算更少,因而能够实现更快的推理速度。这使 SLM 非常适合实时应用。
虽然大多数语言模型开箱即用时已经表现得很好,但如果你希望将其用于专门任务,对模型进行调优仍然必不可少。使用任务专用数据集对 SLM 进行 fine-tuning,有助于提升模型在该任务上的表现。
如果你搜索有关 SLM fine-tuning 的教程,会发现大量相关博客文章。通常,这些博客中的训练模型都是通过 Jupyter notebook 创建的。在本教程中,我们将简化这一过程,只需一条命令,就能通过 Web 界面开放你调优后的模型。这一切都得益于 Dev Mode,它是开源 KitOps 提供的一项功能。
首先安装 kit 命令行工具。
kit 的安装过程会因操作系统(OS)而异。不过,核心思路都是下载 kit 可执行文件,并将其添加到操作系统能够识别的路径中。你可以在 Installing Kit 页面找到详细说明。
安装 kit 后,需要登录一个 container registry,可以使用 DockerHub 或 GitHub。
# Login to ghcr.io
kit login ghcr.io -u github_user -p personal_token
# Login to docker
kit login docker.io --password-stdin -u docker_user
要对模型进行 fine-tuning,首先需要一个基础模型。在 KitOps 中,所有内容都通过 Kitfile 进行定义或指定。Kitfile 与 Dockerfile 类似,但它是专门为机器学习场景设计的。你可以在 KitOps 文档中找到有关 Kitfile 及其格式的更多信息。现在,可以使用下面的 Kitfile 定义 Llama 3 8B 模型。
manifestVersion: "1.0"
model:
name: llama3-8B-instruct-q4_0
path: ghcr.io/jozu-ai/llama3:8B-instruct-q4_0
description: Llama 3 8B model
下载模型之前,需要使用以下命令创建 ModelKit:
kit pack . -t fine-tuning:untuned
现在,可以下载并解包模型:
kit unpack fine-tuning:untuned -d . --overwrite
数据集是模型 fine-tuning 必不可少的一部分。你可以创建一个名为 training-data.txt 的文本文件,并在其中加入训练数据示例。数据集示例如下:
Example one.
Example two.
数据集的内容取决于你希望模型完成什么任务,例如回答与内部文档相关的问题、总结长文本等。在本次演示中,我们只使用两个虚拟训练样本。较小的数据集能够让 fine-tuning 过程更快,同时减少资源消耗。
你可以使用任何相关的文本文件作为数据集。Google Drive 中提供了 ultrachat_200k 数据集的一个样本,可以下载并使用。如果想转换其他 HuggingFace 数据集,可以使用这个 collab notebook。请注意,<start> token 并非必须提供。如果选择不提供该 token,请不要在 fine-tuning 步骤中为 --sample-start 参数指定任何值。
为了简化 fine-tuning 过程,我们将使用 llma.cpp 库。它的 GitHub repository 提供了针对不同 OS 的安装说明。本指南中的命令已在 MacOS 上测试,但你应该也能通过该 repository 或 help 命令找到标准命令。
安装该库后,你将可以使用 finetune 命令。这个命令允许你设置 hyperparameter 和配置项。在 Mac 上,可以通过 llama-finetune help 命令查看详细的参数列表。部分重要参数如下:
--model-base:基础模型的位置。
--lora-out:保存输出的位置。
--sample-start:将指定模式之后的位置设置为样本起点。如果为空,则使用每个 token 的位置作为样本起点。
--save-every:每进行 N 次迭代保存一次 checkpoint。
--epochs:要处理的最大 epoch 数量。
现在,可以使用前面步骤中创建的示例数据集对模型进行 fine-tuning。使用以下命令运行 fine-tuning 任务:
llama-finetune --model-base ./llama3-8B-instruct-q4_0.gguf --train-data ./training-data.txt --epochs 1 --sample-start "" --lora-out lora_adapter.gguf
训练完成后,使用新的 artifact 和数据集更新 Kitfile。
manifestVersion: "1.0"
package:
name: llama3 fine-tuned
version: 3.0.0
authors: ["Jozu AI"]
model:
name: llama3-8B-instruct-q4_0
path: ghcr.io/jozu-ai/llama3:8B-instruct-q4_0
description: Llama 3 8B model
parts:
- path: ./lora-adapter.gguf
type: lora-adapter
datasets:
- name: fine-tune-data
path: ./training-data.txt
最后,打包模型、添加 tag,并将其上传到 container repository。
## Pack
kit pack /lora_finetuning -t fine-tuning:tuned
## Tag
kit tag fine-tuning:tuned docker.io/bhattbhuwan13/finetuned:latest
## Push
kit push docker.io/bhattbhuwan13/finetuned:latest
现在,模型已经完成 fine-tuning,你可以使用 Dev Mode 与模型交互。
Dev Mode 目前仅适用于 MacOS。KitOps 允许你通过交互式 Web 界面快速部署 SLM。为此,需要在包含 Kitfile 的目录中运行命令:kit dev start。运行该命令后,它会提供一个本地地址;访问该地址,即可与你部署的模型进行交互。
使用完毕后,运行 kit dev stop 终止 Dev Mode。
如果想将模型部署到服务器,可以在服务器上解包 ModelKit、运行 Dev Mode,并配置 Nginx server。默认情况下,Dev Mode 会随机选择一个端口来提供 Web 界面;你可以通过指定 --port 参数覆盖这一行为:kit dev start --port 8000。Nginx 配置文件示例如下:
server {
listen 80;
server_name 3.111.144.91; # replace the ip with public ip for your instance
location / {
proxy_pass http://127.0.0.1:8050;
}
}
可以看到,只需编写一些配置并运行几条命令,我们就完成了整个 SLM 的 fine-tuning,并将其部署到了 Web 界面。这种抽象能力和便利性得益于 KitOps。KitOps 将模型、代码和 artifact 的打包方式标准化,同时让工程师能够轻松跟踪、复现并部署机器学习模型。
此外,Dev Mode 让工程师只需一条命令,就能通过 Web 界面快速开放自己的 LLM。要进一步了解 KitOps,请参阅相关文档。如果你有任何问题,也可以通过 Discord server 联系 KitOps 团队。