PEFT documentation

MiSS

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

MiSS

MiSS (Matrix Shard Sharing) là một phương pháp PEFT đạt được sự cân bằng tốt giữa hiệu suất mô hình và hiệu quả tính toán. Nó chỉ cần một ma trận có thể huấn luyện duy nhất và đưa vào cơ chế chia sẻ shard khác biệt so với LoRA.

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

Các phương pháp Fine-Tuning hiệu quả về tham số (PEFT), đặc biệt là Low-Rank Adaptation (LoRA), giúp giảm hiệu quả số lượng tham số có thể huấn luyện trong các Mô hình Ngôn ngữ Lớn (LLM). Tuy nhiên, khi quy mô mô hình tiếp tục tăng, nhu cầu về tài nguyên tính toán vẫn là một thách thức lớn. Các biến thể LoRA hiện có thường gặp khó khăn trong việc đạt được sự cân bằng tối ưu giữa khả năng thích ứng (hiệu suất mô hình và tốc độ hội tụ) và hiệu quả (chi phí tính toán, mức sử dụng bộ nhớ và thời gian khởi tạo). Bài báo này giới thiệu MiSS (Matrix Shard Sharing), một phương pháp PEFT mới giải quyết sự đánh đổi này thông qua một cơ chế chia sẻ shard đơn giản. MiSS tận dụng nhận thấy rằng một sự thích ứng hạng thấp có thể đạt được bằng cách phân rã ma trận trọng số thành nhiều ma trận mảnh và sử dụng một mảnh chung có thể huấn luyện. Phương pháp này xây dựng ma trận cập nhật hạng thấp thông qua việc nhân bản các shard chia sẻ, được phân vùng này. Chúng tôi cũng đề xuất một triển khai hiệu quả về phần cứng và có tính ứng dụng rộng rãi cho MiSS. Các thí nghiệm rộng rãi được thực hiện trên một loạt các tác vụ, cùng với phân tích có hệ thống về hiệu suất tính toán, chứng minh sự vượt trội của MiSS. Kết quả cho thấy MiSS vượt trội đáng kể so với LoRA tiêu chuẩn và các biến thể nổi bật của nó về cả các chỉ số hiệu suất mô hình lẫn hiệu quả tính toán, bao gồm tốc độ khởi tạo và thông lượng huấn luyện. Bằng cách cân bằng hiệu quả giữa sức biểu đạt và việc sử dụng tài nguyên, MiSS cung cấp một giải pháp hấp dẫn để thích ứng hiệu quả các mô hình quy mô lớn.

Tổng quan về benchmark

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

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

  • Bạn muốn khởi tạo nhanh hơn và thông lượng huấn luyện cao hơn so với các phương án khởi tạo LoRA nâng cao sử dụng các cấu hình đắt đỏ (chẳng hạn như PiSSA, LoRA-GA, hoặc OLoRA).
  • Bạn muốn một giải pháp thay thế cho LoRA có thể thay thế trực tiếp với các thay đổi cấu hình tối thiểu.

Nếu bạn cần khả năng biểu diễn mạnh hơn với chi phí là một phần hiệu suất, hãy xem xét biến thể khởi tạo bat (xem bên dưới).

các chế độ init_weights

MiSS hỗ trợ ba chế độ khởi tạo thông qua tham số init_weights:

  • True (mặc định): Khởi tạo MiSS tiêu chuẩn. Điểm khởi đầu tốt nhất cho hầu hết các trường hợp sử dụng.
  • "bat": Cho phép cập nhật phi tuyến tính giữa các shard khác nhau. Cho kết quả tốt hơn so với MiSS tiêu chuẩn nhưng sử dụng nhiều bộ nhớ hơn và chậm hơn khoảng gấp đôi. Sử dụng tùy chọn này khi hiệu năng được ưu tiên hơn hiệu suất.
  • "mini": Sử dụng rank nhỏ hơn dọc theo chiều out_features, được điều khiển bởi mini_r. Điều này giúp giảm thêm số tham số có thể huấn luyện. Khi sử dụng chế độ này, mini_r phải được đặt và out_features phải chia hết cho mini_r.

Bắt đầu nhanh

import torch
from peft import MissConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    torch_dtype=torch.bfloat16,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer.pad_token_id = tokenizer.eos_token_id

# Standard MiSS
config = MissConfig(
    r=64,
    miss_dropout=0.01,
    task_type="CAUSAL_LM"
)

# BAT variant — better performance, more memory
# config = MissConfig(
#     r=64,
#     init_weights="bat",
#     task_type="CAUSAL_LM"
# )

# Mini variant — fewer trainable parameters
# config = MissConfig(
#     r=64,
#     init_weights="mini",
#     mini_r=8,
#     task_type="CAUSAL_LM"
# )

model = get_peft_model(model, config)
model.print_healthcheck()

Để xem một ví dụ fine-tuning đầy đủ bao gồm huấn luyện và suy luận, hãy xem ví dụ fine-tuning MiSS.

API

MissConfig

lớp peft.MissConfig

< >

( 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 = 64miss_dropout: float = 0.0mini_r: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool | Literal['bat', 'mini'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[str] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )

Tham số

  • r (int) — Rank của MiSS giữa các lớp khác nhau. Tốt nhất nên đặt ‘r’ là một số chẵn; nếu không, phương pháp khởi tạo mặc định sẽ không hoạt động. Rank của MiSS tương ứng với một phân rã rank thấp dọc theo chiều in_features.
  • miss_dropout (float) — Xác suất dropout cho các lớp MiSS.
  • mini_r (int) — Rank của MiSS tương ứng với một phân rã hạng thấp dọc theo chiều out_features. Khi bạn đặt init_weights=mini, bạn cần đặt mini_r. Vui lòng đảm bảo rằng out_features chia hết cho mini_r.
  • 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 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.
  • init_weights (bool | Literal[“bat”, “mini”]) — Các phương pháp khởi tạo khác nhau tương ứng với các biến thể MiSS khác nhau. Mặc định (balance), phương pháp hiệu quả và tổng quát nhất trong MiSS sẽ được sử dụng. ‘bat’: Ở chế độ này, bạn có thể bật các cập nhật phi tuyến tính trên các shard khác nhau. ‘mini’: Ở chế độ này, bạn có thể đặt rank nhỏ hơn để sử dụng ít tham số có thể huấn luyện hơn, nhưng được khuyến nghị giữ out_features % mini_r == 0.
  • layers_to_transform (Union[List[int], int]) — Các chỉ số lớp cần biến đổi. Nếu truyền vào một danh sách các số nguyên, adapter sẽ được áp dụng cho các chỉ số lớp được chỉ định trong danh sách này. Nếu truyền vào một số nguyên duy nhất, các phép biến đổi sẽ được áp dụng cho lớp tại chỉ số này.
  • layers_pattern (str) — Tên mẫu lớp, chỉ được sử dụng nếu layers_to_transform khác None.
  • bias (str) — Bias type for MiSS. Can be 'none', 'all' or 'MiSS_only'.
  • modules_to_save (List[str]) — Danh sách các module ngoài các lớp adapter cần được đặt là có thể huấn luyện và lưu trong checkpoint cuối cùng.

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

MissModel

lớp peft.MissModel

< >

( 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 (torch.nn.Module) — Mô hình mà các lớp adapter tuner sẽ được gắn vào.
  • config (MissConfig) — Cấu hình của mô hình MiSS.
  • 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 MiSS.

Tạo mô hình thích ứng phản xạ Householder (MiSS) từ một mô hình được huấn luyện trước. Phương pháp này được mô tả trong https://huggingface.co/papers/2409.15371

Ví dụ:

>>> from diffusers import StableDiffusionPipeline
>>> from peft import MissModel, MissConfig

>>> config_te = MissConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     init_weights=True,
... )
>>> config_unet = MissConfig(
...     r=8,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = MissModel(model.text_encoder, config_te, "default")
>>> model.unet = MissModel(model.unet, config_unet, "default")

Thuộc tính:

  • model (~torch.nn.Module) — Mô hình cần được thích ứng.
  • peft_config (MissConfig): Cấu hình của mô hình MiSS.
Update on GitHub