PEFT documentation
AdaLoRA
AdaLoRA
AdaLoRA (Adaptive LoRA) là một phương pháp tối ưu hóa số lượng tham số có thể huấn luyện để gán cho các ma trận trọng số và các lớp, khác với LoRA vốn phân bổ tham số đều cho tất cả các module. Các ma trận trọng số và lớp quan trọng sẽ được cấp nhiều tham số hơn, trong khi những phần ít quan trọng hơn nhận ít tham số hơn. Bạn có thể kiểm soát rank trung bình mong muốn hoặc r của các ma trận, cũng như các module cần áp dụng AdaLoRA thông qua target_modules. Các tham số quan trọng khác cần thiết lập là lora_alpha (hệ số tỷ lệ) và modules_to_save (các module ngoài các lớp AdaLoRA cần được huấn luyện và lưu lại). Tất cả các tham số này - và nhiều hơn nữa - đều có trong AdaLoraConfig.
Tóm tắt từ bài báo là:
Việc tinh chỉnh các mô hình ngôn ngữ tiền huấn luyện lớn trên các tác vụ hạ nguồn đã trở thành một phương thức quan trọng trong NLP. Tuy nhiên, thông lệ phổ biến là tinh chỉnh tất cả các tham số trong một mô hình tiền huấn luyện, điều này trở nên không khả thi khi có một số lượng lớn các tác vụ hạ nguồn. Do đó, nhiều phương pháp tinh chỉnh đã được đề xuất để học các cập nhật tăng dần của trọng số tiền huấn luyện theo cách hiệu quả về mặt tham số, chẳng hạn như các phần tăng bậc thấp. Các phương pháp này thường phân bổ đều ngân sách cập nhật tăng dần cho tất cả các ma trận trọng số tiền huấn luyện và bỏ qua tầm quan trọng khác nhau của các tham số trọng số khác nhau. Hệ quả là, hiệu suất tinh chỉnh không đạt tối ưu. Để lấp đầy khoảng trống này, chúng tôi đề xuất AdaLoRA, phương pháp phân bổ thích ứng ngân sách tham số giữa các ma trận trọng số dựa trên điểm quan trọng của chúng. Cụ thể, AdaLoRA tham số hóa các cập nhật tăng dần dưới dạng phân rã giá trị riêng. Cách tiếp cận mới颖 này cho phép chúng tôi cắt tỉa hiệu quả các giá trị riêng của các cập nhật không quan trọng, về bản chất là giảm ngân sách tham số của chúng nhưng tránh các tính toán SVD chính xác phức tạp. Chúng tôi tiến hành các thí nghiệm rộng rãi với một số mô hình tiền huấn luyện trên xử lý ngôn ngữ tự nhiên, trả lời câu hỏi và tạo ngôn ngữ tự nhiên để xác minh hiệu quả của AdaLoRA. Kết quả cho thấy AdaLoRA thể hiện sự cải thiện đáng kể so với các phương pháp cơ sở, đặc biệt là trong các cài đặt ngân sách thấp. Mã nguồn của chúng tôi được công khai tại https://github.com/QingruZhang/AdaLoRA.
AdaLoRA có phương thức update_and_allocate() cần được gọi ở mỗi bước huấn luyện để cập nhật ngân sách tham số và mặt nạ, nếu không thì bước thích ứng sẽ không được thực hiện. Điều này đòi hỏi phải viết một vòng lặp huấn luyện tùy chỉnh hoặc kế thừa lớp Trainer để tích hợp phương thức này. Ví dụ, hãy xem vòng lặp huấn luyện tùy chỉnh này.
AdaLoRA quản lý ngân sách tham số được giới thiệu từ LoRA bằng cách phân bổ nhiều tham số hơn - nói cách khác, một bậc (rank) cao hơn r - cho các ma trận trọng số quan trọng, phù hợp hơn với tác vụ, và cắt giảm những ma trận kém quan trọng hơn. Bậc được kiểm soát bằng một phương pháp tương tự phân tích giá trị riêng (SVD). được tham số hóa bằng hai ma trận trực giao và một ma trận đường chéo chứa các giá trị riêng. Phương pháp tham số hóa này tránh việc áp dụng SVD lặp đi lặp lại, vốn tốn kém về mặt tính toán. Dựa trên phương pháp này, bậc của được điều chỉnh theo một điểm số quan trọng. được chia thành các bộ ba (triplet) và mỗi bộ ba được chấm điểm theo mức đóng góp của nó vào hiệu suất mô hình. Các bộ ba có điểm số quan trọng thấp sẽ bị cắt giảm, trong khi các bộ ba có điểm số quan trọng cao sẽ được giữ lại để tinh chỉnh.
Huấn luyện với AdaLoRA có ba giai đoạn: giai đoạn khởi tạo, giai đoạn phân bổ ngân sách và giai đoạn cuối. Trong giai đoạn khởi tạo, không áp dụng phân bổ ngân sách, do đó các rank không bị thay đổi. Trong giai đoạn phân bổ ngân sách, quy trình được mô tả ở trên được áp dụng và rank được phân phối lại theo một ngân sách, nhằm cấp nhiều rank hơn cho các adapter quan trọng hơn và ít rank hơn cho các lớp ít quan trọng hơn. Khi đạt đến giai đoạn cuối, quá trình phân bổ ngân sách đã kết thúc, các rank được phân phối lại nhưng chúng ta có thể tiếp tục huấn luyện trong một thời gian với các rank đã phân phối lại để cải thiện hiệu suất thêm nữa.
Mời đóng góp: Phần này cần được làm rõ.
Cách đo lường mức độ quan trọng chưa rõ ràng. Các phần giải thích cũng hơi trùng lặp và có thể được gộp lại cho gọn. Xem tại đây để biết cách đóng góp.
Tổng quan về benchmark
Cách sử dụng
from peft import AdaLoraConfig, get_peft_model
config = AdaLoraConfig(
r=8,
init_r=12,
tinit=200,
tfinal=1000,
deltaT=10,
target_modules=["query", "value"],
modules_to_save=["classifier"],
)
model = get_peft_model(model, config)
model.print_healthcheck()
[... training code ...]
model.update_and_allocate(step_idx)API
AdaLoraConfig
lớp peft.AdaLoraConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 8target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonelora_alpha: int = 8lora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: Literal['none', 'all', 'lora_only'] = 'none'use_rslora: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_lora_weights: bool | Literal['gaussian', 'eva', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'corda', 'astra', 'loftq', 'orthogonal', 'mica', 'nora'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonerank_pattern: dict | None = Nonealpha_pattern: Optional[dict] = <factory>megatron_config: Optional[dict] = Nonemegatron_core: Optional[str] = 'megatron.core'trainable_token_indices: Optional[Union[list[int], dict[str, list[int]]]] = Noneloftq_config: Union[LoftQConfig, dict] = <factory>eva_config: Optional[EvaConfig] = Nonecorda_config: Optional[CordaConfig] = Noneastra_config: Optional[AstraConfig] = Nonelora_ga_config: Optional[LoraGAConfig] = Noneuse_dora: bool = Falsevelora_config: Optional[Union[VeloraConfig, dict]] = Nonealora_invocation_tokens: Optional[list[int]] = Noneuse_qalora: bool = Falseqalora_group_size: int = 16monteclora_config: Optional[MontecloraConfig] = Nonelayer_replication: Optional[list[tuple[int, int]]] = Noneruntime_config: LoraRuntimeConfig = <factory>lora_bias: bool = Falsetarget_parameters: Optional[list[str]] = Noneuse_bdlora: Optional[BdLoraConfig] = Nonearrow_config: Optional[ArrowConfig] = Nonekasa_config: Optional[KasaConfig] = Noneensure_weight_tying: bool = Falsetarget_r: int = 8init_r: int = 12tinit: int = 0tfinal: int = 0deltaT: int = 1beta1: float = 0.85beta2: float = 0.85orth_reg_weight: float = 0.5total_step: int | None = None )
Tham số
- target_r (
int) — Bậc trung bình mục tiêu của ma trận tăng dần. - init_r (
int) — Bậc ban đầu cho mỗi ma trận tăng dần. - tinit (
int) — Số bước khởi động (warmup) cho giai đoạn tinh chỉnh ban đầu. - tfinal (
int) — Số bước của quá trình tinh chỉnh cuối cùng. - deltaT (
int) — Khoảng thời gian giữa hai lần phân bổ ngân sách. - beta1 (
float) — Tham số siêu của EMA cho việc làm mịn độ nhạy. - beta2 (
float) — Siêu tham số của EMA cho việc định lượng độ bất định. - orth_reg_weight (
float) — Hệ số của quy tắc hóa trực giao. - total_step (
int) — Tổng số bước huấn luyện cần được chỉ định trước khi bắt đầu huấn luyện. - rank_pattern (
list) — Rank được phân bổ cho mỗi ma trận trọng số bởi RankAllocator.
Đây là lớp cấu hình để lưu trữ cấu hình của một AdaLoraModel.
AdaLoRA có ba giai đoạn được xác định bởi tinit, tfinal và total_step.
Giai đoạn ban đầu có thể được hiểu là một bước để huấn luyện trước các adapter, sao cho khi giảm rank của chúng, đã có một số thông tin được mã hóa sẵn để có thể giảm thay vì các ma trận ngẫu nhiên. Giai đoạn này được xác định bằng cách cung cấp tinit.
Sau khi giai đoạn ban đầu kết thúc (đã trôi qua tinit bước) và giai đoạn cuối chưa bắt đầu, AdaLoRA giảm ngân sách cho phép về bậc (rank) của từng lớp ở mỗi bước. Đây là nơi việc giảm bậc diễn ra. Quá trình này tiếp diễn cho đến khi đạt total_step - tfinal bước.
Giai đoạn cuối, bắt đầu khi đạt đến total_step - tfinal bước, không còn thay đổi thứ hạng của các lớp nữa mà
tiếp tục tinh chỉnh các lớp có thứ hạng đã giảm được tạo ra từ giai đoạn trước đó.
Một ví dụ thực tế: tinit là 10, tfinal là 20, total_step là 100. Chúng ta dành 10 bước để huấn luyện trước mà không giảm rank vì ngân sách của chúng ta là hằng số (giai đoạn khởi tạo), sau đó dành 80 (100-20) bước cho giai đoạn giảm, trong đó ngân sách giảm dần theo từng bước, và cuối cùng là 20 bước cho giai đoạn tinh chỉnh cuối cùng mà không giảm.
AdaLoraModel
lớp peft.AdaLoraModel
< source >( modelconfigadapter_name**kwargs ) → torch.nn.Module
Tham số
- model (transformers.PreTrainedModel) — Mô hình cần được thích ứng.
- config (AdaLoraConfig) — Cấu hình của mô hình AdaLora.
- adapter_name (
str) — Tên của adapter, mặc định là"default". - low_cpu_mem_usage (
bool,optional, mặc định làFalse) — Tạo trọng số adapter rỗng trên thiết bị meta. Hữu ích để tăng tốc quá trình tải.
Trả về
torch.nn.Module
Mô hình AdaLora.
Tạo mô hình AdaLoRA (Adaptive LoRA) từ một mô hình transformers được huấn luyện trước. Bài báo: https://openreview.net/forum?id=lq62uWRJjiY
Ví dụ:
>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import AdaLoraConfig, get_peft_model
>>> config = AdaLoraConfig(
... peft_type="ADALORA",
... task_type="SEQ_2_SEQ_LM",
... init_r=12,
... lora_alpha=32,
... target_modules=["q", "v"],
... lora_dropout=0.01,
... total_step=1000,
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> adalora_model = get_peft_model(model, config)Thuộc tính:
- model (transformers.PreTrainedModel) — Mô hình cần được thích ứng.
- peft_config (AdaLoraConfig): Cấu hình của mô hình AdaLora.
Phương pháp này không được hỗ trợ cho AdaLoRA, hãy sử dụng LoRA thay thế.
update_and_allocate
< source >( global_step )
Phương pháp này cập nhật ngân sách và mặt nạ của Adalora.
Điều này nên được gọi ở mỗi bước huấn luyện sau loss.backward() và trước zero_grad().
tinit, tfinal và deltaT được xử lý trong phương thức.