PEFT documentation

RandLora: 대규모 모델의 전체 랭크 매개변수 효율적 미세 조정

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

RandLora: 대규모 모델의 전체 랭크 매개변수 효율적 미세 조정

RandLora는 LoRA와 VeRA와 유사한 매개변수 효율적 파인튜닝 기법이지만, 성능을 향상시키기 위해 전체 랭크 업데이트를 수행합니다. RandLora는 LoRA의 매개변수 효율성을 유지하면서 복잡한 업데이트가 필요한 어려운 작업에 대규모 모델을 적용할 때 특히 유용할 수 있습니다. RandLora의 전체 랭크 업데이트는 무작위 기저를 선형적으로 스케일링하여 달성됩니다. 무작위 기저는 매개변수 행렬의 전체 랭크보다 크거나 같은 랭크의 합을 갖도록 설계된 여러 저랭크 행렬의 집합입니다. RandLora의 학습 가능한 매개변수는 VeRA의 업데이트 방식과 유사하게, 우측의 저랭크 무작위 기저와 곱해지는 두 개의 대각 행렬(벡터)입니다. 낮은 메모리 사용량을 유지하기 위해 RandLora는 역전파를 위해 불필요한 기저를 메모리에 저장하지 않도록 방지하는 사용자 정의 함수를 사용합니다.

RandLora는 다른 LoRA 계열 PEFT 알고리즘과 달리, RandLora의 무작위 기본 랭크를 증가시키면 학습 가능한 매개변수의 양이 증가한다는 주목할 만한 차이를 보입니다. RandLora에서는 기본 벡터의 수 x 기본 벡터 랭크가 일정하므로, 랭크를 줄이면 무작위 기본 벡터의 수가 증가하고, 따라서 기본 벡터별 학습 가능한 대각 기본 벡터의 수도 증가합니다.

RandLora의 랜덤 베이스 랭크를 낮추면 그 수가 증가하므로, 일반적으로 4 미만인 매우 작은 랭크에서는 학습 시간이 크게 증가하여 LoRA보다 학습이 느려질 수 있습니다. 그러나 추론에는 영향을 미치지 않습니다. RandLora 어댑터는 사전 학습된 가중치 행렬에 병합할 수 있기 때문입니다.

RandLora는 또한 희소 3원(random) 베이스(-1, 0, 1만 포함)를 사용한 학습을 지원합니다. 이러한 베이스는 Bingham et al. 및 Ping et al.에서 설명된 것과 같으며, 이론적으로 행렬 곱셈 대신 집합 연산을 수행하여 가중치 업데이트를 생성함으로써 계산 요구량을 줄이는 데 사용할 수 있습니다. 현재 이는 지원되지 않습니다. 현재 계산량을 줄이지는 않지만, RandLora에서 희소 random 베이스를 사용하면 일부 경우 과적합을 줄일 수 있습니다. 희소 3원 베이스 사용을 고려하는 사용자에게는 성능을 저하시킬 수 있는 very_sparse 옵션보다 sparse 옵션을 권장합니다.

VeRA와 마찬가지로, RandLora의 매개변수를 저장할 때 VeraConfig에서 save_projection=False를 설정하여 저랭크 행렬을 저장하지 않을 수 있습니다. 이 경우, projection_prng_key 인자의 고정된 랜덤 시드를 기반으로 해당 행렬이 복원됩니다. 이를 통해 체크포인트의 크기를 줄일 수 있지만, 모든 장치 및 PyTorch의 모든 향후 버전에서 재현성을 보장할 수 없습니다. 재현성을 보장하려면 save_projection=True를 설정하세요(기본값).

Vera와 마찬가지로, 적응된 레이어의 서로 다른 형태를 처리하기 위해 RandLora는 각 차원에 대해 필요한 최대 크기로 공유 A 및 B 행렬을 초기화합니다. 순전파 과정에서, 주어진 레이어에 대한 부분 행렬 A와 B는 이러한 공유 행렬에서 슬라이싱되어 추출되며, 논문에서 설명된 대로 사용됩니다. 예를 들어, 형태가 (100, 20)과 (80, 50)인 두 개의 선형 레이어를 적응하면, 각각 (rank, 50)과 (100, rank) 형태의 A 및 B 행렬이 생성됩니다. 그런 다음, 형태가 (100, 20)인 레이어를 적응하려면, (rank, 20)과 (100, rank) 형태의 부분 행렬 A와 B가 추출됩니다.

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

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

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

Low-Rank Adaptation(LoRA) 및 그 변형은 미세 조정 성능을 유지하면서 대규모 transformer 네트워크의 학습 가능 매개변수 수와 메모리 요구 사항을 줄이는 데 인상적인 결과를 보여주었습니다. 그러나 가중치 업데이트의 저랭크(low-rank) 특성은 미세 조정된 모델의 표현력을 본질적으로 제한하여 복잡한 작업에서 성능을 저하시킬 수 있습니다. 이는 중요한 질문을 제기합니다. LoRA와 표준 미세 조정 간의 성능 격차가 관찰될 때, 이는 학습 가능 매개변수 수의 감소 때문인지, 아니면 랭크 결핍(rank deficiency) 때문인지? 이 논문은 학습된 저랭크, 비학습 가능(non-trainable) 무작위 행렬의 선형 결합을 사용하여 전체 랭크(full-rank) 업데이트를 수행하는 매개변수 효율적 방법인 RandLora를 소개하여 이 질문에 답하고자 합니다. 우리의 방법은 고정된 무작위 행렬에 적용되는 대각 스케일링 행렬로 최적화를 제한함으로써 학습 가능 매개변수 수를 제한합니다. 이를 통해 학습 중 매개변수 및 메모리 효율성을 유지하면서 저랭크 제한을 효과적으로 극복할 수 있습니다. 비전, 언어, 비전-언어 벤치마크에 걸친 광범위한 실험을 통해 LoRA와 기존 무작위 기저(random basis) 방법의 한계를 체계적으로 평가했습니다. 우리의 발견에 따르면, 전체 랭크 업데이트는 비전 및 언어 작업 각각에서 이롭고, 특히 비전-언어 작업에서는 표준 미세 조정과 LoRA 간의 성능 격차를 크게 줄이거나 때로는 제거하여 그 효용성을 입증합니다.

벤치마크 개요

API

RandLoraConfig

class peft.RandLoraConfig

< >

( 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 = 32target_modules: list[str] | str | None = Noneprojection_prng_key: int = 0save_projection: bool = Truesparse: bool = Falsevery_sparse: bool = Falserandlora_dropout: float = 0.0fan_in_fan_out: bool = Falserandlora_alpha: int = 640bias: 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, 선택 사항, 기본값 32) — RandLora의 무작위 기저 랭크 차원입니다. Lora와 달리 이 매개변수는 학습 가능한 매개변수의 양에 반비례하며, 값을 줄이면 학습 가능한 매개변수가 증가합니다.
  • target_modules (Union[list[str], str]) — RandLora를 적용할 모듈의 이름입니다. 선형 레이어만 지원됩니다.
  • projection_prng_key (int) — RandLora PRNG 초기화 키입니다. 새로운 모델에서 basis_A와 basis_B를 초기화하거나, 이러한 투영이 포함되지 않은 체크포인트를 로드할 때 사용됩니다. 기본값은 0입니다.
  • save_projection (bool) — state dict에 레이어별 lambda / gamma 대각 행렬과 함께 전역 basis_A / basis_B 무작위 기저를 저장할지 여부입니다. 이는 체크포인트의 크기를 증가시키지만, 모든 시스템 구성에서 체크포인트를 다시 로드할 수 있음을 보장합니다. 기본값은 True입니다.
  • sparse (bool) — RandLora 논문에서 설명한 대로 sparse random bases를 사용할지 여부입니다. 이 bases는 삼항 sparse bases(-1, 0, 1만 포함)이며, -1과 1의 attribution probability는 1/6, 0의 attribution probability는 2/3입니다. 이러한 sparse matrices는 향후 matmul free computation에 사용될 것을 목표로 하며, https://huggingface.co/papers/2406.02528v1를 참고하세요. 현재 구현은 개념 증명 수준이며, sparseness를 활용하여 속도나 메모리 사용량을 개선하지 않습니다. sparse matrices를 사용하는 것은 일반적으로 성능 저하를 일으키지 않으며 오히려 과적합을 줄이는 데 도움이 될 수 있습니다. 기본값은 False입니다.
  • very_sparse (bool) — RandLora 논문에서 설명된 대로 매우 희소한 랜덤 베이스를 사용할지 여부입니다. 매우 희소한 베이스는 가장 작은 차원이 d인 행렬에 대해 삼항 희소 베이스(-1, 0, 1만 포함)이며, -1과 1의 귀속 확률은 1/√D, 0의 귀속 확률은 1- 2/√D입니다. 이러한 희소 행렬을 사용하면 sparse 대안보다 과적합을 추가로 줄일 수 있지만, 결과적으로 성능이 감소할 가능성이 높습니다. 신중하게 사용하세요. 기본값은 False입니다.
  • randlora_dropout (float) — RandLora 레이어의 dropout 확률입니다.
  • randlora_alpha (float) — RandLora 레이어의 스케일링 계수입니다. 일반적으로 랭크의 20배가 됩니다. randlora_alpha 계수는 기본적으로 큰 값이므로, 특히 학습률이 높은 경우 수치적 불안정성을 초래할 수 있습니다. 학습이 불안정하다면 학습률 또는 randlora_alpha 계수를 줄이는 것을 고려해 보세요.
  • fan_in_fan_out (bool) — 교체할 레이어가 가중치를 (fan_in, fan_out) 형태로 저장하는 경우 True로 설정합니다. 예를 들어, gpt-2는 가중치를 (fan_in, fan_out) 형태로 저장하는 Conv1D를 사용하므로 이 값을 True로 설정해야 합니다.
  • bias (str) — Bias 유형입니다. ‘none’, ‘all’, ‘randlora_only’ 중 하나를 사용할 수 있습니다. ‘all’ 또는 ‘randlora_only’를 선택하면 해당 bias가 학습 중에 업데이트됩니다. 어댑터를 비활성화하더라도, 어댑팅이 적용되지 않은 기본 모델과 동일한 출력을 생성하지 않는다는 점에 유의하세요.
  • modules_to_save (list[str]) — RandLora 레이어를 제외한 최종 체크포인트에 학습 가능 상태로 설정되고 저장될 모듈 목록.
  • init_weights (bool) — RandLora 레이어의 가중치를 기본 초기화로 초기화할지 여부입니다. 정확히 무엇을 하는지 알고 있는 경우를 제외하고는 이 설정을 변경하지 마세요.
  • layers_to_transform (Union[list[int],int]) — 변환할 레이어의 인덱스입니다. 이 인수가 지정되면, 해당 목록에 명시된 레이어 인덱스에 RandLora 변환을 적용합니다. 단일 정수가 전달되면, 해당 인덱스의 레이어에 RandLora 변환을 적용합니다.
  • layers_pattern (str) — layers_to_transform가 None과 다르고 레이어 패턴이 공통 레이어 패턴에 없는 경우에만 사용되는 레이어 패턴 이름입니다.

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

논문: https://huggingface.co/papers/2502.00987.

RandLoraModel

class peft.RandLoraModel

< >

( 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 (RandLoraConfig) — RandLora 모델의 구성입니다.
  • adapter_name (str) — 어댑터의 이름이며, 기본값은 "default"입니다.
  • low_cpu_mem_usage (bool, optional, 기본값 False) — 메타 디바이스에 빈 어댑터 가중치를 생성합니다. 로딩 프로세스를 가속하는 데 유용합니다.

반환값

torch.nn.Module

RandLora 모델.

pretrained transformers model에서 RandLoRA 모델을 생성합니다.

예:

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

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

속성:

Update on GitHub