项目概述
Punica 是一个可以高效地运行多种低秩适应(LoRA)微调的大模型的系统。LoRA 是一种高效的参数方法,可以将新知识添加到预训练的大语言模型(LLM)中。尽管预训练的LLM需要数百GB的存储空间,但应用LoRA进行微调的模型仅增加约1%的存储和内存占用。Punica 在运行一个预训练模型的成本内,可以支持多个应用LoRA微调的模型。
工作原理
假设 W
是形状为 [H1, H2]
的预训练模型的权重矩阵,LoRA 添加了两个小矩阵 A
(形状为 [H1, r]
)和 B
(形状为 [r, H2]
)。当输入 x
传递至微调模型时,生成的输出 y
的计算方式为 y := x @ (W + A@B)
,即 y := x@W + x@A@B
。
如果存在 n
个LoRA模型,则相应地会有 A1
, B1
, A2
, B2
, ..., An
, Bn
等。对于输入批次 X := (x1,x2,...,xn)
,它映射到每一个LoRA模型,输出为 Y := X@W + (x1@A1@B1, x2@A2@B2, ..., xn@An@Bn)
。左侧的计算在预训练模型上进行,极为高效。由于批处理效应,其延迟几乎和处理单一输入时相同。
我们找到了一种高效计算右侧(即LoRA附加部分)的方法,并将这种运算封装在一个称为分段聚集矩阵-向量乘法(SGMV)的CUDA内核中。
性能表现
结果显示,预训练模型的强批处理效应非常明显。虽然普通实现的LoRA性能较为缓慢,但通过SGMV实现的LoRA显示出高效的性能表现,并保留了强批处理效应。
Punica 在文本生成过程中表现出色,其吞吐量较当前最先进的系统提高了12倍,包括 HuggingFace Transformers、DeepSpeed、FasterTransformer 和 vLLM 等。
安装指南
Punica 可以通过二进制包直接安装,也可以通过源代码自行编译。
通过二进制包安装
- 优点:无需编译,安装快速。
- 缺点:可能不符合用户的CUDA版本、CUDA架构、PyTorch版本或Python版本。
安装步骤
pip install ninja torch
pip install punica -i https://punica-ai.github.io/whl/cu121/ --extra-index-url https://pypi.org/simple
# 请根据您的CUDA版本修改cu121
通过源代码编译安装
安装步骤
# 请在安装punica前安装torch
pip install ninja numpy torch
# 克隆punica
git clone https://github.com/punica-ai/punica.git
cd punica
git submodule sync
git submodule update --init
# 若编译遇到问题,请将TORCH_CUDA_ARCH_LIST设置为您的CUDA架构。
# export TORCH_CUDA_ARCH_LIST="8.0"
# 编译并安装punica
pip install -v --no-build-isolation .
示例
多个LoRA模型服务
请参见上方提供的演示。
微调并转换为Punica格式及使用Punica提供服务
相关示例请参见examples/finetune/
。
文本生成性能测试
python -m benchmarks.bench_textgen_lora --system punica --batch-size 32
Punica 的设计目的是以最小的开销实现多个微调模型的高效运行,极大地提升了多租户环境下服务多种LLM的能力。