PEFT documentation
VeRA: 벡터 기반 랜덤 매트릭스 적응
VeRA: 벡터 기반 랜덤 매트릭스 적응
VeRA는 LoRA와 유사한 매개변수 효율적 파인튜닝 기법으로, 추가 매개변수가 훨씬 적으면서도 유사하거나 더 나은 성능을 제공합니다. 따라서 매개변수 예산이 매우 제한적인 경우, 예를 들어 매우 큰 모델로 확장할 때 특히 유용합니다. 학습 가능한 매개변수 수의 감소는 모든 레이어에 동일한 저랭크 행렬을 공유하고 레이어당 두 개의 추가 벡터만 학습함으로써 달성됩니다.
VeRA의 작동 방식
LoRA는 각 적응 대상 레이어마다 두 개의 작은 저랭크(low-rank) 행렬을 학습하여 동결된 베이스 모델을 업데이트합니다. 랭크(rank)는 이 행렬들의 내부 차원이며, 어댑터가 가지는 용량을 제어합니다. LoRA에서 r을 증가시키거나 더 많은 레이어를 적응시키면, 각 적응 대상 레이어가 자체적인 저랭크 행렬 쌍을 학습하기 때문에 학습 가능한 매개변수의 수가 빠르게 증가합니다.
VeRA는 동일한 저랭크 적응(low-rank adaptation) 아이디어를 유지하되 학습 대상 파라미터를 변경합니다. 모든 레이어에 대해 별도의 저랭크 행렬을 학습하는 대신, VeRA는 레이어 간에 공유되는 하나의 동결된(frozen) 무작위 초기화 저랭크 행렬 쌍 A와 B를 사용합니다. 각 적응(adapted) 레이어는 vera_lambda_d와 vera_lambda_b라는 두 개의 스케일링 벡터만 학습하며, 이는 공유 행렬을 다시 스케일링하여 레이어별 업데이트를 생성합니다. vera_lambda_d의 크기가 r이므로, VeRA의 학습 가능 파라미터 수는 여전히 r과 적응 레이어 수에 따라 증가합니다. 그러나 큰 A와 B 행렬이 각 레이어마다 별도로 학습되는 것이 아니라 공유되고 동결되므로, LoRA보다 훨씬 느리게 증가합니다.
이것이 VeRA가 LoRA보다 적은 학습 가능 매개변수를 사용할 수 있는 이유입니다. 논문에서 제시한 단순화된 매개변수 수에 따르면, LoRA는 2 * L_tuned * d_model * r에 비례하며, 여기서 L_tuned는 적응된 레이어의 수, d_model는 모델 차원, r은 랭크를 나타냅니다. VeRA는 L_tuned * (d_model + r)에 비례하는데, 이는 큰 저랭크 행렬이 공유되고 고정된 반면, 더 작은 레이어별 벡터만 학습되기 때문입니다.
어댑터 파라미터를 저장할 때 VeraConfig의 save_projection=False를 설정하여 저랭크 행렬을 저장하지 않을 수 있습니다. 이 경우, projection_prng_key 인자의 고정된 랜덤 시드를 기반으로 해당 행렬이 복원됩니다. 이를 통해 체크포인트의 크기를 줄일 수 있지만, 모든 디바이스와 PyTorch의 모든 향후 버전에서 재현성을 보장할 수 없습니다. 재현성을 보장하려면 save_projection=True를 설정하세요(기본값).
적응된 레이어의 다양한 형태를 처리하기 위해 VeRA는 각 차원에 대해 필요한 최대 크기로 공유 A 및 B 행렬을 초기화합니다. 순전파 과정에서, 주어진 레이어에 대한 부분 행렬 A와 B는 이러한 공유 행렬에서 슬라이싱되어 추출되며, 논문에서 설명된 대로 사용됩니다. 예를 들어, 형태가 (100, 20)과 (80, 50)인 두 개의 선형 레이어를 적응하면, 각각 (rank, 50)과 (100, rank) 형태의 A 및 B 행렬이 생성됩니다. 그런 다음, 형태가 (100, 20)인 레이어를 적응하려면 (rank, 20)과 (100, rank) 형태의 부분 행렬 A와 B가 추출됩니다.
VeRA에는 현재 다음과 같은 제약이 있습니다:
nn.Linear레이어만 지원됩니다.
해당 논문의 초록은 다음과 같습니다:
Low-rank adaptation (LoRA)은 대규모 언어 모델을 fine-tuning할 때 학습 가능한 파라미터의 수를 줄이는 인기 있는 방법이지만, 더 큰 모델로 확장하거나 사용자별 또는 작업별 적응 모델을 다수 배포할 때 여전히 심각한 저장 문제를 직면합니다. 이 연구에서는 Vector-based Random Matrix Adaptation (VeRA)를 제시하며, 이는 LoRA에 비해 학습 가능한 파라미터의 수를 크게 줄이면서도 동일한 성능을 유지합니다. 이는 모든 레이어에 걸쳐 공유되는 단일 저랭크 행렬 쌍을 사용하고 대신 작은 스케일링 벡터를 학습함으로써 달성됩니다. GLUE 및 E2E 벤치마크, 이미지 분류 작업에서의 효과를 입증하고, 7B 및 13B 언어 모델의 instruction-tuning에 이를 적용하는 것을 보여줍니다.
VeRA를 사용할 때
VeRA는 다음 경우에 좋은 선택입니다:
- LoRA와 유사한 성능을 유지하면서 학습 가능한 매개변수의 수를 최소화하는 것이 목표입니다.
- 여러 개의 작업별 어댑터를 저장하거나 배포해야 하며, 더 작은 어댑터 체크포인트가 저장 요구 사항을 줄여야 하는 경우
- 엄격한 메모리 또는 파라미터 예산 내에서 매우 대규모 언어 모델을 파인튜닝하는 경우입니다.
VeRA를 사용하지 않는 경우
다음과 같은 경우 VeRA가 최선의 선택이 아닐 수 있습니다:
- 적용된 각 레이어에 대해 독립적인 저순위(low-rank) 행렬이 필요하며, 이는 학습된 어댑터 파라미터에 대해 더 큰 유연성을 제공합니다.
nn.Linear이외의 모듈 유형을 적용해야 하므로, 현재 VeRA는 선형 레이어만 지원합니다.- 모델에는 입력 차원과 출력 차원이 크게 다른 적응형 선형 레이어가 포함되어 있습니다. VeRA는 모든 적응형 레이어에 동일한 투영 행렬 쌍을 공유하므로, 이 행렬은 가장 큰 형태에 맞춰 크기가 결정되어야 합니다. 따라서 레이어 형태가 크게 변하는 모델(예: transformer의 업-프로젝션 및 다운-프로젝션 레이어)의 경우, 공유 투영 행렬에 대한 과도한 할당이 필요할 수 있으며, 이로 인해 VeRA의 매개변수 효율성 이점이 일부 감소할 수 있습니다.
벤치마크 개요
API
VeRAConfig
클래스 peft.VeraConfig
< source >( 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 = 256target_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truevera_dropout: float = 0.0d_initial: float = 0.1fan_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]] = None )
매개변수
- r (
int, 선택 사항, 기본값256) — VeRA 매개변수 차원(“rank”). LoRA 랭크보다 높은 값을 선택하십시오. VeRA는 LoRA보다 훨씬 적은 매개변수를 사용하기 때문입니다(표 1 참조). - target_modules (
Union[List[str], str]) — Vera를 적용할 모듈의 이름입니다. 선형 레이어만 지원됩니다. - projection_prng_key (
int) — Vera PRNG 초기화 키입니다. 새로운 모델에서 vera_A와 vera_B를 초기화하거나, 이러한 투영이 포함되지 않은 체크포인트를 로드할 때 사용됩니다. 기본값은0입니다. - save_projection (
bool) — state dict에 per layer lambda_b / lambda_d 가중치와 함께 vera_A / vera_B 투영을 저장할지 여부입니다. 이는 체크포인트 크기를 증가시키지만, 모든 시스템 구성에서 체크포인트를 다시 로드할 수 있음을 보장합니다. 기본값은True입니다. - vera_dropout (
float) — Vera 레이어의 dropout 확률입니다. - d_initial (
float, 선택 사항, 기본값0.1) — VeRA 매개변수를 초기화할 때vera_lambda_d벡터에 사용되는 초기 init 값. 작은 값(<=0.1)을 권장합니다(논문 Table 6c 참조). - fan_in_fan_out (
bool) — 교체할 레이어가 가중치를 (fan_in, fan_out) 형태로 저장하는 경우 True로 설정합니다. 예를 들어, gpt-2는 가중치를 (fan_in, fan_out) 형태로 저장하는Conv1D를 사용하므로 이 값을True로 설정해야 합니다. - bias (
str) — Vera의 bias 유형입니다. ‘none’, ‘all’, ‘vera_only’ 중 하나를 지정할 수 있습니다. ‘all’ 또는 ‘vera_only’로 설정하면 해당 bias가 학습 중에 업데이트됩니다. 어댑터를 비활성화하더라도, 어댑팅이 적용되지 않은 기본 모델과 동일한 출력을 생성하지 않는다는 점에 유의하세요. - modules_to_save (
List[str]) — Vera 레이어를 제외한 최종 체크포인트에 저장할 학습 가능 모듈 목록. - init_weights (
bool) — Vera 레이어의 가중치를 기본 초기화로 초기화할지 여부입니다. 정확히 무엇을 하는지 알고 있는 경우를 제외하고는 이 설정을 변경하지 마세요. - layers_to_transform (
Union[List[int],int]) — 변환할 레이어의 인덱스입니다. 이 인수가 지정되면, 해당 목록에 명시된 레이어 인덱스에 Vera 변환을 적용합니다. 단일 정수가 전달되면, 해당 인덱스의 레이어에 Vera 변환을 적용합니다. - layers_pattern (
Optional[Union[List[str], str]]) —layers_to_transform가None과 다르면만 사용되는 레이어 패턴 이름입니다. 이는 모델의nn.ModuleList를 대상으로 해야 하며, 보통'layers'또는'h'라고 불립니다.
이것은 VeraModel의 구성을 저장하기 위한 구성 클래스입니다.
VeRAModel
class peft.VeraModel
< source >( 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 (VeraConfig) — Vera 모델의 구성입니다.
- adapter_name (
str) — 어댑터의 이름이며, 기본값은"default"입니다. - low_cpu_mem_usage (
bool,optional, 기본값False) — 메타 디바이스에 빈 어댑터 가중치를 생성합니다. 로딩 프로세스를 가속하는 데 유용합니다.
반환값
torch.nn.Module
Vera 모델.
pretrained transformers model에서 Vector-based Random Matrix Adaptation (Vera) 모델을 생성합니다.
예:
>>> from transformers import AutoModelForCausalLM
>>> from peft import VeraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VeraConfig(r=128)
>>> model = get_peft_model(base_model, config)속성:
- model (PreTrainedModel) — 적응할 모델.
- peft_config (VeraConfig): Vera 모델의 구성입니다.