PEFT documentation

GraLoRA

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

GraLoRA

Granular Low-Rank Adaptation (GraLoRA)는 양자화에서 잘 알려진 문제점들에서 얻은 통찰을 바탕으로, 저랭크 적응의 표현력을 강화하고 아웃라이어 활성화에 대한 견고성을 향상시키기 위해 설계된 PEFT 방법입니다.

GraLoRA Overview

전체 특징 공간에 단일 저순위 어댑터를 적용하는 표준 LoRA와 달리, GraLoRA는 구조적이고 세밀한 적응 방식을 도입합니다. 적응 공간을 𝑘2𝑘^2 개의 더 작고 독립적인 어댑터 쌍으로 나누며, 각 어댑터는 입력 및 출력 차원의 국소화된 부분 집합을 담당합니다. 그 결과, 각 어댑터는 원래 LoRA 어댑터보다 두 차원 모두에서 kk 배 더 작은 부분 공간에서 작동합니다.

이러한 세분화된 분해는 공간적으로 국소화되고 컨텍스트를 인지하는 업데이트를 가능하게 하여, 추가적인 파라미터나 계산 비용 없이 표현 용량을 효과적으로 높입니다. 작은 부분 공간 내에서 극단적 활성화의 영향을 분리함으로써, GraLoRA는 적응 과정에서 기울기 왜곡을 완화하고 채널 간 균형을 유지합니다.


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

Low-Rank Adaptation (LoRA)은 생성 모델의 매개변수 효율적 미세 조정(PEFT)을 위한 인기 있는 방법으로, 단순함과 효과성으로 인해 높은 평가를 받고 있습니다. 최근의 개선에도 불구하고, LoRA는 여전히 근본적인 한계를 가지고 있습니다. 즉, 병목이 넓어질 때 과적합이 발생하는 것입니다. LoRA는 랭크 32~64에서 가장 좋은 성능을 발휘하지만, 더 높은 랭크에서는 정확도가 정체되거나 오히려 하락하여 여전히 완전 미세 조정(FFT) 성능에 미치지 못합니다. 우리는 이러한 근본 원인이 LoRA의 구조적 병목에 있으며, 이는 관련 없는 입력 채널에 기울기 얽힘을 도입하고 기울기 전파를 왜곡시킨다고 파악했습니다. 이를 해결하기 위해, 우리는 새로운 구조인 Granular Low-Rank Adaptation (GraLoRA)을 소개합니다. GraLoRA는 가중치 행렬을 서브 블록으로 분할하고, 각 서브 블록에 자체적인 저랭크 어댑터를 적용합니다. 계산 또는 저장 비용이 거의 증가하지 않는 상태에서, GraLoRA는 LoRA의 한계를 극복하고 표현 용량을 효과적으로 증가시키며, FFT 동작을 더 밀접하게 근사합니다. 코드 생성, 상식 추론, 수학 추론, 일반 언어 이해, 이미지 생성 벤치마크에 대한 실험 결과, GraLoRA는 LoRA 및 다른 베이스라인을 일관되게 능가하며, HumanEval+에서 Pass@1 기준으로 최대 +8.5%의 절대적 향상을 달성했습니다. 이러한 개선은 모델 크기와 랭크 설정 전반에 걸쳐 유지되어, GraLoRA가 PEFT를 위한 확장 가능하고 견고한 솔루션임을 보여줍니다.

벤치마크 개요

API

GraloraConfig

클래스 peft.GraloraConfig

< >

( 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 = 32hybrid_r: int = 0target_modules: list[str] | str | None = Nonealpha: int = 64gralora_dropout: float = 0.0gralora_k: int = 2fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: list[str] | None = Noneinit_weights: bool = Truelayers_to_transform: list[int] | int | None = Nonelayers_pattern: str | None = None )

매개변수

  • r (int) — GraLoRA attention dimension은 GraLoRA 어댑터의 랭크를 결정합니다. GraLoRA 어댑터의 총 매개변수 수는 동일한 랭크 r을 가진 LoRA와 같지만, 표현력은 gralora_k배로 증가합니다.
  • hybrid_r (int) — Hybrid GraLoRA rank는 Hybrid GraLoRA 방법을 사용할 때 vanilla LoRA 방법에 할당되는 rank를 결정합니다. GraLoRA와 vanilla LoRA의 조합인 Hybrid GraLoRA는 hybrid_r > 0일 때 사용할 수 있습니다. GraLoRA 어댑터의 매개변수 수는 r + hybrid_r입니다.
  • target_modules (Union[List[str], str]) — GraLoRA로 교체할 모듈 이름의 목록 또는 모듈 이름의 정규식 표현입니다. 예를 들어, [‘q’, ‘v’] 또는 ‘.decoder.(SelfAttention|EncDecAttention).*(q|v)$‘입니다. 이는 모든 linear/Conv1D와 일치하는 와일드카드 ‘all-linear’일 수도 있습니다(모델이 PreTrainedModel인 경우 출력 레이어는 제외됩니다). 지정되지 않으면 모델 아키텍처에 따라 모듈이 선택됩니다. 아키텍처가 알려지지 않은 경우 오류가 발생하며, 이 경우 대상 모듈을 수동으로 지정해야 합니다.
  • alpha (int) — GraLoRA alpha. GraLoRA alpha는 GraLoRA 어댑터의 스케일링 계수입니다. 스케일은 alpha / (r + hybrid_r)이 됩니다.
  • gralora_dropout (float) — GraLoRA dropout는 GraLoRA 어댑터의 dropout 확률입니다. 과적합을 방지하고 GraLoRA 어댑터의 일반화 성능을 향상시키는 데 사용됩니다.
  • gralora_k (int) — GraLoRA k는 GraLoRA 어댑터의 서브블록 수를 결정합니다. GraLoRA 어댑터가 유효하려면 랭크 r이 gralora_k로 나누어 떨어져야 합니다. gralora_k와 관계없이 전체 매개변수 수는 유지됩니다. GraLoRA 어댑터의 전체 랭크는 gralora_k만큼 증가하고, 각 서브블록의 랭크는 gralora_k만큼 감소합니다. 랭크가 32 이하인 경우 gralora_k=2를, 랭크가 64 이상인 경우 gralora_k=4를 권장합니다.
  • fan_in_fan_out (bool) — 교체할 레이어가 가중치를 (fan_in, fan_out) 형태로 저장하는 경우 True로 설정합니다. 예를 들어, gpt-2는 가중치를 (fan_in, fan_out) 형태로 저장하는 Conv1D를 사용하므로 이 값을 True로 설정해야 합니다.
  • bias (str) — Bias type for gralora. Can be ‘none’, ‘all’ or ‘gralora_only’. If ‘all’ or ‘gralora_only’, the corresponding biases will be updated during training. Be aware that this means that, even when disabling the adapters, the model will not produce the same output as the base model would have without adaptation.
  • modules_to_save (Optional[list[str]]) — gralora 레이어를 제외한 최종 체크포인트에 학습 가능 상태로 설정되고 저장될 모듈 목록입니다. 예를 들어, 시퀀스 분류 또는 토큰 분류 작업에서 최종 레이어인 classifier/score는 무작위로 초기화되므로 학습 가능 상태로 설정되고 저장되어야 합니다.
  • init_weights (bool) — GraLoRA 레이어의 가중치를 기본 초기화로 초기화할지 여부입니다. 정확히 무엇을 하는지 알고 있는 경우를 제외하고는 이 설정을 변경하지 마세요.
  • layers_to_transform (Union[List[int], int]) — 변환할 레이어 인덱스입니다. 이 인수가 지정되면 PEFT는 이 리스트에 지정된 레이어 인덱스만 변환합니다. 단일 정수가 전달되면 PEFT는 해당 인덱스의 레이어만 변환합니다. 이 기능은 target_modules가 str 리스트일 때만 작동합니다.
  • layers_pattern (Optional[Union[List[str], str]]) — layers_to_transform가 None과 다르고, 해당 레이어 패턴이 공통 레이어 패턴에 포함되지 않는 경우에만 사용되는 레이어 패턴 이름입니다. 이 옵션은 target_modules가 str의 리스트일 때만 동작합니다. 모델의 nn.ModuleList를 대상으로 해야 하며, 이는 보통 'layers' 또는 'h'라고 불립니다.

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

GraloraModel

class peft.GraloraModel

< >

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

반환값

torch.nn.Module

Gralora 모델.

pretrained transformers model에서 Vector 기반 Random Matrix Adaptation(Gralora) 모델을 생성합니다.

예:

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

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

속성:

Update on GitHub