使用 LoRA 适配器#
本文档展示了如何在基础模型之上使用 LoRA 适配器 与 vLLM。
LoRA 适配器可以与任何实现 SupportsLoRA
的 vLLM 模型一起使用。
适配器可以在请求的基础上高效地提供服务,且开销最小。首先,我们下载适配器并将其保存在本地,使用
from huggingface_hub import snapshot_download
sql_lora_path = snapshot_download(repo_id="yard1/llama-2-7b-sql-lora-test")
然后,我们实例化基础模型并传入 enable_lora=True
标志:
from vllm import LLM, SamplingParams
from vllm.lora.request import LoRARequest
llm = LLM(model="meta-llama/Llama-2-7b-hf", enable_lora=True)
现在,我们可以提交提示并使用 lora_request
参数调用 llm.generate
。LoRARequest
的第一个参数是人类可识别的名称,第二个参数是适配器的全局唯一 ID,第三个参数是 LoRA 适配器的路径。
sampling_params = SamplingParams(
temperature=0,
max_tokens=256,
stop=["[/assistant]"]
)
prompts = [
"[user] Write a SQL query to answer the question based on the table schema.\n\n context: CREATE TABLE table_name_74 (icao VARCHAR, airport VARCHAR)\n\n question: Name the ICAO for lilongwe international airport [/user] [assistant]",
"[user] Write a SQL query to answer the question based on the table schema.\n\n context: CREATE TABLE table_name_11 (nationality VARCHAR, elector VARCHAR)\n\n question: When Anchero Pantaleone was the elector what is under nationality? [/user] [assistant]",
]
outputs = llm.generate(
prompts,
sampling_params,
lora_request=LoRARequest("sql_adapter", 1, sql_lora_path)
)
查看 examples/multilora_inference.py,了解如何使用 LoRA 适配器与异步引擎以及如何使用更高级的配置选项的示例。
提供 LoRA 适配器#
LoRA 适配模型也可以使用与 Open-AI 兼容的 vLLM 服务器提供服务。为此,我们在启动服务器时使用 --lora-modules {name}={path} {name}={path}
来指定每个 LoRA 模块:
vllm serve meta-llama/Llama-2-7b-hf \
--enable-lora \
--lora-modules sql-lora=$HOME/.cache/huggingface/hub/models--yard1--llama-2-7b-sql-lora-test/snapshots/0dfa347e8877a4d4ed19ee56c140fa518470028c/
备注
提交 ID 0dfa347e8877a4d4ed19ee56c140fa518470028c 可能会随着时间的推移而改变。请检查您环境中的最新提交 ID,以确保您使用的是正确的 ID。
服务器入口点接受所有其他 LoRA 配置参数(max_loras
、max_lora_rank
、max_cpu_loras
等),这些参数将应用于所有即将到来的请求。查询 /models
端点后,我们应该看到我们的 LoRA 及其基础模型:
curl localhost:8000/v1/models | jq .
{
"object": "list",
"data": [
{
"id": "meta-llama/Llama-2-7b-hf",
"object": "model",
...
},
{
"id": "sql-lora",
"object": "model",
...
}
]
}
请求可以指定 LoRA 适配器,就像它是任何其他模型一样,通过 model
请求参数。请求将根据服务器范围的 LoRA 配置进行处理(即与基础模型请求并行,以及可能的其他 LoRA 适配器请求,如果它们被提供并且 max_loras
设置得足够高)。
以下是一个示例请求
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "sql-lora",
"prompt": "San Francisco is a",
"max_tokens": 7,
"temperature": 0
}' | jq
动态提供 LoRA 适配器#
除了在服务器启动时加载 LoRA 适配器外,vLLM 服务器现在还支持通过专用 API 端点在运行时动态加载和卸载 LoRA 适配器。当需要灵活地即时更改模型时,此功能特别有用。
注意:在生产环境中启用此功能存在风险,因为用户可能会参与模型适配器管理。
要启用动态 LoRA 加载和卸载,请确保环境变量 VLLM_ALLOW_RUNTIME_LORA_UPDATING 设置为 True。启用此选项后,API 服务器将记录警告以指示动态加载处于活动状态。
export VLLM_ALLOW_RUNTIME_LORA_UPDATING=True
加载 LoRA 适配器:
要动态加载 LoRA 适配器,请向 /v1/load_lora_adapter 端点发送 POST 请求,并提供要加载的适配器的必要详细信息。请求有效负载应包含 LoRA 适配器的名称和路径。
加载 LoRA 适配器的示例请求:
curl -X POST http://localhost:8000/v1/load_lora_adapter \
-H "Content-Type: application/json" \
-d '{
"lora_name": "sql_adapter",
"lora_path": "/path/to/sql-lora-adapter"
}'
请求成功后,API 将返回 200 OK 状态代码。如果发生错误,例如找不到或无法加载适配器,则将返回相应的错误消息。
卸载 LoRA 适配器:
要卸载先前加载的 LoRA 适配器,请向 /v1/unload_lora_adapter 端点发送 POST 请求,并提供要卸载的适配器的名称或 ID。
卸载 LoRA 适配器的示例请求:
curl -X POST http://localhost:8000/v1/unload_lora_adapter \
-H "Content-Type: application/json" \
-d '{
"lora_name": "sql_adapter"
}'