LoRA 适配器#

本文档向您展示如何在基础模型之上使用带有 vLLM 的 LoRA 适配器

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.generateLoRARequest 的第一个参数是人类可识别的名称,第二个参数是适配器的全局唯一 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/offline_inference/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_lorasmax_lora_rankmax_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",
            ...
        }
    ]
}

请求可以像指定任何其他模型一样通过 model 请求参数指定 LoRA 适配器。请求将根据服务器范围的 LoRA 配置进行处理(即,与基础模型请求并行处理,并且如果提供了其他 LoRA 适配器请求且 max_loras 设置得足够高,则也可能与其他 LoRA 适配器请求并行处理)。

以下是一个示例请求

curl https://127.0.0.1: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 https://127.0.0.1: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 https://127.0.0.1:8000/v1/unload_lora_adapter \
-H "Content-Type: application/json" \
-d '{
    "lora_name": "sql_adapter"
}'

--lora-modules 的新格式#

在之前的版本中,用户将通过以下格式提供 LoRA 模块,可以是键值对格式,也可以是 JSON 格式。例如

--lora-modules sql-lora=$HOME/.cache/huggingface/hub/models--yard1--llama-2-7b-sql-lora-test/snapshots/0dfa347e8877a4d4ed19ee56c140fa518470028c/

这仅包含每个 LoRA 模块的 namepath,但不提供指定 base_model_name 的方法。现在,您可以使用 JSON 格式指定 base_model_name 以及名称和路径。例如

--lora-modules '{"name": "sql-lora", "path": "/path/to/lora", "base_model_name": "meta-llama/Llama-2-7b"}'

为了提供向后兼容性支持,您仍然可以使用旧的键值格式(name=path),但在这种情况下,base_model_name 将保持未指定状态。

Lora 模型沿袭在模型卡中#

--lora-modules 的新格式主要是为了支持在模型卡中显示父模型信息。以下是对您当前响应如何支持此功能的解释

  • LoRA 模型 sql-loraparent 字段现在链接到其基础模型 meta-llama/Llama-2-7b-hf。这正确地反映了基础模型和 LoRA 适配器之间的层级关系。

  • root 字段指向 lora 适配器的工件位置。

$ curl https://127.0.0.1:8000/v1/models

{
    "object": "list",
    "data": [
        {
        "id": "meta-llama/Llama-2-7b-hf",
        "object": "model",
        "created": 1715644056,
        "owned_by": "vllm",
        "root": "~/.cache/huggingface/hub/models--meta-llama--Llama-2-7b-hf/snapshots/01c7f73d771dfac7d292323805ebc428287df4f9/",
        "parent": null,
        "permission": [
            {
            .....
            }
        ]
        },
        {
        "id": "sql-lora",
        "object": "model",
        "created": 1715644056,
        "owned_by": "vllm",
        "root": "~/.cache/huggingface/hub/models--yard1--llama-2-7b-sql-lora-test/snapshots/0dfa347e8877a4d4ed19ee56c140fa518470028c/",
        "parent": meta-llama/Llama-2-7b-hf,
        "permission": [
            {
            ....
            }
        ]
        }
    ]
}