LoRAX(LoRA eXchange)是一个框架,允许用户在单个GPU上提供数千个微调模型,大大降低了服务成本,同时不影响吞吐量或延迟。
📖 目录
🌳 特性
- 🚅 动态适配器加载: 在您的请求中包括来自HuggingFace、Predibase或任何文件系统的任何微调LoRA适配器,它将即时加载而不会阻塞并发请求。每次请求合并适配器,即时创建强大的集成。
- 🏋️♀️ 异构连续批处理: 将不同适配器的请求打包到同一个批次中,保持延迟和吞吐量在并发适配器数量几乎不变。
- 🧁 适配器交换调度: 异步预取和卸载适配器在GPU和CPU内存之间,调度请求批次以优化系统的整体吞吐量。
- 👬 优化推理: 高吞吐量和低延迟优化包括张量并行、预编译CUDA内核(闪注意力,分页注意力,SGMV),量化,令牌流。
- 🚢 准备生产使用: 预构建的Docker镜像,Kubernetes的Helm图表,Prometheus指标和Open Telemetry分布式追踪。OpenAI兼容API支持多回合对话。通过每次请求租户隔离的私有适配器。结构化输出(JSON模式)。
- 🤯 免费商用: Apache 2.0许可证。说够了😎。
🏠 模型
使用LoRAX提供微调模型包括两个组件:
LoRAX支持多种大型语言模型作为基础模型,包括Llama(包括CodeLlama),Mistral(包括Zephyr)和Qwen。请参阅支持的体系结构以获取完整的支持基础模型列表。
基础模型可以在fp16中加载或使用bitsandbytes
,GPT-Q或AWQ量化。
支持的适配器包括使用PEFT和Ludwig库训练的LoRA适配器。模型中的任何线性层都可以通过LoRA进行适配并加载到LoRAX中。
🏃♂️ 快速开始
我们建议从预构建的Docker镜像开始,以避免编译自定义CUDA内核和其他依赖项。
要求
运行LoRAX的最低系统要求包括:
- Nvidia GPU(Ampere一代或以上)
- 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提示
提示基础LLM:
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'
有关详细信息,请参阅参考 - REST API。
通过Python客户端提示
安装:
pip install lorax-client
运行:
from lorax import Client
client = Client("http://127.0.0.1:8080")
# 提示基础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)
# 提示LoRA适配器
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)
有关详细信息,请参阅参考 - Python客户端。
有关其他运行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兼容API。
下一步
这里是一些有趣的Mistral-7B微调模型可以尝试:
- alignment-handbook/zephyr-7b-dpo-lora: 使用DPO在Zephyr-7B数据集上微调的Mistral-7b模型。
- IlyaGusev/saiga_mistral_7b_lora: 基于
Open-Orca/Mistral-7B-OpenOrca
的俄语聊天机器人。 - Undi95/Mistral-7B-roleplay_alpaca-lora: 使用角色扮演提示进行微调。
您可以在这里找到更多LoRA适配器,或使用PEFT或Ludwig尝试自己进行微调。
🙇 致谢
LoRAX构建在HuggingFace的text-generation-inference之上,分叉自v0.9.4(Apache 2.0)。
我们还想感谢Punica在SGMV内核上的工作,该内核用于在重负载下加速多适配器推理。
🗺️ 路线图
我们的路线图跟踪这里。