我们都知道,使用LoRA适配器可以定制大型语言模型(LLM)。并且适配器必须加载在在LLM之上,对于某些应用程序,为用户提供多个适配器可能很有用。例如,一个适配器可以执行函数调用,而另一个适配器可以执行非常不同的任务,例如分类、翻译或其他语言生成任务。
但是要使用多个适配器,标准推理框架必须首先卸载当前适配器,然后加载新适配器。这个卸载/加载序列可能需要几秒钟,这会降低用户体验。
有一些开源框架可以同时为多个适配器提供服务,而使用两个不同适配器之间没有明显的时间间隔。例如,vLLM 可以轻松地同时运行和服务多个LoRA适配器。
在本文中,我们将看到如何将vLLM与多个LoRA适配器一起使用。我将解释如何将LoRA适配器与离线推理一起使用,以及如何为用户提供多个适配器以进行在线推理。
使用vLLM的多个LoRA适配器的离线推理
我们首先选择2个非常不同的适配器:
- 一个在timdettmers/openassistant-guanaco上进行微调的聊天适配器。
- 一个在Salesforce/xlam-function-calling-60k上对函数调用进行了微调的适配器。
对于离线推理,即在不启动服务器的情况下,首先需要加载模型Llama 38b,并向vLLM表明我们将使用LoRA。同时还将max_lora_rank设置为16,因为我要加载的所有适配器的rank都是16。
然后创建两个“LoRARequest”,它们是包含适配器的对象,对于每个LoRA适配器还将定义不同的采样参数。例如,对于聊天适配器,建议使用高温采样,以使模型的答案多样化和创造性。对于函数调用适配器,建议取消激活采样以获得最可能的输出,因为我们在这里不需要模型具有创造性。
vLLM不能直接从Hugging Face获得适配器。所以我们必须下载并存储在本地。
聊天适配器:
函数调用适配器
LoRARequest的ID和名称不能重复。这样我们可以同时使用这两个适配器。
聊天适配器调用如下:
将“lora_request=oasstLR”传递给llm生成结果如下:
第一个答案是近似的,太啰嗦了。第二个答案接近正确,但很明显,我们需要调用函数才能得到准确的结果。用函数调用适配器运行了相同的提示:
结果如下:
我们可以调用这些看似合理的函数来准确地回答提示。
这两同时使用适配器时,延迟没有任何增加。vLLM非常有效地在两个适配器之间切换。
使用vLLM创建多适配器服务
我们首先要确保下载了完整的适配器。
然后,使用以下两个适配器启动vLLM服务器:
我将适配器命名为“oasst”和“xlam”。我们将使用这些名称查询适配器。
为了查询服务器,我使用OpenAI的API框架,这可以完全兼容vllm的服务。
现在我们有了一个Llama 3服务器,有两个适配器可用。并且我们通过这种方法可以加载任意数量的适配器。我尝试使用多达5个适配器,没有任何延迟增加。
总结
使用LoRA适配器,可以将LLM专门化用于特定的任务或域。这些适配器需要加载在LLM之上进行推理。vLLM可以同时为多个适配器提供服务,而不会出现明显的延迟,从而允许无缝使用多个LoRA适配器。
最后需要注意的是,如果你在使用bitsandbytes(即使用QLoRA)量化的模型之上对适配器进行微调,则在启动vLLM时需要使用bitsandbytes量化模型。理论上,vLLM在量化模型之上支持bitsandbytes和加载适配器。但是这种支持是最近才添加的,并没有完全优化或应用于vLLM支持的所有模型,所以具体受否可以用还需要实际测试。