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で可能なすべてのことがこの方法にも適用されます。

この手法は、重みの更新を大きさ(magnitude)と方向(direction)の2つの部分に分解します。方向は通常の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 を使用することで、一時的な(エフェメラルな)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に設定し、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でdora finetuningを実行したところ、以下の観察結果が得られました。

最適化なし最適化あり
学習実行時間(秒)359.7298279.2676
1秒あたりの学習サンプル数1.7792.292
1秒あたりの学習ステップ数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”)と組み合わせて動作するはずです。ただし、DeepSpeed Zero2とQDoRAを併用した際に問題が発生したという報告があります。
Update on GitHub