PEFT documentation
RandLora: Tinh chỉnh hiệu quả tham số bậc đầy đủ cho các mô hình lớn
RandLora: Tinh chỉnh hiệu quả tham số bậc đầy đủ cho các mô hình lớn
RandLora là một kỹ thuật tinh chỉnh hiệu quả về tham số, tương tự như LoRA và VeRA nhưng thực hiện cập nhật bậc đầy đủ để cải thiện hiệu suất. RandLora đặc biệt hữu ích khi thích ứng các mô hình lớn với những tác vụ khó đòi hỏi các cập nhật phức tạp, đồng thời vẫn giữ được hiệu quả về tham số của LoRA. Việc cập nhật bậc đầy đủ của RandLora được thực hiện bằng cách mở rộng tuyến tính các cơ sở ngẫu nhiên. Các cơ sở ngẫu nhiên là một tập hợp nhiều ma trận bậc thấp sao cho tổng bậc của chúng lớn hơn hoặc bằng bậc đầy đủ của các ma trận tham số. Các tham số có thể huấn luyện của RandLora là hai ma trận đường chéo (vector) được nhân với các cơ sở ngẫu nhiên bậc thấp ở vế phải, theo cách tương tự như cập nhật của VeRA. Để duy trì mức sử dụng bộ nhớ thấp, RandLora sử dụng một hàm tùy chỉnh ngăn việc lưu trữ các cơ sở không cần thiết trong bộ nhớ cho quá trình lan truyền ngược.
RandLora có một điểm khác biệt đáng chú ý: trái ngược với các thuật toán PEFT tương tự LoRA khác, việc tăng các bậc cơ sở ngẫu nhiên của RandLora sẽ làm tăng số lượng tham số có thể huấn luyện. Vì tích của số lượng cơ sở và bậc của cơ sở là hằng số trong RandLora, việc giảm bậc sẽ làm tăng số lượng cơ sở ngẫu nhiên, do đó làm tăng số lượng cơ sở chéo có thể huấn luyện riêng cho từng cơ sở.
Việc giảm rank của các cơ sở ngẫu nhiên của RandLora sẽ làm tăng số lượng của chúng, do đó RandLora có thể chậm hơn khi huấn luyện so với LoRA ở các rank rất nhỏ, nơi mà thông thường, các rank dưới 4 sẽ dẫn đến thời gian huấn luyện tăng đáng kể. Tuy nhiên, điều này không ảnh hưởng đến suy luận vì các adapter của RandLora có thể được gộp vào các ma trận trọng số đã được huấn luyện trước.
RandLora cũng hỗ trợ huấn luyện với các cơ sở ngẫu nhiên thưa, ba trị (chỉ chứa -1, 0 và 1). Các cơ sở này được mô tả trong Bingham et al. và Ping et al. và về mặt lý thuyết có thể được sử dụng để giảm nhu cầu tính toán bằng cách thực hiện các phép tổng hợp thay vì nhân ma trận để tạo ra bản cập nhật trọng số. Tính năng này hiện chưa được hỗ trợ. Mặc dù hiện tại không giảm được lượng tính toán, việc sử dụng các cơ sở ngẫu nhiên thưa trong RandLora có thể giúp giảm hiện tượng quá khớp trong một số trường hợp. Đối với người dùng quan tâm đến việc sử dụng các cơ sở ba trị thưa, tùy chọn sparse được khuyến nghị hơn so với tùy chọn very_sparse vì tùy chọn sau có thể làm giảm hiệu suất.
Tương tự như VeRA, khi lưu các tham số của RandLora, bạn có thể bỏ qua việc lưu trữ các ma trận hạng thấp bằng cách đặt save_projection=False trong VeraConfig. Trong trường hợp đó, các ma trận này sẽ được khôi phục dựa trên hạt ngẫu nhiên cố định từ đối số projection_prng_key. Điều này giúp giảm kích thước của checkpoint, nhưng chúng tôi không thể đảm bảo khả năng tái lập trên tất cả các thiết bị và cho tất cả các phiên bản PyTorch trong tương lai. Nếu bạn muốn đảm bảo khả năng tái lập, hãy đặt save_projection=True (đây là mặc định).
Tương tự như Vera và để xử lý các hình dạng khác nhau của các lớp đã thích ứng, RandLora khởi tạo các ma trận A và B dùng chung với kích thước yêu cầu lớn nhất cho từng chiều. Trong quá trình truyền thuận, các ma trận con A và B cho một lớp cụ thể được cắt ra từ các ma trận dùng chung này và được sử dụng như đã mô tả trong bài báo. Ví dụ, việc thích ứng hai lớp tuyến tính có hình dạng (100, 20) và (80, 50) sẽ tạo ra các ma trận A và B có hình dạng lần lượt là (rank, 50) và (100, rank). Sau đó, để thích ứng một lớp có hình dạng (100, 20), các ma trận con A và B có hình dạng (rank, 20) và (100, rank) sẽ được trích xuất.
RandLora hiện có ràng buộc sau:
- Chỉ hỗ trợ các lớp
nn.Linear.
Tóm tắt từ bài báo là:
Low-Rank Adaptation (LoRA) và các biến thể của nó đã cho thấy kết quả ấn tượng trong việc giảm số lượng tham số có thể huấn luyện và yêu cầu bộ nhớ của các mạng transformer lớn, đồng thời duy trì hiệu suất tinh chỉnh. Tuy nhiên, bản chất hạng thấp của việc cập nhật trọng số vốn dĩ giới hạn sức mạnh biểu diễn của các mô hình đã tinh chỉnh, do đó có thể làm suy giảm hiệu suất trên các tác vụ phức tạp. Điều này đặt ra một câu hỏi quan trọng: khi quan sát thấy khoảng cách hiệu suất giữa LoRA và tinh chỉnh tiêu chuẩn, nguyên nhân là do số lượng tham số có thể huấn luyện bị giảm hay do thiếu hạng? Bài báo này nhằm trả lời câu hỏi đó bằng cách giới thiệu RandLora, một phương pháp hiệu quả về tham số thực hiện các cập nhật hạng đầy đủ bằng cách sử dụng tổ hợp tuyến tính học được của các ma trận ngẫu nhiên hạng thấp, không thể huấn luyện. Phương pháp của chúng tôi giới hạn số lượng tham số có thể huấn luyện bằng cách hạn chế tối ưu hóa đối với các ma trận tỷ lệ chéo được áp dụng cho các ma trận ngẫu nhiên cố định. Điều này cho phép chúng tôi khắc phục hiệu quả các hạn chế hạng thấp trong khi vẫn duy trì hiệu quả về tham số và bộ nhớ trong quá trình huấn luyện. Thông qua các thí nghiệm rộng rãi trên các bộ chuẩn thị giác, ngôn ngữ và thị giác-ngôn ngữ, chúng tôi đánh giá có hệ thống các hạn chế của LoRA và các phương pháp cơ sở ngẫu nhiên hiện có. Các phát hiện của chúng tôi cho thấy các cập nhật hạng đầy đủ mang lại lợi ích cho các tác vụ thị giác và ngôn ngữ riêng lẻ, và thậm chí còn hơn nữa đối với các tác vụ thị giác-ngôn ngữ, nơi RandLora giảm đáng kể---và đôi khi loại bỏ---khoảng cách hiệu suất giữa tinh chỉnh tiêu chuẩn và LoRA, chứng minh hiệu quả của nó.
Tổng quan về benchmark
API
RandLoraConfig
lớp peft.RandLoraConfig
< 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 = 32target_modules: list[str] | str | None = Noneprojection_prng_key: int = 0save_projection: bool = Truesparse: bool = Falsevery_sparse: bool = Falserandlora_dropout: float = 0.0fan_in_fan_out: bool = Falserandlora_alpha: int = 640bias: str = 'none'modules_to_save: list[str] | None = Noneinit_weights: bool = Truelayers_to_transform: list[int] | int | None = Nonelayers_pattern: str | None = None )
Tham số
- r (
int, tuỳ chọn, mặc định là32) — Kích thước chiều rank của cơ sở ngẫu nhiên trong RandLora. Khác với Lora, tham số này tỷ lệ nghịch với số lượng tham số có thể huấn luyện, vì việc giảm giá trị của nó sẽ làm tăng số tham số có thể huấn luyện. - target_modules (
Union[list[str], str]) — Tên của các module cần áp dụng RandLora. Chỉ hỗ trợ các lớp tuyến tính. - projection_prng_key (
int) — Khóa khởi tạo PRNG của RandLora. Được dùng để khởi tạo basis_A và basis_B cho các mô hình mới hoặc khi nạp checkpoint không bao gồm các phép chiếu này. Mặc định là0. - save_projection (
bool) — Có nên lưu cơ sở ngẫu nhiên toàn cục basis_A / basis_B trong state dict cùng với các ma trận đường chéo lambda / gamma cho từng lớp hay không. Điều này sẽ làm tăng kích thước của checkpoint, nhưng đảm bảo rằng chúng ta có thể tải lại checkpoint trên tất cả các cấu hình hệ thống. Mặc định làTrue. - sparse (
bool) — Có sử dụng các cơ sở ngẫu nhiên thưa như mô tả trong bài báo RandLora hay không. Các cơ sở này là các cơ sở thưa ba trị (chỉ chứa -1, 0 và 1) trong đó xác suất gán là 1/6 cho -1 và 1, và 2/3 cho 0. Các ma trận thưa này nhằm mục đích được sử dụng cho phép tính không cần matmul trong tương lai, xem https://huggingface.co/papers/2406.02528v1 Hiện tại, cài đặt này chỉ là một bằng chứng khái niệm, trong đó tính thưa không được sử dụng để cải thiện tốc độ hoặc mức sử dụng bộ nhớ. Việc sử dụng ma trận thưa thường không làm giảm hiệu suất và thậm chí có thể giúp giảm hiện tượng overfitting. Mặc định làFalse. - very_sparse (
bool) — Có sử dụng các cơ sở ngẫu nhiên cực kỳ thưa như được mô tả trong bài báo RandLora hay không. Các cơ sở cực kỳ thưa là các cơ sở thưa ba trị (chỉ chứa -1, 0 và 1) với một ma trận có chiều nhỏ nhất là d, xác suất gán là 1/√D cho -1 và 1 và 1- 2/√D cho 0. Việc sử dụng các ma trận thưa này có thể giảm thêm hiện tượng quá khớp so với các phương ánsparsenhưng rất có thể sẽ làm giảm hiệu suất như một hệ quả. Sử dụng cẩn thận. Mặc định làFalse. - randlora_dropout (
float) — Xác suất dropout cho các lớp RandLora. - randlora_alpha (
float) — Hệ số tỷ lệ cho các lớp RandLora, thông thường sẽ bằng 20 lần rank. Vì hệ sốrandlora_alphamặc định khá lớn, nó có thể dẫn đến bất ổn về mặt số học, đặc biệt khi tốc độ học cao. Nếu quá trình huấn luyện không ổn định, hãy cân nhắc giảm tốc độ học hoặc hệ sốrandlora_alpha. - fan_in_fan_out (
bool) — Đặt giá trị này thành True nếu lớp cần thay thế lưu trọng số theo dạng (fan_in, fan_out). Ví dụ, gpt-2 sử dụngConv1Dlưu trọng số theo dạng (fan_in, fan_out) do đó giá trị này nên được đặt thànhTrue. - bias (
str) — Bias type. Can be ‘none’, ‘all’ or ‘randlora_only’. If ‘all’ or ‘randlora_only’, the corresponding biases will be updated during training. Be aware that this means that, even when disabling the adapters, the model will not produce the same output as the base model would have without adaptation. - modules_to_save (
list[str]) — danh sách các module ngoài các lớp RandLora cần được đặt là có thể huấn luyện và lưu trong checkpoint cuối cùng. - init_weights (
bool) — Có nên khởi tạo trọng số của các lớp RandLora bằng phương thức khởi tạo mặc định hay không. Không thay đổi cài đặt này, trừ khi bạn biết chính xác mình đang làm gì. - layers_to_transform (
Union[list[int],int]) — Các chỉ số lớp cần biến đổi. Nếu tham số này được chỉ định, các phép biến đổi RandLora sẽ được áp dụng lên các chỉ số lớp được liệt kê trong danh sách này. Nếu một số nguyên duy nhất được truyền vào, phép biến đổi RandLora sẽ được áp dụng lên lớp tại chỉ số đó. - layers_pattern (
str) — Tên mẫu lớp, chỉ được sử dụng nếulayers_to_transformkhácNonevà nếu mẫu lớp không nằm trong các mẫu lớp phổ biến.
Đây là lớp cấu hình để lưu trữ cấu hình của một RandLoraModel.
Bài báo: https://huggingface.co/papers/2502.00987.
RandLoraModel
lớp peft.RandLoraModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
Tham số
- model (PreTrainedModel) — Mô hình cần được thích ứng.
- config (RandLoraConfig) — Cấu hình của mô hình RandLora.
- 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 RandLora.
Tạo một mô hình RandLoRA từ một mô hình transformers được huấn luyện trước.
Ví dụ:
>>> from transformers import AutoModelForCausalLM
>>> from peft import RandLoraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = RandLoraConfig(r=32)
>>> model = get_peft_model(base_model, config)Thuộc tính:
- model (PreTrainedModel) — Mô hình cần được thích ứng.
- peft_config (RandLoraConfig): Cấu hình của mô hình RandLora.