十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

vLLM 怎么在离线推理中为单次请求挂载不同 LoRA 适配器

vLLM 怎么在离线推理中为单次请求挂载不同 LoRA 适配器 vLLM 怎么在离线推理中为单次请求挂载不同 LoRA 适配器【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm在离线推理场景下你经常需要在一个基座模型上混合处理多路请求有的请求要挂 SQL 生成适配器有的要挂另一路微调适配器还有的走裸基座模型。vLLM 的离线入口LLM类支持这种用法初始化引擎时打开enable_loraTrue再在LLM.generate()里通过lora_request参数按请求粒度指定适配器——lora_request既可以是单个LoRARequest作用于全部 prompt也可以是一个与prompts等长的列表逐个 prompt 挂载不同的适配器见 LoRA 文档 与 离线推理文档。前提条件基座模型实现了 SupportsLoRA 接口即支持 LoRA每个 LoRA 适配器已下载或可下载到本地例如 Hugging Face Hub 仓库或本地目录。LoRARequest一条请求如何绑定一个适配器LoRARequest的三个构造参数决定了请求与适配器的绑定关系定义在 vllm/lora/request.pyfrom vllm.lora.request import LoRARequest # 第一个参数人类可读的名称 # 第二个参数全局唯一的整数 ID同一引擎实例内不能重复 # 第三个参数LoRA 适配器的本地路径 LoRARequest(sql_adapter, 1, sql_lora_path)LLM.generate()的签名中lora_request的类型是Sequence[LoRARequest] | LoRARequest | None见 vllm/entrypoints/llm.py。内部实现会做一次校验如果传入的是列表其长度必须等于 prompt 数量否则直接报错如果传入单个LoRARequest会被复制到每一个请求传None的请求则走基座模型见 vllm/entrypoints/offline_utils.py。第一步下载适配器到本地文档给出的方式是先用huggingface_hub的snapshot_download把适配器拉到本地并把返回的本地路径传给LoRARequestfrom huggingface_hub import snapshot_download sql_lora_path snapshot_download(repo_idjeeejeee/llama32-3b-text2sql-spider)如果你有多个适配器为每个适配器各调用一次snapshot_download得到各自的本地路径。第二步初始化 LLM 并配置 LoRA 容量参数实例化基座模型时传入enable_loraTrue。与 LoRA 容量相关的参数控制显存分配官方示例 中的注释给出了各自的作用from vllm import LLM, SamplingParams from vllm.lora.request import LoRARequest llm LLM( modelmeta-llama/Llama-3.2-3B-Instruct, enable_loraTrue, max_loras2, # 同一 batch 中允许同时使用的 LoRA 数量上限 # 每个 LoRA 槽位需要独立的预分配张量值越大显存越高 max_lora_rank8, # 所有 LoRA 支持的最大 rank若已知各 LoRA rank 相同 # 应尽量设低以节省显存 max_cpu_loras2, # CPU 侧 LoRA 缓存的大小 )关于max_lora_rankLoRA 文档 的建议是设为你要使用的全部适配器中的最大 rank。例如适配器 rank 为 [16, 32, 64] 时用 64而不要盲目设 256过高会浪费显存并带来性能问题。max_loras还决定了并发行为当max_loras1时使用第二个适配器的请求会在第一个适配器的请求全部完成后才开始执行见 multilora_offline.py 示例说明。如果希望多路适配器真正并行需要把max_loras设得更高代价是更多预分配显存。第三步按请求传入 LoRARequest 列表调用 generateprompts是列表时lora_request传入等长的列表列表中的每一项可以是LoRARequest也可以是None与同下标的 prompt 一一对应sampling_params SamplingParams( temperature0, max_tokens128, ) # 示例中两条请求复用同一个已下载的适配器路径演示多 LoRA # 实际使用时把路径替换为你自己各适配器的本地路径 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], A robot may not injure a human being, ] outputs llm.generate( prompts, sampling_params, lora_request[ LoRARequest(sql-lora, 1, sql_lora_path), # 请求 1 挂 sql-lora LoRARequest(sql-lora2, 2, sql_lora_path), # 请求 2 挂 sql-lora2 ], )要点两个LoRARequest的第二个参数整数 ID必须全局唯一示例中分别是1和2某一路请求不需要 LoRA 时在该位置放None即可它会按基座模型处理如果所有 prompt 都走同一个适配器直接传单值的写法即可llm.generate(prompts, sampling_params, lora_requestLoRARequest(sql_adapter, 1, sql_lora_path))。验证结果LLM.generate()返回一个RequestOutput对象列表顺序与输入 prompt 相同见 LLM.generate 文档可以按下标取出各请求的生成内容for prompt, output in zip(prompts, outputs): print(output.outputs[0].text)判断是否挂载成功看返回内容是否符合对应适配器的行为例如挂 SQL 适配器的那路请求应输出 SQL 查询而不是基座模型的自由补全。另外注意lora_request列表长度不等于 prompt 数量、或 ID 冲突时vLLM 会在提交请求阶段直接抛出错误而不是静默忽略。异步引擎下的等价写法如果你的离线任务是流式、按需提交请求examples/features/lora/multilora_offline.py 展示了用LLMEngine的对应路径EngineArgs中同样配置enable_lora/max_loras/max_lora_rank/max_cpu_loras然后对每条请求调用engine.add_request( str(request_id), prompt, sampling_params, lora_requestlora_request )lora_request为None的条目走基座模型与同步 API 的语义一致。该示例头部注明访问meta-llama/Llama-3.2-3B-Instruct需要 HuggingFace 凭证若你的基座模型不同替换模型名并保证它支持 LoRA。限制与边界只有实现了SupportsLoRA的模型才能挂载 LoRAmax_loras控制的是同一 batch内并发使用的适配器数上限不是总共可加载的适配器总数CPU 缓存由max_cpu_loras控制max_lora_rank必须覆盖你要挂载的适配器的最大 rank否则适配器无法被正确加载执行本文只覆盖LLM.generate这条离线路径。服务端vllm serve下按请求指定适配器是通过请求里的model参数完成的属于另一条操作链参考 LoRA 文档 的 Serving LoRA Adapters 一节。【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表