PEFT documentation

Sparse High Rank Adapters

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

Sparse High Rank Adapters

Sparse High Rank Adapters 또는 SHiRA는 대안적인 유형의 어댑터로, 저 랭크 어댑터보다 상당한 이점이 있는 것으로 확인되었습니다. 구체적으로 SHiRA는 다양한 비전 및 언어 작업에서 LoRA보다 더 높은 정확도를 달성합니다. 또한, 저 랭크 어댑터에서 흔히 발생하는 개념 손실 문제를 크게 줄임으로써 더 단순하고 고품질의 다중 어댑터 융합을 제공합니다. SHiRA는 베이스 모델의 소수의 파라미터를 직접 미세 조정하여 모델이 어떤 적응 작업이든 수행할 수 있도록 합니다.

SHiRA에는 현재 다음과 같은 제약이 있습니다:

  • nn.Linear 레이어만 지원됩니다.

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

Low Rank Adaptation (LoRA)는 최근 생성형 AI 연구에서 큰 주목을 받고 있습니다. LoRA의 주요 장점 중 하나는 사전 학습된 모델과 융합(fused)될 수 있어 추론 시 오버헤드를 추가하지 않는다는 것입니다. 그러나 모바일 배포 관점에서는 융합 모드에서 추론 오버헤드를 피할 수 있지만 어댑터를 빠르게 전환하는 능력을 잃거나, 비융합(unfused) 모드에서 빠른 전환을 가능하게 하는 대신 상당한(최대 30% 높음) 추론 지연을 감수해야 합니다. 또한 LoRA는 여러 어댑터를 동시에 사용할 때 개념 손실(concept-loss)을 보입니다. 본 논문에서는 추론 오버헤드가 없고, 빠른 전환을 지원하며, 개념 손실을 크게 줄이는 새로운 패러다임인 Sparse High Rank Adapters (SHiRA)를 제안합니다. 구체적으로 SHiRA는 기본 모델 가중치의 1~2%만 직접 조정하고 나머지는 변경하지 않는 방식으로 학습할 수 있습니다. 이를 통해 융합 모드에서 직접 전환할 수 있는 고도로 희소한(sparse) 어댑터가 생성됩니다. 또한 SHiRA의 높은 희소성이 개념 손실을 줄여 다중 어댑터 융합에 어떻게 도움이 되는지에 대한 이론적 및 경험적 통찰을 제공합니다. LVM과 LLM에 대한 광범위한 실험을 통해, 기본 모델의 매개변수 중 일부만 미세 조정하는 것이 LoRA보다 훨씬 우수한 성능을 내면서 빠른 전환과 다중 어댑터 융합을 모두 가능하게 한다는 것을 입증했습니다. 마지막으로, Parameter-Efficient Finetuning (PEFT) Library에 기반한 지연 시간 및 메모리 효율적인 SHiRA 구현을 제공합니다. 이 구현은 LoRA와 거의 동일한 속도로 학습하는 동시에 최대 16% 낮은 피크 GPU 메모리를 소비하여 SHiRA가 실제 사용 사례에 쉽게 채택될 수 있게 합니다. 추론 중 빠른 전환의 이점을 시연하기 위해, CPU에서 SHiRA를 기본 모델에 로드하는 것이 LoRA 융합보다 5배에서 16배까지 빠를 수 있음을 보여줍니다.

벤치마크 개요

API

ShiraConfig

클래스 peft.ShiraConfig

< >

( 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 = 32mask_type: Literal['random'] = 'random'random_seed: Optional[int] = Nonetarget_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falseinit_weights: bool = Truemodules_to_save: Optional[list[str]] = None )

매개변수

  • r (int, 선택 사항, 기본값 32) — 주어진 대상 모듈에 대해 SHiRA 매개변수의 수는 r(m+n)으로 계산되며, 여기서 m x n은 원래 텐서의 차원입니다. 이는 SHiRA 매개변수의 수가 LoRA 어댑터의 매개변수 수와 동일하다는 것을 의미합니다. SHiRA는 고 랭크(high rank) 어댑터입니다. 이 r 매개변수를 설정해도 랭크가 해당 값으로 제한되지 않습니다.
  • mask_type (str, 기본값 random) — 마스크 함수의 유형입니다. 기본값은 랜덤 스파스 마스크입니다. config = ShiraConfig(...)를 인스턴스화한 후 config.mask_fn = <your custom mask function>를 설정하여 마스크 값을 계산하는 사용자 정의 mask_fn을 선택적으로 제공할 수도 있습니다. shape가 m x n인 사전 학습된 가중치의 경우, 커스텀 마스크 함수는 선형 레이어의 경우 num_shira_parameters = r(m + n)을 만족하는 바이너리 0 또는 1인 단일 마스크(shape: m x n)만 반환해야 합니다. 마스크의 Device와 dtype은 베이스 레이어의 가중치와 동일해야 합니다. 자세한 내용 및 기본 랜덤 스파스 마스크 구현은 mask_functions.py를 참고하세요.
  • random_seed (int, 선택 사항, 기본값 None) — random_mask를 위한 torch 생성기의 랜덤 시드입니다.
  • target_modules (Union[List[str], str]) — SHiRA로 교체할 모듈 이름의 목록 또는 모듈 이름의 정규식 표현입니다. 예를 들어, [‘q’, ‘v’] 또는 ‘.decoder.(SelfAttention|EncDecAttention).*(q|v)$‘. 선형 레이어만 지원됩니다.
  • fan_in_fan_out (bool) — 교체할 레이어가 가중치를 (fan_in, fan_out) 형태로 저장하는 경우 True로 설정합니다. 예를 들어, gpt-2는 가중치를 (fan_in, fan_out) 형태로 저장하는 Conv1D를 사용하므로 이 값을 True로 설정해야 합니다.
  • init_weights (bool, 기본값 True) — SHiRA 가중치를 0 값으로 초기화합니다. False로 설정하면 SHiRA 가중치가 0 대신 randn 값으로 초기화되며, 이는 테스트 용도로만 사용됩니다.
  • modules_to_save (List[str]) — SHiRA 레이어를 제외한 최종 체크포인트에 저장할 학습 가능 모듈 목록.

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

ShiraModel

class peft.ShiraModel

< >

( 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 (PreTrainedModel) — 적응할 모델.
  • config (ShiraConfig) — SHiRA 모델의 구성입니다.
  • adapter_name (str) — 어댑터의 이름이며, 기본값은 "default"입니다.

반환값

torch.nn.Module

SHiRA 모델.

pretrained 모델에서 Sparse High Rank Adapter (SHiRA) 모델을 생성합니다.

예:

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

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

속성:

Update on GitHub