你是否已厌倦管理多个 AI 模型所带来的复杂性和高成本?那么,
如果你可以部署一次就搞定 30 个模型推理服务会如何?
在当今的 ML 世界中,哪些希望充分发挥其数据的价值的组织可能最终会进入一个“微调的世界”。在这个世界,各个组织会构建大量模型,其中每个模型都针对特定任务进行了高度特化。但是,如何处理为每个细分应用部署模型所带来的麻烦和成本呢?多-LoRA 服务提供了一个有潜力的答案。
动机
对组织而言,基于微调构建多个模型是有意义的,原因有多重:
-
性能 -
有
足够证据
表明: 在目标任务上,较小的专用模型表现优于较大的通用模型。Predibase 的结果 [5] 表明,针对特定任务对
mistralai/Mistral-7B-v0.1
基础模型进行 LoRA 微调可以获得比 GPT-4 更好的性能。
https://hf.co/papers/2405.09673
https://hf.co/mistralai/Mistral-7B-v0.1/tree/main
-
适应性 -
Mistral 或 Llama 等模型的用途极其广泛,你可以选择其中之一作为基础模型,然后针对
各种下游任务
微调出各种专用模型。还有一个好处是,你不会被某个模型锁定,因为你可以轻松换掉该基础模型,然后用你的数据对另一个基础模型进行微调 (稍后会详细介绍)。
https://predibase.com/blog/lora-land-fine-tuned-open-source-llms-that-outperform-gpt-4
-
独立性 -
对不同任务,不同的团队可以独立进行不同的微调,从而在数据准备、配置、评估标准和模型更新节奏方面保持独立和并行。
-
隐私 -
专用模型提供了很大的灵活性,使得我们可以根据隐私要求对训练数据进行隔离,不需要将所有数据都暴露成基础模型的训练数据。此外,由于模型的本地运行愈显重要,微调使得在本地设备上运行的小模型有能力执行特定任务。
总之,微调使组织能够释放其数据的价值,当它们使用其独有的、高度专业化的数据时,这种优势变得尤为重要,甚至足以改变游戏规则。
看上去前景光明,有啥问题吗?有的!部署大语言模型 (LLM) 服务提出了多方面的挑战。部署单个模型的成本和操作复杂性已经够让人头疼了,更不用说
n
个模型了。这意味着,虽然微调有万般好,但是它让 LLM 的部署和服务变得更复杂了也是铁的事实。
如何解决“既要又要”的问题,及时雨就应时而现了。TGI 最近推出了新功能 -
多-LoRA 服务
(👏👏👏)。
LoRA 背景知识
LoRA 即
低阶适配
,是一种对预训练大模型进行高效微调的技术。其核心思想是无需重新训练整个模型,仅需训练一小部分称为适配器的参数,就可使预训练大模型适应特定任务。这些适配器的大小与预训练 LLM 相比,通常仅增加约 1% 的存储和内存开销,就能达到与全模型微调的模型相当的效果。
低阶适配
https://hf.co/papers/2106.09685
LoRA 的明显好处是,它通过减少内存需求来降低微调成本。它还可以
缓解灾难性遗忘
,且在
小数据集
上效果更好。
-
缓解灾难性遗忘
https://hf.co/papers/2405.09673
-
小数据集
https://hf.co/blog/peft
|
图 1:LoRA 详解
|
在训练过程中,LoRA 会冻结原模型权重
W
,并对两个小矩阵
A
和
B
进行微调,这使得微调更加高效。知道这一点后,你就能比较容易理解图 1 中 LoRA 模型推理的工作原理了。我们从预训练模型
Wx
中获取输出,并将其与低阶适配项
BAx
相加 [6]。
多-LoRA 推理服务
了解了 LoRA 的低阶适配的基本思想后,我们可以深入研究一下多-LoRA 服务了。这个概念很简单: 给定一个基础预训练模型和一些任务,你可以针对这些任务微调特定的 LoRA,多-LoRA 服务是一种根据传入请求动态选择所需 LoRA 的机制。
|
图 2:多-LORA 详解
|
图 2
展示了这种动态路由的工作原理。每个用户请求都包含输入
x
以及该请求对应 LoRA 的 id (我们称为同批异构用户请求)。LoRA id 信息使得 TGI 得以凭此选择正确的 LoRA 适配器。
多-LoRA 服务让我们仅需部署一个基础模型。而且由于 LoRA 适配器很小,所以你可以加载多个适配器,而不用担心内存问题。请注意,具体能加载多少个适配器取决于你的可用 GPU 资源以及你部署的模型。最终效果实际上相当于在一次部署中支持了多个经过微调的模型。
LoRA 权重的大小依秩和量化方法的不同而不同,但它们通常都非常小。这边给大家一个直观印象:
predibase/magicoder
为 13.6MB,不到
mistralai/Mistral-7B-v0.1
尺寸 (14.48GB) 的 1/1000。相对而言,将 30 个适配器加载到 RAM 中只会让 VRAM 增加 3%,这对于大多数部署来说都不成问题。因此,我们可以一次部署多个模型。
-
predibase/magicoder
https://hf.co/predibase/magicoder/tree/main
-
mistralai/Mistral-7B-v0.1
https://hf.co/mistralai/Mistral-7B-v0.1/tree/main
如何使用
收集 LoRA 权重
首先,你需要训练 LoRA 模型并导出适配器权重。你可以在此处找到 LoRA 微调相关的
指南
。请注意,当你将微调后的模型推送到 Hub 时,只需推送适配器,无需推送完整的合并模型。从 Hub 加载 LoRA 适配器时,会从适配器模型卡推断出基础模型并将其单独加载。如需更深入的支持,可以试试我们的
专家支持计划
。当你为特定用例创建自己的 LoRA 时,真正的价值才会显现。
-
指南
https://hf.co/docs/peft/en/task_guides/lora_based_methods
-
专家支持计划
https://hf.co/support
低代码团队
对某些组织而言,为自己的用例训练一个 LoRA 可能比较困难,因为它们可能缺乏相应的专业知识或其他资源。即使选好了基础模型并准备好了数据,后面还需要跟上最新技术,探索超参空间,找到最佳硬件资源,编写代码,然后进行评估。这项任务,即使对于经验丰富的团队来说,也不可谓不艰巨。
AutoTrain 可帮助显著降低这一门槛。AutoTrain 是一种无代码解决方案,只需单击几下鼠标即可训练机器学习模型。我们提供了多种使用 AutoTrain 的方法。除了
本地安装
外,我们还支持:
本地安装
https://github.com/huggingface/autotrain-advanced?tab=readme-ov-file#local-installation
AutoTrain 环境
|
硬件配置
|
编码量
|
备注
|
Hugging Face Space
|
多种 GPU 及其它硬件
|
无代码
|
灵活易用
|
DGX 云
|
最高 8xH100 GPU
|
无代码
|
更适宜大模型
|
Google Colab
|
单张 T4 GPU
|
低代码
|
适宜小模型以及量化后的模型
|
-
Hugging Face Space
https://hf.co/login?next=%2Fspaces%2Fautotrain-projects%2Fautotrain-advanced%3Fduplicate%3Dtrue
-
DGX 云
https://hf.co/blog/train-dgx-cloud
-
Google Colab
https://colab.research.google.com/github/huggingface/autotrain-advanced/blob/main/colabs/AutoTrain.ipynb
部署
本文以
Predibase 的 LoRA Land
为例,主要使用如下两个 LoRA 适配器:
-
Predibase 的 LoRA Land
https://predibase.com/blog/lora-land-fine-tuned-open-source-llms-that-outperform-gpt-4
-
predibase/customer_support
,其是在
Gridspace-Stanford Harper Valley 语音数据集
上微调而得,增强了准确理解和响应交互性客服工单的能力,改善了模型在语音识别、情绪检测和对话管理等任务中的表现,有助于促成更高效、更富同理心的客户支持。
https://hf.co/predibase/customer_support
https://github.com/cricketclub/gridspace-stanford-harper-valley
-
predibase/magicoder
,其是在
ise-uiuc/Magicoder-OSS-Instruct-75K
上微调而得,这是一个合成的代码指令数据集。
https://hf.co/predibase/magicoder
https://hf.co/datasets/ise-uiuc/Magicoder-OSS-Instruct-75K
TGI
TGI 文档
中已有很多关于如何部署 TGI 的有用信息。这里,我们仅提醒一些要点:
TGI 文档
https://github.com/huggingface/text-generation-inference
-
-
部署基础模型:
mistralai/Mistral-7B-v0.1
-
在部署期间,添加
LORA_ADAPTERS
环境变量
-
示例:
LORA_ADAPTERS=predibase/customer_support,predibase/magicoder
model=mistralai/Mistral-7B-v0.1
# share a volume with the Docker container to avoid downloading weights every run
volume=$PWD/data
docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data \
ghcr.io/huggingface/text-generation-inference:2.1.1 \
--model-id $model \
--lora-adapters=predibase/customer_support,predibase/magicoder
推理终端 GUI
推理终端
支持多种
GPU 或其他 AI 加速卡
,只需点击几下即可跨 AWS、GCP 以及 Azure 部署!使用 GUI 部署相当容易。其后端默认使用 TGI 进行文本生成 (你也可以
选择
使用自己的 docker 镜像)。
-
推理终端
https://hf.co/docs/inference-endpoints/en/index
-
GPU 或其他 AI 加速卡
https://hf.co/docs/inference-endpoints/en/pricing#gpu-instances
-
选择自定义容器
https://hf.co/docs/inference-endpoints/en/guides/custom_container
要在推理终端上使用多-LoRA 服务,你只需跳转至
控制台
,然后:
控制台网址
https://ui.endpoints.huggingface.co/
-
选择基础模型:
mistralai/Mistral-7B-v0.1
-
-
例如:
AWS
|
us-east-1
|
Nvidia L4
在环境变量中添加
LORA_ADAPTERS=predibase/customer_support,predibase/magicoder
请注意,以上只是最少配置,你可以根据需要对其他设置进行配置。
|
图 3:多-LoRA 推理终端
|
|
图 4:多-LoRA 推理终端 2
|
推理终端代码
有些人可能有点
怕老鼠
,因此不想使用鼠标,我们对此不做评判 [😂]。此时,仅用键盘也可通过代码自动执行上述操作,非常简单。
怕老鼠
https://en.wikipedia.org/wiki/Fear_of_mice_and_rats
from huggingface_hub import create_inference_endpoint
# Custom Docker image details
custom_image = {
"health_route": "/health",
"url": "ghcr.io/huggingface/text-generation-inference:2.1.1", # This is the min version
"env": {
"LORA_ADAPTERS": "predibase/customer_support,predibase/magicoder", # Add adapters here
"MAX_BATCH_PREFILL_TOKENS": "2048", # Set according to your needs
"MAX_INPUT_LENGTH": "1024", # Set according to your needs
"MAX_TOTAL_TOKENS": "1512", # Set according to your needs
"MODEL_ID": "/repository"
}
}
# Creating the inference endpoint
endpoint = create_inference_endpoint(
name="mistral-7b-multi-lora",
repository="mistralai/Mistral-7B-v0.1",
framework="pytorch",
accelerator="gpu",
instance_size="x1",
instance_type="nvidia-l4",
region="us-east-1",
vendor="aws",
min_replica=1,
max_replica=1,
task="text-generation",
custom_image=custom_image,
)
endpoint.wait()
print("Your model is ready to use!")
部署此配置大约需要 3 分 40 秒。请注意,其他模型可能需要更长的时间。如果你遇到加载时长的问题,请在 GitHub 上提交
问题
!
提交问题
https://github.com/huggingface/text-generation-inference/issues
使用
当使用推理终端时,你需要指定
adapter_id
。下面给出了一个 cURL 示例:
curl 127.0.0.1:3000/generate \
-X POST \
-H 'Content-Type: application/json' \
-d '{
"inputs": "Hello who are you?",
"parameters": {
"max_new_tokens": 40,
"adapter_id": "predibase/customer_support"
}
}'
这里还有一个使用
InferenceClient
的示例,该示例来自
Hugging Face Hub Python 库
。请确保你用的是
huggingface-hub>=0.24.0
,在必要情况下,你还需
登录
hub。
-
InferenceClient
https://hf.co/docs/huggingface_hub/guides/inference
-
Hugging Face Hub Python 库
https://hf.co/docs/huggingface_hub/index
-
登录 Hugging Face Hub
https://hf.co/docs/huggingface_hub/quick-start#authentication
from huggingface_hub import InferenceClient
tgi_deployment = "127.0.0.1:3000"
client = InferenceClient(tgi_deployment)
response = client.text_generation(
prompt="Hello who are you?",
max_new_tokens=40,
adapter_id='predibase/customer_support',
)
实际考量
成本
正如 ,因为本节内容主要基于他们的工作。
|
图 5:多-LoRA 成本
我们用 TGI 在英伟达 L4 上部署了
mistralai/Mistral-7B-v0.1
基础模型,其
推理终端
成本
为 0.8 美元/小时。每秒可完成 75 个请求,平均每个请求有 450 个输入词元、234 个输出词元,并与相应配置的 GPT3.5 Turbo 成本进行了对比。
|