PEFT documentation
Ağırlık-Ayrıştırılmış Düşük-Rütbe Uyarlaması (DoRA)
Ağırlık-Ayrıştırılmış Düşük-Rütbe Uyarlaması (DoRA)
Bu, LoRA'nın bir varyantıdır ve bu nedenle LoRA ile yapılabilen her şey, aksi bu sayfada belirtilmedikçe bu yöntem için de geçerlidir.
Bu teknik, ağırlıkların güncellemelerini büyüklük ve yön olmak üzere iki parçaya ayırır. Yön, normal LoRA ile ele alınırken büyüklük, ayrı bir öğrenilebilir parametre ile ele alınır. Bu, özellikle düşük rütbeli durumlarda LoRA'nın performansını iyileştirebilir. DoRA hakkında daha fazla bilgi için https://huggingface.co/papers/2402.09353 adresine bakın.
from peft import LoraConfig
config = LoraConfig(use_dora=True, ...)Modelin veya DoRA adaptörünün bir kısmı CPU'ya aktarılıyorsa, config.runtime_config içinde ephemeral_gpu_offload=True kullanarak bazı geçici (ephemeral) VRAM maliyeti karşılığında önemli bir hızlanma elde edebilirsiniz.
from peft import LoraConfig, LoraRuntimeConfig
config = LoraConfig(use_dora=True, runtime_config=LoraRuntimeConfig(ephemeral_gpu_offload=True), ...)DoRA eklentisine sahip bir PeftModel, from_pretrained yöntemi ve load_adapter yöntemi kullanılarak ephemeral_gpu_offload=True bayrağı ile de yüklenebilir.
from peft import PeftModel
model = PeftModel.from_pretrained(base_model, peft_model_id, ephemeral_gpu_offload=True)Optimizasyon
DoRA, değerlendirme modundaki modeller için veya dropout 0'a ayarlandığında optimize edilmiştir (daha hızlı hesaplar ve daha az bellek kullanır). Bu durumlarda hızlanmayı elde etmek için temel sonucu yeniden kullanırız.
4090 üzerinde, gradyan birikimi 2 ve maksimum adım 20 olarak ayarlanarak dora finetuning çalıştırıldığında 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 aşağıdaki gözlemler elde edilmiştir:
| Optimizasyon Olmadan | Optimizasyon ile | |
|---|---|---|
| eğitim çalışma süresi (sn) | 359.7298 | 279.2676 |
| saniyedeki eğitim örnek sayısı | 1.779 | 2.292 |
| saniyedeki eğitim adımı | 0.056 | 0.072 |
Ayrıca, DoraCaching yardımcı bağlamı kullanılarak DoRA'nın çalışma zamanı performansı daha da artırılabilir. Bunun için modelin eval modunda olması gerekir:
from peft.helpers import DoraCaching
model.eval()
with DoraCaching():
output = model(inputs)meta-llama/Llama-3.1-8B için DoRA önbellekleme kriter betiği, LoRA ile karşılaştırıldığında şunu göstermektedir:
- Önbellekleme olmadan DoRA, %139 daha fazla zaman gerektirir
- Önbellekleme olmadan DoRA, %4 daha fazla bellek gerektirir
- Önbellekleme ile DoRA %17 daha fazla zaman gerektirir
- Önbellekleme ile DoRA, %41 daha fazla bellek gerektirir
Bu nedenle önbellekleme, DoRA ile çıkarımı önemli ölçüde hızlandırabilir ancak aynı zamanda çok daha fazla bellek gerektirir. İdeal olarak, kullanım senaryosu buna izin veriyorsa, hem bellek hem de çalışma zamanı yükünden kaçınmak için DoRA adaptörünü birleştirmek yeterlidir.
Dikkat Edilmesi Gerekenler
- DoRA şu anda yalnızca embedding, linear ve Conv2d katmanlarını desteklemektedir.
- DoRA, saf LoRA'ya kıyasla daha büyük bir ek yük getirir, bu nedenle çıkarım için ağırlıkların birleştirilmesi önerilir, bkz. LoraModel.merge_and_unload().
- DoRA, bitsandbytes ile kuantize edilmiş ağırlıklarla (“QDoRA”) çalışmalıdır. Ancak QDoRA’nın DeepSpeed Zero2 ile kullanımı sırasında sorunlar bildirilmiştir.