PEFT documentation

FRoD: 회전 자유도를 활용한 전체 랭크 효율적 파인튜닝

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

FRoD: 회전 자유도를 활용한 전체 랭크 효율적 파인튜닝

FRoD는 공유된 full-rank basis와 희소(sparse)한 학습 가능한 회전 자유도를 결합하는 매개변수 효율적 fine-tuning 방법입니다. 어댑터 업데이트는 고정된 투영 텐서와 학습 가능한 계수를 통해 표현되며, 이를 통해 FRoD는 학습된 매개변수의 수를 적게 유지하면서 full-rank 업데이트를 적용할 수 있습니다.

논문: Full-Rank Efficient Fine-Tuning with Rotational Degrees.

어댑터 파라미터를 저장할 때 FrodConfig에서 save_projection=False를 설정하여 투영 텐서 저장을 생략할 수 있습니다. 이 경우 투영은 베이스 모델 가중치와 projection_prng_key의 고정된 랜덤 시드로부터 복원됩니다. 이를 통해 체크포인트 크기를 줄일 수 있지만, 체크포인트 로딩이 재생성 세부 사항에 의존하지 않도록 기본값은 save_projection=True입니다.

LoRA와 비교하면, FRoD는 대각 계수와 희소 오프-대각 회전 계수만 학습하면서도 각 적응된 선형 계층에서 전체 랭크 업데이트를 표현할 수 있습니다. 이는 저랭크 업데이트가 지나치게 제한적인 경우에 유용할 수 있습니다. 단, FRoD는 어댑터 주입 시 기본 가중치에서 고정 투영 텐서를 계산하므로, 설정 비용이 더 높고 LoRA보다 구현 지원 범위가 넓지 않습니다.

대형 모델에서 FRoD는 어댑터를 주입하기 전에 대상 모듈 범주에 대해 행렬 분해를 수행하므로, Projection 초기화가 느릴 수 있습니다. 기본적으로 진행 표시줄이 표시되며, FrodConfig(progressbar=False)를 사용하여 비활성화할 수 있습니다.

메모리가 제한적인 학습 환경에서 runtime_offload_base_weight=True를 사용하면 활성 FRoD 경로가 해당 가중치를 필요로 하지 않을 때 대상 기반 가중치를 CPU에 유지합니다. 이는 선택적 옵션으로, PEFT 방식은 일반적으로 모델 이동 및 순전파 이후에도 모든 기반 매개변수를 가속기에 유지하기 때문입니다.

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

  • nn.Linear와 transformers.pytorch_utils.Conv1D 레이어만 지원됩니다.

빠른 시작

from transformers import AutoModelForSequenceClassification

from peft import FrodConfig, TaskType, get_peft_model

model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-uncased", num_labels=2)

peft_config = FrodConfig(
    task_type=TaskType.SEQ_CLS,
    target_modules=["query", "value"],
    modules_to_save=["classifier"],
    sparse_rate=0.02,
    frod_dropout=0.0,
    runtime_offload_base_weight=True,
)

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

FrodConfig

클래스 peft.FrodConfig

< >

( 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 = Falsetarget_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truefrod_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonesparse_rate: float = 0.01regularization_alpha: float = 0.001progressbar: bool = Trueruntime_offload_base_weight: bool = False )

매개변수

  • target_modules (Union[List[str], str]) — FRoD를 적용할 모듈의 이름입니다. 선형 레이어만 지원됩니다.
  • projection_prng_key (int) — 희소 FRoD COO 패턴을 초기화할 때 사용되는 랜덤 시드.
  • save_projection (bool) — state dict에 FRoD projection 텐서를 저장할지 여부입니다. 체크포인트 크기가 증가하지만 로컬 캐시 재생성 없이 어댑터를 다시 로드할 수 있습니다. 기본값은 True입니다.
  • frod_dropout (float) — FRoD 레이어의 dropout 확률입니다.
  • fan_in_fan_out (bool) — 교체할 레이어가 가중치를 (fan_in, fan_out) 형태로 저장하는 경우 True로 설정합니다. 예를 들어, gpt-2는 가중치를 (fan_in, fan_out) 형태로 저장하는 Conv1D를 사용하므로 이 값을 True로 설정해야 합니다.
  • bias (str) — FRoD의 bias 유형입니다. ‘none’, ‘all’, ‘frod_only’ 중 하나를 지정할 수 있습니다. ‘all’ 또는 ‘frod_only’로 설정하면 해당 bias가 학습 중에 업데이트됩니다. 어댑터를 비활성화하더라도, 어댑팅이 적용되지 않은 기본 모델과 동일한 출력을 생성하지 않는다는 점에 유의하세요.
  • modules_to_save (List[str]) — FRoD 레이어를 제외한 최종 체크포인트에 저장할 학습 가능 모듈 목록.
  • init_weights (bool) — FRoD 레이어의 가중치를 기본 초기화로 초기화할지 여부입니다. 정확히 무엇을 하는지 알고 있는 경우를 제외하고는 이 설정을 변경하지 마세요.
  • layers_to_transform (Union[List[int],int]) — 변환할 레이어의 인덱스입니다. 이 인수가 지정되면, 해당 목록에 명시된 레이어 인덱스에 FRoD 변환을 적용합니다. 단일 정수가 전달되면, 해당 인덱스의 레이어에 FRoD 변환을 적용합니다.
  • layers_pattern (Optional[Union[List[str], str]]) — layers_to_transform가 None과 다르면만 사용되는 레이어 패턴 이름입니다. 이는 모델의 nn.ModuleList를 대상으로 해야 하며, 보통 'layers' 또는 'h'라고 불립니다.
  • sparse_rate (float) — 희소 학습 가능 회전 행렬의 대각 성분 외 항목 비율입니다. 값이 높을수록 용량과 학습 가능 매개변수가 증가하고, 값이 낮을수록 비용이 저렴합니다. 기본값은 0.01입니다.
  • regularization_alpha (float) — 기본 가중치로부터 공유 기저를 구성할 때 사용되는 작은 양수입니다. 같은 범주에 속한 레이어들의 가중치가 상관관계를 가질 때 행렬 역원을 안정화하는 데 사용됩니다. 기본값은 1e-3입니다.
  • progressbar (bool) — FRoD 투영을 구축하는 동안 진행 표시줄을 표시할지 여부입니다. 투영 초기화는 대상 모듈 범위에 대해 행렬 분해를 실행하기 때문에 대규모 모델에서 느릴 수 있습니다. 기본값은 True입니다.
  • runtime_offload_base_weight (bool) — 활성 FRoD 경로가 대상 기반 가중치를 필요로 하지 않을 때 CPU에 유지할지 여부입니다. FRoD가 적응된 가중치를 직접 재구성하므로 GPU 메모리를 줄일 수 있지만, 모델을 이동하거나 forward를 실행한 후 모든 기반 매개변수가 가속기에 남아 있어야 한다는 일반적인 PEFT 규약을 변경합니다. 기본값은 False입니다.

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

논문: https://doi.org/10.1609/aaai.v40i31.39813.

FrodModel

class peft.FrodModel

< >

( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )

Update on GitHub