TGI Multi-LoRA:一次部署,服务30个模型

发布于2024年7月18日
在 GitHub 上更新

您是否厌倦了管理多个AI模型的复杂性和高昂成本?**如果您能一次部署,服务30个模型呢?**在当今的机器学习世界中,希望利用其数据价值的组织很可能会进入一个“微调世界”,构建大量模型,每个模型都高度专业化以执行特定任务。但是,如何才能跟上为每个用例部署模型的麻烦和成本呢?答案是Multi-LoRA服务。

动机

作为组织,通过微调构建大量模型有多种原因。

  • 性能 -令人信服的证据表明,较小、专业化的模型在它们所训练的任务上,其性能优于较大、通用型模型。Predibase[5]表明,使用特定任务的LoRA以及像mistralai/Mistral-7B-v0.1这样的基础模型,您可以获得比GPT-4更好的性能。

  • 适应性 - 像Mistral或Llama这样的模型非常多功能。您可以选择其中一个作为基础模型,并构建许多专业化模型,即使下游任务非常不同。另外,请注意,您不会被锁定,因为您可以轻松地更换基础模型,并使用您的数据在另一个基础模型上进行微调(稍后会详细介绍)。

  • 独立性 - 对于您的组织关心的每项任务,不同的团队可以进行不同的微调,从而在数据准备、配置、评估标准和模型更新频率方面实现独立性。

  • 隐私 - 专业化模型在训练数据隔离和根据数据隐私要求限制不同用户访问方面提供了灵活性。此外,在本地运行模型很重要的情况下,小型模型可以针对特定任务变得非常强大,同时保持其尺寸足够小以在设备上运行。

总而言之,微调使组织能够释放其数据的价值,当组织使用独一无二的高度专业化数据时,这种优势变得尤为重要,甚至改变游戏规则。

那么,问题出在哪里呢?部署和提供大型语言模型(LLMs)在许多方面都具有挑战性。成本和操作复杂性是部署单个模型,更不用说*n*个模型时的关键考虑因素。这意味着,尽管微调有很多优点,但它使LLM的部署和提供变得更加复杂。

这就是为什么今天我们非常高兴地介绍TGI的最新功能——**Multi-LoRA服务**。

LoRA背景

LoRA,即低秩适应(Low-Rank Adaptation),是一种高效微调大型预训练模型的技术。其核心思想是在不需重新训练整个模型的情况下,仅通过一小组称为适配器的参数来使大型预训练模型适应特定任务。这些适配器通常只增加约1%的存储和内存开销,与完全微调的模型相比,仍能保持其质量。

LoRA的明显好处是它通过减少内存需求,使微调成本大大降低。它还减少了灾难性遗忘,并与小型数据集配合得更好。

图1:LoRA解释

在训练期间,LoRA冻结原始权重W并微调两个小矩阵AB,从而大大提高了微调效率。考虑到这一点,我们可以在图1中看到LoRA在推理期间是如何工作的。我们从预训练模型Wx中获取输出,然后添加低秩*适应*项BAx[6]

Multi-LoRA服务

现在我们了解了LoRA引入的模型适应的基本概念,我们准备深入探讨Multi-LoRA服务。这个概念很简单:给定一个基础预训练模型和许多不同的任务,你已经为这些任务微调了特定的LoRA,Multi-LoRA服务是一种根据传入请求动态选择所需LoRA的机制。

图2:Multi-LoRA解释

图2展示了这种动态适应是如何工作的。每个用户请求都包含输入x以及请求对应的LoRA ID(我们称之为异构用户请求批次)。任务信息允许TGI选择正确的LoRA适配器来使用。

Multi-LoRA服务使您只需部署一次基础模型。由于LoRA适配器很小,您可以加载许多适配器。请注意,确切的数量将取决于您可用的GPU资源以及您部署的模型。最终,这相当于在一个部署中拥有多个微调模型。

LoRA(适配器权重)可以根据秩和量化而变化,但它们通常非常微小。让我们快速直观地了解这些适配器有多小:predibase/magicoder是13.6MB,小于mistralai/Mistral-7B-v0.1(14.48GB)的1/1000。相对而言,将30个适配器加载到RAM中只会使VRAM增加3%。最终,这对大多数部署来说都不是问题。因此,我们可以为许多模型提供一个部署。

如何使用

收集LoRA

首先,您需要训练您的LoRA模型并导出适配器。您可以在此处找到关于微调LoRA适配器的指南。请注意,当您将微调模型推送到Hub时,您只需推送适配器,而无需推送完整的合并模型。当从Hub加载LoRA适配器时,基础模型会从适配器模型卡中推断出来并单独加载。如需更深入的支持,请查看我们的专家支持计划。当您为特定用例创建自己的LoRA时,才会体现出真正的价值。

低代码团队

对于一些组织来说,为每个用例训练一个LoRA可能很困难,因为他们可能缺乏专业知识或其他资源。即使您选择了基础模型并准备好数据,您仍需要跟上最新技术、探索超参数、寻找最佳硬件资源、编写代码,然后进行评估。这可能是一项艰巨的任务,即使对于经验丰富的团队也是如此。

AutoTrain可以显著降低这一准入门槛。AutoTrain是一个无代码解决方案,只需点击几下即可训练机器学习模型。AutoTrain有多种使用方式。除了本地/内部部署,我们还有

AutoTrain 环境 硬件详情 代码要求 备注
Hugging Face Space 多种 GPU 和硬件 无需代码 灵活且易于分享
DGX 云 最多 8 个 H100 GPU 无需代码 更适合大型模型
Google Colab 可访问 T4 GPU 低代码 适用于小负载和量化模型

部署

在我们的示例中,我们将使用 Predibase 的 LoRA Land 中两个出色的适配器。

TGI

关于如何部署TGI,已经有很多很好的信息。像往常一样部署,但请确保您:

  1. 使用版本等于或高于v2.1.1的TGI
  2. 部署您的基础模型:mistralai/Mistral-7B-v0.1
  3. 部署时添加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

推理端点图形用户界面

推理端点允许您通过几次点击即可在AWS、GCP和Azure上的多种GPU和替代硬件类型上部署任何Hugging Face模型!在GUI中,部署非常简单。在底层,我们默认使用TGI进行文本生成(尽管您可以选择使用任何您喜欢的镜像)。

要在推理端点上使用Multi-LoRA服务,您只需访问您的仪表板,然后

  1. 选择您的基础模型:mistralai/Mistral-7B-v0.1
  2. 选择您的 | 区域 | 硬件
    • 我将使用 AWS | us-east-1 | Nvidia L4
  3. 选择高级配置
    • 您应该看到已选择 文本生成
    • 您可以根据需要进行配置
  4. 在环境变量中添加 LORA_ADAPTERS=predibase/customer_support,predibase/magicoder
  5. 最后 创建端点

请注意,这是最低要求,但您应该根据需要配置其他设置。

multi-lora-inference-endpoints
图3:Multi-LoRA推理端点
multi-lora-inference-endpoints
图4:Multi-LoRA推理端点2

推理端点代码

也许你们中有些人有恐鼠症,不想使用鼠标,我们不予评判。通过代码自动化操作,只使用键盘即可轻松实现。

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 Issue

使用

当您使用端点时,您需要指定您的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"
  }
}'

或者,这是一个使用来自出色的Hugging Face Hub Python库中的InferenceClient的示例。请确保您使用的是huggingface-hub>=0.24.0,并且在必要时已登录

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',
)

实际考量

成本

我们并非第一个攀登这座高峰的,正如下文所述。LoRAX的团队Predibase有一篇出色的文章。请务必查看,因为本节是基于他们的工作。

multi-lora-cost
图5:Multi-LoRA成本 对于TGI,我将mistralai/Mistral-7B-v0.1作为基础模型部署在nvidia-l4上,其在推理端点上的成本为0.8美元/小时。我能够获得75请求/秒,平均输入token为450,输出token为234,并根据GPT3.5 Turbo进行了相应调整。

Multi-LoRA服务的一大优势是**您无需为多个模型进行多次部署**,最终这会大大降低成本。这应该符合您的直觉,因为多个模型将需要所有权重,而不仅仅是小的适配器层。如您在*图5*中所见,即使我们使用TGI Multi-LoRA添加了更多模型,每个token的成本也相同。对于TGI专用部署,成本会随着每个微调模型需要新部署而增加。

使用模式

multi-lora-serving-pattern
图6:Multi-LoRA服务模式

当您部署多个模型时,一个实际挑战是您的使用模式会存在很大的差异。有些模型使用率可能很低;有些可能出现突发性使用,有些则可能使用频率很高。这使得扩展变得非常困难,特别是当每个模型都独立时。当您不得不添加另一个GPU时,会出现很多“四舍五入”错误,而且很快就会累积起来。在理想世界中,您会最大限度地利用每个GPU的利用率,而不使用任何额外的GPU。您需要确保拥有足够的GPU,同时知道有些GPU会闲置,这可能非常繁琐。

当我们通过Multi-LoRA进行整合时,我们获得了更稳定的使用。我们可以在图6中看到这一点,即使Multi-LoRA服务模式包含更不稳定的模式,它也相当稳定。通过整合模型,您可以实现更平滑的使用和更易于管理的扩展。请注意,这些只是示意性模式,请仔细思考您自己的模式以及Multi-LoRA如何提供帮助。部署1个模型,而不是30个!

更改基础模型

在AI飞速发展的现实世界中会发生什么?如果您想选择不同的/更新的模型作为您的基础模型怎么办?虽然我们的示例使用mistralai/Mistral-7B-v0.1作为基础模型,但还有其他基础模型,例如Mistral的v0.3,它支持函数调用,以及完全不同的模型家族,例如Llama 3。总的来说,我们预计会不断推出更高效、性能更好的新基础模型。

但请放心!如果您有*充分的理由*更新您的基础模型,重新训练 LoRA 也很容易。训练成本相对较低;事实上,Predibase 发现每个模型的训练成本仅约为 8.00 美元。使用现代框架和通用工程实践,代码更改量也微乎其微。

  • 保留用于训练模型的笔记本/代码
  • 版本控制您的数据集
  • 跟踪使用的配置
  • 使用新模型/设置进行更新

结论

Multi-LoRA服务代表了一种AI模型部署的变革性方法,为管理多个专业化模型所带来的成本和复杂性障碍提供了解决方案。通过利用单一基础模型并动态应用微调适配器,组织可以显著降低运营开销,同时在各种任务中保持甚至增强性能。**AI总监们,我们要求你们大胆,选择一个基础模型,并拥抱Multi-LoRA范式,**其简洁性和成本节约将带来丰厚的回报。让Multi-LoRA成为您AI战略的基石,确保您的组织在快速发展的技术领域保持领先。

致谢

实现Multi-LoRA服务可能非常棘手,但由于punica-ailorax团队的出色工作,已经开发出了优化内核和框架,使这一过程更加高效。TGI利用这些优化,为多个LoRA模型提供快速高效的推理。

特别感谢 Punica、LoRAX 和 S-LoRA 团队在 Multi-LoRA 服务方面所做的出色和开放的工作。

参考文献

社区

注册登录 发表评论