PEFT documentation
重み分解低ランク適応(DoRA)
重み分解低ランク適応(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.7298 | 279.2676 |
| 1秒あたりの学習サンプル数 | 1.779 | 2.292 |
| 1秒あたりの学習ステップ数 | 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”)と組み合わせて動作するはずです。ただし、DeepSpeed Zero2とQDoRAを併用した際に問題が発生したという報告があります。