LoRAX
可扩展至数千个微调LLM的多LoRA推理服务器
📖 什么是LoRAX?
LoRAX(LoRA 交换)是一个框架,允许用户在单个GPU上部署数千个微调模型,在不影响吞吐量或延迟的情况下显著降低服务成本。
🌳 功能特性
- 🚅 动态适配器加载: 在您的请求中包含来自HuggingFace、Predibase或任何文件系统的任何微调LoRA适配器,它们将被即时加载而不会阻塞并发请求。合并适配器按需即时创建强大的组合模型。
- 🏋️♀️ 异构连续批处理: 将不同适配器的请求打包到同一批次中,使延迟和吞吐量几乎不随并发适配器数量变化。
- 🧁 适配器交换调度: 异步预取适配器并在GPU和CPU内存之间卸载,调度请求批处理以优化系统的总吞吐量。
- 👬 优化推理: 高吞吐量和低延迟优化,包括张量并行、预编译CUDA内核(flash-attention、paged attention、SGMV)、量化、令牌流式处理。
- 🚢 生产就绪 预构建的Docker镜像、Kubernetes的Helm图表、Prometheus指标监控,以及通过Open Telemetry实现的分布式追踪。兼容OpenAI的API,支持多轮聊天对话。通过按请求租户隔离实现私有适配器。结构化输出(JSON模式)。
- 🤯 可免费商用: Apache 2.0许可证。无需多言 😎。
🏠 模型
使用LoRAX提供微调模型包含两个组件:
- Base Model: 所有适配器共享的预训练大型模型。
- Adapter: 针对特定任务的适配器权重,按请求动态加载。
LoRAX支持多种大型语言模型作为基础模型,包括Llama(含CodeLlama)、Mistral(含Zephyr)和Qwen。完整支持的基础模型列表请参阅Supported Architectures。
基础模型可以以fp16格式加载,或者使用bitsandbytes、GPT-Q或AWQ进行量化。
支持的适配器包括使用PEFT和Ludwig库训练的LoRA适配器。模型中的任何线性层都可以通过LoRA进行适配,并在LoRAX中加载。
🏃♂️ 快速开始
我们建议从我们预构建的Docker镜像开始,以避免编译自定义CUDA内核和其他依赖项。
要求
运行LoRAX的最低系统需求包括:
- Nvidia GPU(安培架构或更高版本)
- 兼容CUDA 11.8及更高版本的设备驱动程序
- Linux 操作系统
- Docker (本指南使用)
启动LoRAX服务器
model=mistralai/Mistral-7B-Instruct-v0.1
volume=$PWD/data
docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data \
ghcr.io/predibase/lorax:main --model-id $model
如需完整教程(包括令牌流和Python客户端),请参阅入门指南 - Docker版。
通过REST API提示
基于提示词的大语言模型:
curl 127.0.0.1:8080/generate \
-X POST \
-d '{"inputs": "[INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST]", "parameters": {"max_new_tokens": 64}}' \
-H 'Content-Type: application/json'
提示一个LoRA适配器:
curl 127.0.0.1:8080/generate \
-X POST \
-d '{"inputs": "[INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST]", "parameters": {"max_new_tokens": 64, "adapter_id": "vineetsharma/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k"}}' \
-H 'Content-Type: application/json'
查看Reference - REST API获取完整详情。
通过Python客户端提示
安装:
pip install lorax-client
运行:
from lorax import Client
client = Client("http://127.0.0.1:8080")
# Prompt the base LLM
prompt = "[INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST]"
print(client.generate(prompt, max_new_tokens=64).generated_text)
# Prompt a LoRA adapter
adapter_id = "vineetsharma/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k"
print(client.generate(prompt, max_new_tokens=64, adapter_id=adapter_id).generated_text)
查看Reference - Python Client获取完整详情。
如需了解运行LoRAX的其他方式,请参阅入门指南 - Kubernetes、入门指南 - SkyPilot和入门指南 - 本地部署。
通过OpenAI API进行聊天
LoRAX支持通过兼容OpenAI的API实现多轮聊天对话与动态适配器加载功能。只需将任意适配器指定为model参数即可。
from openai import OpenAI
client = OpenAI(
api_key="EMPTY",
base_url="http://127.0.0.1:8080/v1",
)
resp = client.chat.completions.create(
model="alignment-handbook/zephyr-7b-dpo-lora",
messages=[
{
"role": "system",
"content": "You are a friendly chatbot who always responds in the style of a pirate",
},
{"role": "user", "content": "How many helicopters can a human eat in one sitting?"},
],
max_tokens=100,
)
print("Response:", resp.choices[0].message.content)
详情请参阅OpenAI Compatible API。
🙇 致谢
LoRAX 基于 HuggingFace 的 text-generation-inference 构建,从 v0.9.4 版本(Apache 2.0 许可)分叉而来。
我们还要感谢Punica在SGMV内核方面的工作,该内核用于在重负载下加速多适配器推理。
🗺️ 路线图
我们的路线图跟踪在这里。