S-LoRA: Serving thousands of concurrent LoRA Adapters
这是斯坦福和UC Berkeley合作的论文(没错,又有大佬Ion Stoica),影响力非常广。主要设计了一种新的方案在一个GPU上同时支持多个lora adapters的并行执行。
摘要
"pretain-then-finetune"通常用于部署LLMs。Low Rank Adaption(LoRA)是一种参数高效的finetuning方法,经常用于将base model适应到多种任务中,从而产生大量从单一base model派生的LoRA adapters。我们观察到,这种范式在服务期间的batch inference中呈现出重大机遇。为了利用这些机会,我们提出了S-LoRA,一个为可扩展服务许多LoRA adapters而设计的系统。S-LoRA将所有adapters存储在main memory中,并将当前运行查询所使用的adapter提取到GPU memory中。为了有效使用GPU memory并减少碎片化,S-LoRA提出了Unified Paging。Unified Paging使用统一的memory pool来管理具有不同rank的动态adapters权重和具有不同序列长度的KV cache tensors。此外,S-LoRA采用了一种新颖的张量并行策略和高度优化的自定义CUDA内核,用于LoRA计算的异构批处理。总的来说,这些特性使S-LoRA能够在单个GPU或跨多个GPU上以很小的开销服务数千个LoRA adapters。与诸如HuggingFace PEFT和vLLM(具有对LoRA服务的简单支持)等最先进的库相比,S-LoRA可以将吞吐量提高多达4倍,并将服务的适配器数量增加几个数量级。因此,S-LoRA能够可扩展地服务许多特定任务的微调模型,并为大规模定制微调服务提供潜力。代码开源在https://github.com/S-LoRA/S-LoRA。
Contributions:
- Unified Paging:为了减少显存碎片和增加batch size,S-LoRA 引入了一个统一内存池。这个内存池通过一个统一页机制管理动态adapters的权重和KV cache tensors。
- Heterogenous Batching: 为了最小化latency的overhead,当batching不同rank的adapters时,S-LoRA 实现了高度优化的定制化CUDA kernels。这些kernels直接在非连续内存上运行,并与内存池设计保持一致,有助于 LoRA 的高效批量推理。
- S-LoRA TP:为了确保跨多个 GPU 的有效并行化,S-LoRA 引入了一种新颖的张量并行策略。 与基本模型相比,这种方法所增加的 LoRA 计算的通信成本最低。 这是通过在小的中间张量上调度通信并将大的中间张量与基本模型的通信融合来实现的。
2. Background
Low rank adapter(LoRA)(Hu et al., 2021)是一种高效的参数微调方法,旨在将预训练的LLMs适应到新任务中。LoRA背后的动机来自于在适应过程中模型更新的低内在维度。在训练阶段,LoRA冻结了预训练基础模型的权重,并在每一层添加了可训练的低秩矩阵。这种方法显著减少了可训练参数的数量和内存消耗。与全参数微调相比,LoRA通常可以将可训练参数的数量减少几个数量级(例如,10000倍),同时保持可比的准确性。对于推理阶段,原始论文建议将低秩矩阵与基础模型的权重合并。因此,在推理期间没有增加额外的开销