本文涉及到的详细测试代码和测试步骤放置于:
https://github.com/davidsajare/david-share.git
下的:Deep-Learning/Multi-LoRA-adapter。本文不再重复放置大量代码。
一、多适LoRA适配器调用的意义
在现代自然语言处理(NLP)任务中,大型语言模型(LLM)如GPT-3、Llama等展现了强大的能力。然而,为了进一步提升这些模型在特定任务或领域的表现,我们通常需要对模型进行微调。LoRA(Low-Rank Adaptation)适配器是一种高效的微调方法,通过调整少量参数来优化模型性能。本文将介绍如何利用vLLM框架实现多LoRA适配器的统一管理和调用,并探讨其原理、方法、实现及优势。
LoRA适配器通过低秩矩阵分解技术对预训练模型进行微调,而无需调整模型的全部参数。这种方法显著减少了微调所需的计算资源和时间。多个LoRA适配器可以分别针对不同任务进行微调,并在推理过程中动态切换,以优化模型在多任务环境中的表现。
outputs = llm.generate(prompts_oasst, sampling_params_oasst, lora_request=oasstLR)
使用LoRA适配器的优势
资源效率:
LoRA适配器通过微调少量参数,显著减少了微调所需的计算资源和时间。相比之下,RAG可能需要维护和查询一个大型的外部知识库,可能会增加系统复杂性和资源需求。
响应速度:
由于LoRA适配器是直接加载到模型中的,推理速度通常更快。而RAG需要进行检索和生成两个步骤,可能会增加一些延迟,特别是在实时应用中。
离线应用:
LoRA适配器可以完全离线运行,不需要依赖外部知识库,这在某些网络受限或数据安全要求高的场景中非常有用。
特定任务优化:
LoRA适配器可以非常精细地针对特定任务或数据进行优化,提升模型在这些任务上的性能。例如,通过微调适配器,可以使模型在特定类型的问题上表现得更好。
二、多LoRA适配器的内存效率
参数高效微调:
LoRA适配器通过低秩矩阵分解技术,只对预训练模型的部分参数进行微调,而不是对整个模型进行完整的微调。这种方式显著减少了需要存储和更新的参数数量,从而减少了内存占用。
共享基础模型:
多个LoRA适配器可以共享同一个基础模型的参数。基础模型的参数只需要加载一次,而每个适配器只需额外存储少量的微调参数。这种共享机制大幅减少了内存重复使用的问题。
动态加载和卸载:
虽然vLLM框架支持同时加载多个适配器,但它通过高效的内存管理机制,确保这些适配器在内存中的占用最小化。适配器的参数只有在需要时才会被激活和使用,而不需要时可以保持在较低内存占用状态。
三、多Adapter切换与RAG方案相比的优劣势
使用RAG的优势
动态信息更新:
RAG可以实时访问和使用最新的信息,适用于需要经常更新数据的场景。例如,产品信息、新闻等。这种动态性在需要处理实时数据的应用中非常重要。
丰富的知识库:
RAG可以利用大型外部知识库,提供更广泛和详细的信息。对于一些需要大量背景知识或长尾信息的问题,RAG可能会更有效。
灵活性:
RAG方法可以灵活地整合不同的信息源,例如文档、数据库、API等,提供多样化的信息支持。
在实际应用中,选择使用LoRA适配器还是RAG方法,取决于具体的应用需求和环境:
如果你的应用需要高效、快速的响应,且可以通过微调模型来显著提升特定任务的性能,LoRA适配器可能更合适。
如果你的应用需要实时访问和使用最新的外部信息,或者需要处理大量背景知识,RAG方法可能更适合。
当然,这两种方法也可以结合使用。例如,可以使用LoRA适配器来提升模型在特定任务上的基础性能,同时使用RAG来补充和扩展模型的知识库,从而达到最佳效果。
如果是边缘小模型,建议使用多Adapter的方法。微调出适应不同场景的小模型,然后根据任务进行不同调用。prompts_oasst = [
"### Human: Check if the numbers 8 and 1233 are powers of two.### Assistant:",
"### Human: What is the division result of 75 divided by 1555?### Assistant:",
]
outputs = llm.generate(prompts_oasst, sampling_params_oasst, lora_request=oasstLR)
for output in outputs:
generated_text = output.outputs[0].text
print(generated_text)
print('------')