PEFT documentation

Cartridges

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

Cartridges

Cartridges là một phương pháp học theo prompt, lưu trữ biểu diễn ngữ cảnh dài đã nén dưới dạng tiền tố KV-cache có tham số hóa. Ý tưởng cốt lõi đến từ bài báo Cartridges: Lightweight and general-purpose long context representations via self-study.

Để có cái nhìn tổng quan và động lực, hãy xem bài đăng trên blog Cartridges: Storing long contexts in tiny caches with self-study.

Cách Cartridges khác với Prefix Tuning

Cả Prefix Tuning và Cartridges đều được triển khai bằng cách tiêm past_key_values (bộ đệm KV tiền tố) vào mô hình cơ sở.

  • Prefix Tuning học các nhúng token ảo (và tùy chọn một phép chiếu MLP) và tạo ra một tiền tố KV.
  • Cartridges học trực tiếp chính tiền tố KV (các vector key/value theo từng lớp cho p token ảo), và được thiết kế để khởi tạo từ KV prefill thực tế (ví dụ, p token đầu tiên của một tập dữ liệu/hệ thống prompt).

Bài báo cũng khuyến nghị đóng băng token đầu tiên như một điểm neo chú ý để đảm bảo tính ổn định (num_frozen_tokens=1 là mặc định).

Cách sử dụng (suy luận)

Tải adapter CARTRIDGE đã được huấn luyện và chạy tạo văn bản:

from transformers import AutoModelForCausalLM, AutoTokenizer

from peft import PeftModel

model_id = "Qwen/Qwen2.5-0.5B-Instruct"
adapter_path = "path/to/cartridge_adapter"

base = AutoModelForCausalLM.from_pretrained(model_id)
model = PeftModel.from_pretrained(base, adapter_path)

tok = AutoTokenizer.from_pretrained(model_id)
if tok.pad_token is None:
    tok.pad_token = tok.eos_token

out = model.generate(**tok("Question about the corpus:", return_tensors="pt"), max_new_tokens=64)
print(tok.decode(out[0], skip_special_tokens=True))

Nếu bạn cần tạo và khởi tạo một cartridge trước khi huấn luyện, hãy xem các tùy chọn khởi tạo bên dưới.

Các tùy chọn khởi tạo

Bài báo thảo luận về một số chiến lược khởi tạo thực tiễn:

  • Random KV (mặc định): tạo một CartridgeConfig và bắt đầu huấn luyện. Thao tác này sẽ khởi tạo tiền tố KV một cách ngẫu nhiên.
  • KV từ các token đầu tiên của một prompt/corpus: sử dụng initialize_kv_prefix_from_text(model, tokenizer, text=...). Thao tác này thực hiện prefill trên text và sao chép bộ nhớ đệm KV kết quả cho num_virtual_tokens đầu tiên vào adapter.
  • KV từ bộ nhớ đệm hiện có: hãy sử dụng initialize_kv_prefix_from_past_key_values(model, past_key_values=...) nếu bạn đã có một đối tượng past_key_values từ bước prefill của mô hình cơ sở.

Huấn luyện

Bài báo Cartridges đề xuất một mục tiêu chưng cất SELF-STUDY (một mô hình cơ sở đóng băng cung cấp logits của giáo viên; bộ thích ứng CARTRIDGE được huấn luyện để học sinh khớp với phân phối token tiếp theo của giáo viên trên đoạn đích). PEFT giữ logic huấn luyện tách khỏi thư viện lõi; xem https://github.com/huggingface/peft/tree/main/examples/cartridge_self_study để biết quy trình tham chiếu. Các script trong ví dụ sử dụng mô hình cơ sở đóng băng làm giáo viên và mô hình đã thích ứng làm học sinh, do đó cả hai cùng chia sẻ checkpoint cơ bản.

Cấu thành

Để ghép nối các cartridge được huấn luyện độc lập thành một adapter duy nhất, hãy sử dụng compose_cartridge_adapters(...).

API

CartridgeConfig

lớp peft.CartridgeConfig

< >

( 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 = Falsenum_virtual_tokens: int = Nonetoken_dim: int = Nonenum_transformer_submodules: Optional[int] = Nonenum_attention_heads: Optional[int] = Nonenum_layers: Optional[int] = Nonemodules_to_save: Optional[list[str]] = Nonenum_frozen_tokens: int = 1 )

Tham số

  • num_frozen_tokens (int, mặc định là 1) — Số lượng token tiền tố ở đầu cartridge cần giữ nguyên (không tính gradient). Bài báo về Cartridges khuyến nghị đóng băng token đầu tiên như một điểm neo chú ý để đảm bảo ổn định (đặt giá trị này thành 1), vì nhiều LLM sử dụng các token đầu tiên làm điểm neo chú ý và việc thay đổi chúng có thể gây hại cho quá trình huấn luyện.

Cấu hình cho CARTRIDGE, một bộ thích ứng tiền tố có tham số hóa bộ nhớ đệm KV.

Điều này tương tự như prefix-tuning về cách phục vụ (dưới dạng past_key_values), nhưng nó lưu trữ bộ nhớ đệm KV trực tiếp dưới dạng các tham số có thể huấn luyện thay vì học nó thông qua một phép chiếu MLP.

Khởi tạo: Bài báo Cartridges thảo luận về nhiều tùy chọn khởi tạo. Trong PEFT, khởi tạo là một bước riêng biệt so với việc xây dựng cấu hình adapter:

  • Khởi tạo KV ngẫu nhiên (tùy chọn 2 trong bài báo): Tạo adapter thông qua get_peft_model(...). Các tham số của prompt encoder CARTRIDGE được khởi tạo ngẫu nhiên bởi PyTorch.

  • KV được suy ra từ các token đầu tiên của một prompt/corpus (lựa chọn 3 trong bài báo): Chạy prefill không có gradient trên mô hình cơ sở và sao chép num_virtual_tokens token KV được cache đầu tiên vào adapter. PEFT cung cấp các tiện ích cho việc này (có thể import từ peft hoặc từ peft.tuners.cartridge.utils):

    • initialize_kv_prefix_from_text(model, tokenizer, text=...)
    • initialize_kv_prefix_from_past_key_values(model, past_key_values=...)

    Nếu bạn đã có một tensor KV-prefix đã được làm phẳng, bạn có thể nạp nó trực tiếp thông qua phương thức load_prompt_embeddings(...) của prompt encoder.

CartridgeEncoder

lớp peft.CartridgeEncoder

< >

( config )

Bộ đệm KV có tiền tố được tham số hóa.

Các tham số được lưu trữ trong cùng một bố cục phẳng như đầu ra của PrefixEncoder: `[num_virtual_tokens, num_layers

  • 2 * token_dim], wheretoken_dimis per-head hidden size times number of heads (after any GQA adjustment performed by_prepare_prompt_learning_config`).

Nếu num_frozen_tokens > 0, num_frozen_tokens token ảo đầu tiên được lưu dưới dạng tham số không thể huấn luyện, và các token còn lại có thể huấn luyện.

load_prompt_embeddings

< >

( prompt_embeddings: torch.Tensor )

Tải các embedding prompt đã được làm phẳng và lưu bởi PEFT (prompt_embeddings).

PEFT lưu các adapter prompt-learning dưới dạng một tensor prompt_embeddings duy nhất. Đối với CARTRIDGE, chúng tôi tách tensor đó thành các đoạn đóng băng và có thể huấn luyện theo self.num_frozen_tokens.

initialize_kv_prefix_from_past_key_values

peft.initialize_kv_prefix_from_past_key_values

< >

( modeladapter_name: Optional[str] = Nonepast_key_values: Anynum_virtual_tokens: Optional[int] = None )

Khởi tạo bộ thích ứng học prompt tiền tố KV từ tiền tố được lưu trong bộ nhớ đệm (past_key_values) hiện có.

Trả về tensor nhúng prompt đã được nạp vào adapter.

prompt_embeddings_from_past_key_values

peft.prompt_embeddings_from_past_key_values

< >

( past_key_values: Anynum_virtual_tokens: int )

Chuyển đổi bộ đệm past_key_values (phiên bản cũ) thành tensor nhúng prompt đã được làm phẳng do PEFT lưu trữ.

Đầu ra khớp với bố cục được kỳ vọng bởi PeftModel.get_prompt() cho việc học prompt theo kiểu tiền tố: hình dạng [num_virtual_tokens, num_layers * 2 * token_dim].

Update on GitHub