PEFT documentation

权重分解的低秩适应(DoRA)

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

权重分解的低秩适应(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.7298279.2676
每秒训练样本数1.7792.292
每秒训练步数0.0560.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 时,已有问题报告。
Update on GitHub