PEFT documentation

VeRA: Vector-based Random Matrix Adaptation

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

VeRA: Vector-based Random Matrix Adaptation

VeRA là một kỹ thuật tinh chỉnh hiệu quả tham số, tương tự LoRA nhưng yêu cầu ít tham số bổ sung hơn trong khi vẫn hứa hẹn hiệu suất tương đương hoặc thậm chí tốt hơn. Do đó, nó đặc biệt hữu ích khi ngân sách tham số rất hạn chế, chẳng hạn như khi mở rộng lên các mô hình rất lớn. Việc giảm số lượng tham số có thể huấn luyện được thực hiện bằng cách chia sẻ cùng các ma trận hạng thấp giữa tất cả các lớp, và chỉ huấn luyện hai vector bổ sung cho mỗi lớp.

Cách VeRA hoạt động

LoRA cập nhật một mô hình cơ sở đã đóng băng bằng cách học hai ma trận nhỏ, hạng thấp cho mỗi lớp được thích ứng. Hạng là chiều trong của các ma trận này và nó kiểm soát mức độ dung lượng mà bộ thích ứng có. Trong LoRA, việc tăng r hoặc thích ứng thêm nhiều lớp sẽ làm tăng nhanh số lượng tham số có thể huấn luyện vì mỗi lớp được thích ứng sẽ học cặp ma trận hạng thấp riêng của nó.

VeRA giữ nguyên ý tưởng thích ứng hạng thấp nhưng thay đổi các tham số được huấn luyện. Thay vì học các ma trận hạng thấp riêng biệt cho từng lớp, VeRA sử dụng một cặp ma trận hạng thấp A và B được đóng băng, khởi tạo ngẫu nhiên, và dùng chung cho tất cả các lớp. Mỗi lớp được thích ứng chỉ học hai vector tỷ lệ, vera_lambda_d và vera_lambda_b, để điều chỉnh tỷ lệ các ma trận dùng chung nhằm tạo ra bản cập nhật riêng cho từng lớp. Vì vera_lambda_d có kích thước r, số lượng tham số có thể huấn luyện của VeRA vẫn tăng theo r và theo số lớp được thích ứng. Tuy nhiên, nó tăng chậm hơn nhiều so với LoRA vì các ma trận lớn A và B được dùng chung và đóng băng thay vì được học riêng cho từng lớp.

Đây là lý do VeRA có thể sử dụng ít tham số có thể huấn luyện hơn so với LoRA. Trong công thức tính số tham số rút gọn từ bài báo, LoRA tăng theo 2 * L_tuned * d_model * r, trong đó L_tuned là số lớp được điều chỉnh, d_model là chiều của mô hình, và r là rank. VeRA tăng theo L_tuned * (d_model + r) vì các ma trận rank thấp lớn được chia sẻ và đóng băng, trong khi chỉ các vector nhỏ theo từng lớp mới được huấn luyện.

Khi lưu các tham số adapter, 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 trên 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).

Để xử lý các hình dạng khác nhau của các lớp đã thích ứng, VeRA khởi tạo các ma trận A và B dùng chung với kích thước lớn nhất cần thiế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ể sẽ đượ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.

VeRA 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à:

Phương pháp thích ứng hạng thấp (LoRA) là một phương pháp phổ biến giúp giảm số lượng tham số có thể huấn luyện khi tinh chỉnh các mô hình ngôn ngữ lớn, nhưng vẫn đối mặt với những thách thức cấp bách về lưu trữ khi mở rộng sang các mô hình lớn hơn hoặc triển khai nhiều mô hình đã thích ứng riêng cho từng người dùng hoặc từng tác vụ. Trong công trình này, chúng tôi giới thiệu Thích ứng Ma trận Ngẫu nhiên dựa trên Vector (VeRA), phương pháp này giảm đáng kể số lượng tham số có thể huấn luyện so với LoRA, nhưng vẫn duy trì hiệu suất tương đương. Nó đạt được điều này bằng cách sử dụng một cặp duy nhất các ma trận hạng thấp được chia sẻ giữa tất cả các lớp và thay vào đó học các vector tỷ lệ nhỏ. Chúng tôi chứng minh hiệu quả của nó trên các bộ chuẩn GLUE và E2E, các tác vụ phân loại hình ảnh, và cho thấy ứng dụng của nó trong việc tinh chỉnh theo hướng dẫn (instruction-tuning) các mô hình ngôn ngữ 7B và 13B.

Khi nào nên sử dụng VeRA

VeRA là một lựa chọn tốt khi:

  • Bạn muốn giảm thiểu số lượng tham số có thể huấn luyện trong khi vẫn duy trì hiệu suất tương đương với LoRA.
  • Bạn cần lưu trữ hoặc triển khai nhiều adapter dành riêng cho từng tác vụ, trong đó các checkpoint adapter nhỏ hơn giúp giảm yêu cầu về dung lượng lưu trữ.
  • Bạn đang tinh chỉnh các mô hình ngôn ngữ rất lớn trong điều kiện hạn chế chặt chẽ về bộ nhớ hoặc ngân sách tham số.

Khi nào không nên sử dụng VeRA

VeRA có thể không phải là lựa chọn tốt nhất khi:

  • Bạn cần các ma trận hạng thấp độc lập cho từng lớp được thích ứng, cung cấp sự linh hoạt lớn hơn trong các tham số adapter được học.
  • Mô hình của bạn yêu cầu thích ứng các loại module khác ngoài nn.Linear, vì VeRA hiện chỉ hỗ trợ các lớp tuyến tính.
  • Mô hình của bạn chứa các lớp tuyến tính đã được thích ứng với các kích thước đầu vào và đầu ra khác nhau đáng kể. Vì VeRA chia sẻ một cặp ma trận chiếu duy nhất cho tất cả các lớp đã thích ứng, các ma trận này phải được định kích thước cho hình dạng lớn nhất. Do đó, các mô hình có sự biến động lớn về hình dạng của các lớp (ví dụ: các lớp chiếu lên và chiếu xuống trong transformer) có thể yêu cầu cấp phát quá mức cho các ma trận chiếu chung, làm giảm một phần lợi thế về hiệu quả tham số của VeRA.

Tổng quan về benchmark

API

VeRAConfig

lớp peft.VeraConfig

< >

( 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 = 256target_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truevera_dropout: float = 0.0d_initial: float = 0.1fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

Tham số

  • r (int, không bắt buộc, mặc định là 256) — Chiều tham số của VeRA (“rank”). Hãy chọn các giá trị cao hơn rank của LoRA ở đây, vì VeRA sử dụng ít tham số hơn rất nhiều so với LoRA (xem Bảng 1).
  • target_modules (Union[List[str], str]) — Tên của các module cần áp dụng Vera. Chỉ hỗ trợ các lớp tuyến tính.
  • projection_prng_key (int) — Khóa khởi tạo PRNG của Vera. Được dùng để khởi tạo vera_A và vera_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ác phép chiếu vera_A / vera_B trong state dict cùng với trọng số lambda_b / lambda_d của 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.
  • vera_dropout (float) — Xác suất dropout cho các lớp Vera.
  • d_initial (float, tuỳ chọn, mặc định là 0.1) — Giá trị khởi tạo ban đầu cho vector vera_lambda_d được sử dụng khi khởi tạo các tham số VeRA. Khuyến nghị sử dụng các giá trị nhỏ (<=0.1) (xem Bảng 6c trong bài báo).
  • 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ụng Conv1D lưu trọng số theo dạng (fan_in, fan_out) do đó giá trị này nên được đặt thành True.
  • bias (str) — Bias type for Vera. Can be ‘none’, ‘all’ or ‘vera_only’. If ‘all’ or ‘vera_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 Vera 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 Vera với 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 Vera 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 Vera sẽ được áp dụng lên lớp tại chỉ số đó.
  • layers_pattern (Optional[Union[List[str], str]]) — Tên mẫu lớp, chỉ được sử dụng nếu layers_to_transform khác None. Giá trị này cần nhắm đến nn.ModuleList của mô hình, thường được gọi là 'layers' hoặc 'h'.

Đây là lớp cấu hình để lưu trữ cấu hình của VeraModel.

Bài báo: https://huggingface.co/papers/2310.11454.

VeRAModel

lớp peft.VeraModel

< >

( 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 (VeraConfig) — Cấu hình của mô hình Vera.
  • 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 Vera.

Tạo mô hình Vector-based Random Matrix Adaptation (Vera) từ một mô hình transformers đã được huấn luyện trước.

Ví dụ:

>>> from transformers import AutoModelForCausalLM
>>> from peft import VeraConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VeraConfig(r=128)
>>> model = get_peft_model(base_model, config)

Thuộc tính:

  • model (PreTrainedModel) — Mô hình cần được thích ứng.
  • peft_config (VeraConfig): Cấu hình của mô hình Vera.
Update on GitHub