PEFT documentation

Thích ứng hạng thấp phân rã trọng số (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

Thích ứng hạng thấp phân rã trọng số (DoRA)

Đây là một biến thể của LoRA và do đó mọi thứ có thể thực hiện được với LoRA đều áp dụng cho phương pháp này, trừ khi có ghi chú khác trên trang này.

Kỹ thuật này phân tách các bản cập nhật trọng số thành hai phần: độ lớn và hướng. Hướng được xử lý bởi LoRA thông thường, trong khi độ lớn được xử lý bởi một tham số học riêng biệt. Điều này có thể cải thiện hiệu suất của LoRA, đặc biệt là ở các bậc thấp. Để biết thêm thông tin về DoRA, hãy xem https://huggingface.co/papers/2402.09353.

from peft import LoraConfig

config = LoraConfig(use_dora=True, ...)

Nếu một phần của mô hình hoặc bộ thích ứng DoRA được chuyển xuống CPU, bạn có thể đạt được tốc độ tăng đáng kể với chi phí là một lượng VRAM tạm thời (ephemeral) bằng cách sử dụng ephemeral_gpu_offload=True trong config.runtime_config.

from peft import LoraConfig, LoraRuntimeConfig

config = LoraConfig(use_dora=True, runtime_config=LoraRuntimeConfig(ephemeral_gpu_offload=True), ...)

Một PeftModel có adapter DoRA cũng có thể được nạp với cờ ephemeral_gpu_offload=True bằng cách sử dụng phương thức from_pretrained cũng như phương thức load_adapter.

from peft import PeftModel

model = PeftModel.from_pretrained(base_model, peft_model_id, ephemeral_gpu_offload=True)

Tối ưu hóa

DoRA được tối ưu (tính toán nhanh hơn và tốn ít bộ nhớ hơn) cho các mô hình ở chế độ đánh giá, hoặc khi dropout được đặt bằng 0. Chúng tôi tái sử dụng kết quả cơ bản trong những trường hợp đó để đạt được tốc độ nhanh hơn. Chạy dora finetuning với 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 trên một card 4090 với gradient accumulation được đặt bằng 2 và max step bằng 20 đã cho ra các quan sát sau:

Không có Tối ưu hóaVới Tối ưu hóa
thời gian huấn luyện (giây)359.7298279.2676
mẫu huấn luyện mỗi giây1.7792.292
số bước huấn luyện mỗi giây0.0560.072

Hơn nữa, có thể tăng thêm hiệu suất thời gian chạy của DoRA bằng cách sử dụng ngữ cảnh trợ giúp DoraCaching. Điều này yêu cầu mô hình phải ở chế độ eval:

from peft.helpers import DoraCaching

model.eval()
with DoraCaching():
    output = model(inputs)

Đối với meta-llama/Llama-3.1-8B, script benchmark DoRA caching cho thấy, so với LoRA:

  • DoRA không có bộ nhớ đệm cần thêm 139% thời gian
  • DoRA không có bộ nhớ đệm cần thêm 4% bộ nhớ
  • DoRA với bộ nhớ đệm cần thêm 17% thời gian
  • DoRA với bộ nhớ đệm yêu cầu nhiều bộ nhớ hơn 41%

Do đó, việc cache có thể giúp suy luận với DoRA nhanh hơn đáng kể nhưng cũng đòi hỏi bộ nhớ lớn hơn đáng kể. Về mặt lý tưởng, nếu trường hợp sử dụng cho phép, hãy gộp adapter DoRA để tránh cả chi phí bộ nhớ lẫn thời gian thực thi.

Lưu ý

  • Hiện tại, DoRA chỉ hỗ trợ các lớp embedding, linear và Conv2d.
  • DoRA gây ra độ trễ lớn hơn so với LoRA thuần, vì vậy khuyến nghị là hợp nhất trọng số cho suy luận, xem LoraModel.merge_and_unload().
  • DoRA nên hoạt động với trọng lượng đã được lượng tử hóa bằng bitsandbytes (“QDoRA”). Tuy nhiên, đã có các vấn đề được báo cáo khi sử dụng QDoRA với DeepSpeed Zero2.
Update on GitHub