PEFT documentation

IA3

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

IA3

IA3 là một lựa chọn tuyệt vời khi bạn cần kích thước adapter nhỏ nhất có thể — nó sử dụng các vector học được thay vì các ma trận hạng thấp, khiến nó trở thành một trong những phương pháp hiệu quả về tham số nhất hiện có. Nếu ưu tiên của bạn là dung lượng đĩa/bộ nhớ tối thiểu và huấn luyện nhanh, IA3 là một ứng cử viên sáng giá.

IA3 introduces three vectors, lv, lk and lff to scale value, key and feed-forward activations (image source).

Infused Adapter by Inhibiting and Amplifying Inner Activations, hay IA3, là một phương pháp thêm ba vector học được để điều chỉnh lại tỷ lệ của keys và values trong các lớp self-attention và encoder-decoder attention, cũng như kích hoạt trung gian của mạng feed-forward theo vị trí.

Tóm tắt từ bài báo là:

Học trong ngữ cảnh với ít mẫu (Few-shot in-context learning, ICL) cho phép các mô hình ngôn ngữ được huấn luyện trước thực hiện một nhiệm vụ chưa từng thấy mà không cần bất kỳ huấn luyện dựa trên gradient nào, bằng cách cung cấp một số lượng nhỏ các ví dụ huấn luyện như một phần của đầu vào. ICL gây ra chi phí tính toán, bộ nhớ và lưu trữ đáng kể vì nó liên quan đến việc xử lý tất cả các ví dụ huấn luyện mỗi khi đưa ra một dự đoán. Huấn luyện tinh chỉnh hiệu quả tham số (Parameter-efficient fine-tuning, PEFT) (ví dụ: các module adapter, prompt tuning, các phương pháp cập nhật thưa, v.v.) cung cấp một hệ thống thay thế, trong đó một tập hợp nhỏ các tham số được huấn luyện để cho phép mô hình thực hiện nhiệm vụ mới. Trong bài báo này, chúng tôi so sánh nghiêm ngặt ICL với ít mẫu và PEFT, và chứng minh rằng phương pháp sau mang lại độ chính xác tốt hơn cũng như chi phí tính toán thấp hơn đáng kể. Trong quá trình đó, chúng tôi giới thiệu một phương pháp PEFT mới gọi là (IA)^3, phương pháp này mở rộng các kích hoạt (activations) bằng các vector học được, đạt được hiệu suất mạnh mẽ hơn trong khi chỉ giới thiệu một lượng nhỏ tương đối các tham số mới. Chúng tôi cũng đề xuất một công thức đơn giản dựa trên mô hình T0 gọi là T-Few, có thể được áp dụng cho các nhiệm vụ mới mà không cần tinh chỉnh hoặc sửa đổi cụ thể cho từng nhiệm vụ. Chúng tôi xác minh hiệu quả của T-Few trên các nhiệm vụ hoàn toàn chưa từng thấy bằng cách áp dụng nó cho bộ chuẩn RAFT, đạt được hiệu suất vượt con người lần đầu tiên và vượt trội hơn trạng thái của nghệ thuật (state-of-the-art) 6% tuyệt đối. Tất cả mã nguồn được sử dụng trong các thí nghiệm của chúng tôi đều được công khai.

Để quá trình fine-tuning hiệu quả hơn, IA3 (Infused Adapter by Inhibiting and Amplifying Inner Activations) tái chuẩn hóa các kích hoạt bên trong bằng các vector học được. Các vector học được này được tiêm vào các module attention và feedforward trong một kiến trúc dựa trên transformer điển hình. Các vector học được này là các tham số có thể huấn luyện duy nhất trong quá trình fine-tuning, do đó các trọng số gốc vẫn được giữ nguyên. Việc xử lý các vector học được (thay vì các cập nhật hạng thấp học được cho một ma trận trọng số như LoRA) giúp giữ số lượng tham số có thể huấn luyện nhỏ hơn nhiều.

Tương tự như LoRA, IA3 mang lại nhiều lợi thế tương tự:

  • IA3 giúp việc tinh chỉnh hiệu quả hơn bằng cách giảm đáng kể số lượng tham số có thể huấn luyện. (Đối với T0, một mô hình IA3 chỉ có khoảng 0,01% tham số có thể huấn luyện, trong khi ngay cả LoRA cũng có > 0,1%)
  • Trọng số tiền huấn luyện ban đầu được giữ nguyên (frozen), điều này có nghĩa là bạn có thể xây dựng nhiều mô hình IA3 nhẹ và dễ di chuyển cho các tác vụ hạ nguồn khác nhau dựa trên chúng.
  • Hiệu suất của các mô hình được tinh chỉnh bằng IA3 tương đương với hiệu suất của các mô hình được tinh chỉnh hoàn toàn.
  • IA3 không làm tăng độ trễ suy luận vì trọng số adapter có thể được hợp nhất với mô hình cơ sở.

Về nguyên tắc, IA3 có thể được áp dụng cho bất kỳ tập con nào của các ma trận trọng số trong một mạng nơ-ron để giảm số lượng tham số có thể huấn luyện. Theo cách triển khai của các tác giả, trọng số IA3 được thêm vào các lớp key, value và feedforward của một mô hình Transformer. Cụ thể, đối với các mô hình transformer, trọng số IA3 được thêm vào đầu ra của các lớp key và value, và vào đầu vào của lớp feedforward thứ hai trong mỗi khối transformer.

Với các lớp đích để tiêm tham số IA3, số lượng tham số có thể huấn luyện có thể được xác định dựa trên kích thước của các ma trận trọng số.

Cách sử dụng

Đối với các mô hình tự hồi quy, nhắm vào k_proj, v_proj và down_proj — đây là các lớp mà các tác giả nhận thấy có hiệu quả nhất. Đặt feedforward_modules=["down_proj"] để IA3 biết các module nào là lớp feedforward và có thể áp dụng phép scale chính xác.

Đối với tác vụ phân loại chuỗi, bạn có thể khởi tạo cấu hình IA3 cho một mô hình Llama như sau:

from peft import IA3Config, TaskType, get_peft_model
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M")
peft_config = IA3Config(
    task_type=TaskType.CAUSAL_LM,
    target_modules=["k_proj", "v_proj", "down_proj"],
    feedforward_modules=["down_proj"],
)
model = get_peft_model(model, peft_config)
model.print_healthcheck()

Khi nào nên dùng IA3 so với LoRA

IA3 đặc biệt hiệu quả khi bạn cần các adapter nhỏ nhất có thể cho các triển khai bị giới hạn về bộ nhớ lưu trữ, hoặc khi bạn muốn hội tụ nhanh với ít tham số có thể huấn luyện hơn. LoRA có thể được ưu tiên hơn khi bạn cần hệ sinh thái rộng lớn hơn của các biến thể LoRA (DoRA, QLoRA, v.v.) hoặc muốn tiếp cận phương pháp được kiểm tra rộng rãi nhất với sự hỗ trợ cộng đồng phong phú.

Tổng quan về benchmark

API

IA3Config

lớp peft.IA3Config

< >

( 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 = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonefeedforward_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_ia3_weights: bool = True )

Tham số

  • target_modules (Optional[Union[List[str], str]]) — Tên của các module cần áp dụng adapter. Nếu được chỉ định, chỉ các module có tên được chỉ định sẽ được thay thế. Khi truyền một chuỗi, một phép khớp regex sẽ được thực hiện. Khi truyền một danh sách các chuỗi, một phép khớp chính xác sẽ được thực hiện hoặc kiểm tra xem tên của module có kết thúc bằng bất kỳ chuỗi nào được truyền hay không. Nếu được chỉ định là ‘all-linear’, thì tất cả các module linear/Conv1D sẽ được chọn, ngoại trừ lớp output. Nếu không được chỉ định, các module sẽ được chọn theo kiến trúc của model. Nếu kiến trúc không được biết đến, một lỗi sẽ được ném ra — trong trường hợp này, bạn nên chỉ định các module đích một cách thủ công.
  • exclude_modules (Optional[Union[List[str], str]]) — Tên của các module không áp dụng adapter. Khi truyền một chuỗi, một phép khớp regex sẽ được thực hiện. Khi truyền một danh sách các chuỗi, một phép khớp chính xác sẽ được thực hiện hoặc kiểm tra xem tên của module có kết thúc bằng bất kỳ chuỗi nào được truyền vào hay không.
  • feedforward_modules (Optional[Union[List[str], str]]) — Tên của các module được xử lý như các module feedforward, như trong bài báo gốc. Các module này sẽ có các vector (IA)³ được nhân vào đầu vào, thay vì đầu ra. feedforward_modules phải là một tên hoặc một tập con các tên có trong target_modules.
  • 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.
  • modules_to_save (Optional[List[str]]) — Danh sách các module ngoài các lớp (IA)³ cần được đặt là có thể huấn luyện và lưu trong checkpoint cuối cùng.
  • init_ia3_weights (bool) — Có nên khởi tạo các vector trong các lớp (IA)³ hay không, mặc định là True. Không khuyến khích đặt giá trị này thành False.

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

IA3Model

lớp peft.IA3Model

< >

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

Tạo mô hình Infused Adapter by Inhibiting and Amplifying Inner Activations ((IA)^3) từ một mô hình transformers đã được huấn luyện trước. Phương pháp này được mô tả chi tiết tại https://huggingface.co/papers/2205.05638

Ví dụ:

>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import IA3Config, get_peft_model

>>> config = IA3Config(
...     peft_type="IA3",
...     task_type="SEQ_2_SEQ_LM",
...     target_modules=["k", "v", "w0"],
...     feedforward_modules=["w0"],
... )

>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> ia3_model = get_peft_model(model, config)

Thuộc tính:

  • model (PreTrainedModel) — Mô hình cần được thích ứng.
  • peft_config (IA3Config): Cấu hình của mô hình (IA)^3.

add_weighted_adapter

< >

( adapters: list[str]weights: list[float]adapter_name: str )

Tham số

  • adapters (list) — Danh sách tên adapter cần được hợp nhất.
  • weights (list) — Danh sách trọng số cho từng adapter.
  • adapter_name (str) — Tên của adapter mới.

Phương pháp này thêm một adapter mới bằng cách gộp các adapter đã cho với các trọng số đã cho.

Update on GitHub