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)는 모델 성능과 계산 효율성 사이의 좋은 균형을 달성하는 PEFT 방법입니다. 학습 가능한 단일 행렬만 필요하며, LoRA와 구별되는 샤드 공유 메커니즘을 도입합니다.

해당 논문의 초록은 다음과 같습니다:

매개변수 효율적 미세 조정(PEFT) 방법, 특히 저순위 적응(LoRA)은 대규모 언어 모델(LLM)의 학습 가능 매개변수 수를 효과적으로 줄입니다. 그러나 모델 규모가 계속 커짐에 따라 계산 자원에 대한 수요는 여전히 중요한 과제로 남아 있습니다. 기존 LoRA 변형은 적응성(모델 성능 및 수렴 속도)과 효율성(계산 오버헤드, 메모리 사용량, 초기화 시간) 사이의 최적의 균형을 맞추는 데 어려움을 겪는 경우가 많습니다. 이 논문은 단순한 샤드 공유 메커니즘을 통해 이러한 트레이드오프를 해결하는 새로운 PEFT 접근 방식인 MiSS(Matrix Shard Sharing)를 소개합니다. MiSS는 가중치 행렬을 여러 조각 행렬로 분해하고 공유되는 학습 가능 공통 조각을 활용하면 저순위 적응을 달성할 수 있다는 통찰을 활용합니다. 이 방법은 이러한 공유되고 분할된 샤드의 복제를 통해 저순위 업데이트 행렬을 구성합니다. 또한 MiSS에 대해 하드웨어 효율적이고 광범위하게 적용 가능한 구현을 제안합니다. 다양한 작업에서 수행된 광범위한 실험과 계산 성능에 대한 체계적인 분석은 MiSS의 우수성을 입증합니다. 결과에 따르면 MiSS는 모델 성능 지표와 계산 효율성, 여기에는 초기화 속도와 학습 처리량이 포함됩니다, 모두에서 표준 LoRA와 그 주요 변형보다 현저히 우수한 성능을 보입니다. 표현력과 자원 활용을 효과적으로 균형 있게 조절함으로써, MiSS는 대규모 모델을 효율적으로 적응시키기 위한 설득력 있는 해결책을 제공합니다.

벤치마크 개요

MiSS를 사용할 때

MiSS는 다음 경우에 좋은 선택입니다:

  • PiSSA, LoRA-GA, OLoRA와 같이 비용이 높은 설정을 사용하는 고급 LoRA 초기화 방식보다 더 빠른 초기화와 더 높은 학습 처리량을 원합니다.
  • LoRA의 드롭인 대체안을 최소한의 구성 변경으로 사용하고 싶다면

효율성을 일부 희생하더라도 더 강한 표현력을 필요로 한다면 bat 초기화 변형을 고려해 보세요(아래 참조).

init_weights 모드

MiSS는 init_weights 파라미터를 통해 세 가지 초기화 모드를 지원합니다:

  • True (기본값): 표준 MiSS 초기화. 대부분의 사용 사례에 대한 최적의 시작점입니다.
  • "bat": 서로 다른 shard에 걸쳐 비선형 업데이트를 활성화합니다. 표준 MiSS보다 더 나은 결과를 생성하지만 더 많은 메모리를 사용하며 약 2배 느립니다. 효율성보다 성능이 우선인 경우 이 옵션을 사용하세요.
  • "mini": out_features 차원 방향으로 더 작은 랭크를 사용하며, mini_r로 제어됩니다. 이를 통해 학습 가능한 매개변수를 추가로 줄일 수 있습니다. 이 모드를 사용할 경우 mini_r이 설정되어 있어야 하고, out_features가 mini_r로 나누어떨어져야 합니다.

빠른 시작

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()

학습 및 추론을 포함한 전체 fine-tuning 예제는 MiSS fine-tuning example을 참고하세요.

API

MissConfig

class 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 )

매개변수

  • r (int) — MiSS의 레이어 간 랭크입니다. ‘r’은 짝수로 설정하는 것이 좋습니다. 그렇지 않으면 기본 초기화 방법이 작동하지 않습니다. MiSS의 랭크는 in_features 차원 방향의 저랭크 분해에 해당합니다.
  • miss_dropout (float) — MiSS 레이어의 dropout 확률입니다.
  • mini_r (int) — MiSS의 랭크는 out_features 차원 방향의 저랭크 분해에 해당합니다. init_weights=mini를 설정한 경우 mini_r을 설정해야 합니다. out_features가 mini_r로 나누어떨어지는지 확인하세요.
  • target_modules (Optional[Union[List[str], str]]) — 어댑터를 적용할 모듈의 이름입니다. 이 값이 지정되면, 지정된 이름을 가진 모듈만 교체됩니다. 문자열을 전달하면 정규식 매칭이 수행됩니다. 문자열 목록을 전달하면 정확한 매칭이 수행되거나, 모듈 이름이 전달된 문자열 중 하나로 끝나는지 확인됩니다. 이 값이 ‘all-linear’로 지정되면 출력 레이어를 제외한 모든 선형 모듈이 선택됩니다. 이 값이 지정되지 않으면 모델 아키텍처에 따라 모듈이 선택됩니다. 아키텍처가 알려지지 않은 경우 오류가 발생하며, 이 경우 대상 모듈을 수동으로 지정해야 합니다.
  • exclude_modules (Optional[Union[List[str], str]]) — 어댑터를 적용하지 않을 모듈의 이름입니다. 문자열을 전달하면 정규식 매칭이 수행됩니다. 문자열 목록을 전달하면 정확한 매칭이 수행되거나, 모듈 이름이 전달된 문자열 중 하나로 끝나는지 확인됩니다.
  • init_weights (bool | Literal[“bat”, “mini”]) — 다양한 초기화 방식은 서로 다른 MiSS 변형에 해당합니다. 기본값(balance)은 MiSS에서 가장 효율적이고 일반적인 방법을 사용합니다. ‘bat’: 이 모드에서는 서로 다른 샤드 간에 비선형 업데이트를 활성화할 수 있습니다. ‘mini’: 이 모드에서는 학습 가능한 매개변수를 줄이기 위해 더 작은 랭크를 설정할 수 있지만, out_features % mini_r == 0을 유지하는 것이 권장됩니다.
  • layers_to_transform (Union[List[int], int]) — 변환할 레이어의 인덱스입니다. 정수 목록을 전달하면 이 목록에 지정된 레이어 인덱스에 어댑터를 적용합니다. 단일 정수를 전달하면 해당 인덱스의 레이어에 변환을 적용합니다.
  • layers_pattern (str) — layers_to_transform가 None과 다르면만 사용되는 레이어 패턴 이름입니다.
  • bias (str) — MiSS의 Bias 유형입니다. 'none', 'all' 또는 'MiSS_only'를 사용할 수 있습니다.
  • modules_to_save (List[str]) — 어댑터 레이어를 제외한 최종 체크포인트에 학습 가능 상태로 설정되고 저장될 모듈 목록.

이것은 MissModel의 구성을 저장하기 위한 구성 클래스입니다.

MissModel

class 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

매개변수

  • model (torch.nn.Module) — 어댑터 튜너 레이어가 연결될 모델입니다.
  • config (MissConfig) — MiSS 모델의 구성입니다.
  • adapter_name (str) — 어댑터의 이름이며, 기본값은 "default"입니다.
  • low_cpu_mem_usage (bool, optional, 기본값 False) — 메타 디바이스에 빈 어댑터 가중치를 생성합니다. 로딩 프로세스를 가속하는 데 유용합니다.

반환값

torch.nn.Module

MiSS 모델.

사전 학습된 모델에서 Matrix Shard Sharing(MiSS) 모델을 생성합니다. 해당 방법은 https://huggingface.co/papers/2409.15371에 설명되어 있습니다.

예:

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

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

속성:

  • model (~torch.nn.Module) — 적응할 모델.
  • peft_config (MissConfig): MiSS 모델의 구성입니다.
Update on GitHub