PEFT documentation

VB-LoRA: 벡터 뱅크를 활용한 극단적 파라미터 효율적 파인튜닝

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

VB-LoRA: 벡터 뱅크를 활용한 극단적 파라미터 효율적 파인튜닝

개요

VB-LoRA는 LoRA를 확장하여 서브 벡터 수준에서 세밀한 매개변수 공유 방식을 학습함으로써 매개변수 효율성을 크게 높이는 매개변수 효율적 파인튜닝 기법입니다. 이를 통해 저장 및 전송 비용이 중요한 시나리오에서 특히 유용합니다. K, Q, V, FFN과 같은 서로 다른 레이어 및 모듈의 저랭크 행렬을 서브 벡터로 분해한 후, 이를 벡터 뱅크를 통해 전역적으로 공유하는 방식으로 동작합니다.

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

대형 언어 모델의 도입이 증가하고 사용자별 또는 작업별 모델 커스터마이징에 대한 요구가 커짐에 따라, 저순위 적응(LoRA) 및 그 변형과 같은 매개변수 효율적 미세 조정(PEFT) 방법은 상당한 저장 및 전송 비용을 발생시킵니다. 저장된 매개변수를 더욱 줄이기 위해, 우리는 벡터 뱅크를 통해 매개변수를 전역적으로 공유함으로써 행렬 차원, 모듈 및 레이어 간 저순위 분해의 장벽을 허무는 “나누고 공유하다(divide-and-share)” 패러다임을 소개합니다. 이 패러다임을 LoRA에 적용한 구체적 구현으로, 제안하는 VB-LoRA는 미분 가능한 top-k 혼합 모듈을 사용하여 공유 벡터 뱅크로부터 LoRA의 모든 저순위 행렬을 구성합니다. VB-LoRA는 최첨단 PEFT 방법과 비교하여 동등하거나 더 나은 성능을 유지하면서 극한의 매개변수 효율성을 달성합니다. 광범위한 실험은 VB-LoRA가 자연어 이해, 자연어 생성 및 지시 튜닝 작업에서 효과적임을 입증합니다. Llama2-13B 모델을 미세 조정할 때, VB-LoRA는 LoRA의 저장된 매개변수 중 0.4%만 사용하면서도 우수한 결과를 달성합니다.

사용 팁

  • VB-LoRA는 공유 메커니즘을 학습하기 위해 희소 top-k 모듈을 사용합니다. 어댑터 파라미터를 저장할 때 VBLoRAConfig에서 save_only_topk_weights = True로 설정하여 top-k 가중치와 해당 인덱스만 저장하거나, False로 설정하여 모든 학습 가능한 로짓을 저장할 수 있습니다. save_only_topk_weights = True를 활성화하면 저장 공간이 크게 줄어듭니다. 예를 들어 Llama2-7B의 경우 저장 파일 크기가 308MB에서 2.5MB로 감소합니다. save_only_topk_weights = True로 저장된 모델은 병합 또는 추론에만 사용되며 학습을 재개하는 데 사용할 수 없습니다.

  • VB-LoRA에는 두 가지 학습 매개변수 세트가 있습니다: vector bank 매개변수와 logit 매개변수. 실제로 logit 매개변수는 더 높은 학습률이 필요하고, vector bank 매개변수는 더 낮은 학습률이 필요하다는 것을 발견했습니다. AdamW 옵티마이저를 사용할 때, 일반적인 학습률은 logit의 경우 0.01, vector bank 매개변수의 경우 0.001입니다.

벤치마크 개요

API

VBLoRAConfig

클래스 peft.VBLoRAConfig

< >

( 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 = 4num_vectors: int = 256vector_length: int = 256topk: int = 2target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonesave_only_topk_weights: bool = Falsevblora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_vector_bank_bound: float = 0.02init_logits_std: float = 0.1layers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )

매개변수

  • r (int) — 증분 행렬의 랭크입니다.
  • num_vectors (int) — 벡터 뱅크에 포함된 벡터의 수입니다. 모델 크기가 커지면 더 높은 값을 사용하세요.
  • vector_length (int) — 벡터 뱅크 내 벡터의 길이입니다. 벡터의 길이는 모델의 hidden dimension으로 나누어떨어져야 합니다.
  • topk (int) — top-K 선택을 위한 K 값입니다. K 값이 클수록 저장되는 모델의 크기가 커집니다. 실무에서는 K=2로 설정하는 것이 일반적으로 가장 좋은 성능과 매개변수 효율을 제공합니다. 자세한 내용은 논문의 논의를 참고하세요.
  • target_modules (Union[List[str], str]) — 어댑터를 적용할 모듈의 이름입니다. 이 값이 지정되면, 지정된 이름을 가진 모듈만 교체됩니다. 문자열을 전달하면 정규식 매칭이 수행됩니다. 문자열 목록을 전달하면 정확한 매칭이 수행되거나, 모듈 이름이 전달된 문자열 중 하나로 끝나는지 확인됩니다. 이 값이 ‘all-linear’로 지정되면, 출력 레이어를 제외한 모든 linear/Conv1D 모듈이 선택됩니다. 이 값이 지정되지 않으면, 모델 아키텍처에 따라 모듈이 선택됩니다. 아키텍처가 알려지지 않은 경우 오류가 발생하며, 이 경우 대상 모듈을 수동으로 지정해야 합니다.
  • exclude_modules (Optional[Union[List[str], str]]) — 어댑터를 적용하지 않을 모듈의 이름입니다. 문자열을 전달하면 정규식 매칭이 수행됩니다. 문자열 목록을 전달하면 정확한 매칭이 수행되거나, 모듈 이름이 전달된 문자열 중 하나로 끝나는지 확인됩니다.
  • save_only_topk_weights (bool) — topk 가중치만 저장할지 여부입니다. save_only_topk_weights = True로 설정하면 저장 공간을 크게 줄일 수 있습니다. 그러나 이 모드로 저장된 모델은 학습 재개가 아닌 병합 또는 추론에만 사용할 수 있습니다.
  • vblora_dropout (float) — VBLoRA 레이어의 dropout 확률입니다.
  • fan_in_fan_out (bool) — 교체할 레이어가 가중치를 (fan_in, fan_out) 형태로 저장하는 경우 True로 설정합니다. 예를 들어, gpt-2는 가중치를 (fan_in, fan_out) 형태로 저장하는 Conv1D를 사용하므로 이 값을 True로 설정해야 합니다.
  • bias (str) — Bias type for VBLoRA. Can be ‘none’, ‘all’ or ‘vblora_only’. If ‘all’ or ‘vblora_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 (List[str]) — VBLoRA 레이어를 제외한 최종 체크포인트에 학습 가능 상태로 설정되고 저장될 모듈 목록.
  • init_vector_bank_bound (float) — 벡터 뱅크는 -init_vector_bank_bound와 init_vector_bank_bound 사이의 균등 분포로 초기화됩니다. 제로 그래디언트를 방지하기 위해 벡터 뱅크를 모두 제로로 초기화하지 마세요. 0.02와 같은 작은 값이 일반적으로 효과적입니다. 큰 값으로 초기화하면 학습 불안정성이 발생할 수 있습니다.
  • init_logits_std (float) — logits는 표준편차가 init_logits_std인 정규분포로 초기화됩니다. 기본값은 0.1입니다.
  • layers_to_transform (Union[List[int],int]) — 변환할 레이어의 인덱스입니다. int의 리스트가 전달되면, 해당 리스트에 지정된 레이어 인덱스에 어댑터를 적용합니다. 단일 정수가 전달되면, 해당 인덱스의 레이어에 변환을 적용합니다.
  • layers_pattern (Optional[Union[List[str], str]]) — layers_to_transform가 None과 다르면만 사용되는 레이어 패턴 이름입니다. 이는 모델의 nn.ModuleList를 대상으로 해야 하며, 보통 'layers' 또는 'h'라고 불립니다.

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

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

VBLoRAModel

클래스 peft.VBLoRAModel

< >

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

반환값

torch.nn.Module

VBLoRA 모델.

VBLoRA 모델을 사전 학습된 Transformers 모델에서 생성합니다.

해당 방법은 https://huggingface.co/papers/2405.15179에서 자세히 설명되어 있습니다.

예:

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

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VBLoRAConfig(
...     task_type="SEQ_CLS",
...     r=4,
...     target_modules=["fc1", "fc2", "k_proj", "out_proj", "q_proj", "v_proj"],
...     num_vectors=60,
...     vector_length=256,
...     save_only_topk_weights=True,
... )
>>> model = get_peft_model(base_model, config)

속성:

get_nb_savable_parameters

< >

( adapter = 'default' )

저장 가능한 VB-LoRA 매개변수 및 기타 저장 가능한 매개변수의 수를 반환합니다.

print_savable_parameters

< >

( )

저장 가능한 VB-LoRA 매개변수의 수와 총 저장 가능한 매개변수의 수를 출력합니다.

Update on GitHub