PEFT documentation
权重分解的低秩适应(DoRA)
权重分解的低秩适应(DoRA)
这是 LoRA 的一种变体,因此,除非本页另有说明,LoRA 支持的所有功能在此方法中均适用。
该技术将权重的更新分解为两部分:幅度和方向。方向由标准 LoRA 处理,而幅度则由一个独立的可学习参数处理。这可以提升 LoRA 的性能,尤其是在低秩情况下。有关 DoRA 的更多信息,请参阅 https://huggingface.co/papers/2402.09353。
from peft import LoraConfig
config = LoraConfig(use_dora=True, ...)如果模型或 DoRA 适配器的部分被卸载到 CPU,您可以在 config.runtime_config 中使用 ephemeral_gpu_offload=True,以少量临时(ephemeral)VRAM 开销为代价获得显著的速度提升。
from peft import LoraConfig, LoraRuntimeConfig
config = LoraConfig(use_dora=True, runtime_config=LoraRuntimeConfig(ephemeral_gpu_offload=True), ...)带有 DoRA 适配器的 PeftModel 也可以通过 from_pretrained 方法和 load_adapter 方法,使用 ephemeral_gpu_offload=True 标志进行加载。
from peft import PeftModel
model = PeftModel.from_pretrained(base_model, peft_model_id, ephemeral_gpu_offload=True)优化
DoRA 针对处于评估模式的模型,或 dropout 设置为 0 的情况进行了优化(计算速度更快,占用内存更少)。在这些情况下,我们复用基础结果以获得加速。在 4090 上,将梯度累积设置为 2,最大步数设置为 20,运行 dora finetuning 命令 CUDA_VISIBLE_DEVICES=0 ZE_AFFINITY_MASK=0 time python examples/dora_finetuning/dora_finetuning.py --quantize --lora_dropout 0 --batch_size 16 --eval_step 2 --use_dora 后,观察到以下结果:
| 无优化 | 使用优化 | |
|---|---|---|
| 训练运行时间(秒) | 359.7298 | 279.2676 |
| 每秒训练样本数 | 1.779 | 2.292 |
| 每秒训练步数 | 0.056 | 0.072 |
此外,通过使用 DoraCaching 辅助上下文,可以进一步提升 DoRA 的运行时性能。这要求模型处于 eval 模式:
from peft.helpers import DoraCaching
model.eval()
with DoraCaching():
output = model(inputs)对于 meta-llama/Llama-3.1-8B,DoRA 缓存基准测试脚本显示,与 LoRA 相比:
- 不使用缓存的 DoRA 需要多 139% 的时间
- 不使用缓存的 DoRA 需要多 4% 的内存
- 启用缓存的 DoRA 需要多 17% 的时间
- 启用缓存的 DoRA 需要多 41% 的内存
因此,缓存可以显著加快 DoRA 的推理速度,但同时也需要更多的内存。理想情况下,如果用例允许,最好直接合并 DoRA 适配器,以避免内存和运行时开销。
注意事项
- 目前,DoRA 仅支持 embedding、linear 和 Conv2d 层。
- DoRA introduces a bigger overhead than pure LoRA, so it is recommended to merge weights for inference, see LoraModel.merge_and_unload().
- DoRA 应支持与使用 bitsandbytes 量化的权重(“QDoRA”)。但在使用 QDoRA 配合 DeepSpeed Zero2 时,已有问题报告。