PEFT documentation

IA3

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

IA3

IA3는 가능한 가장 작은 어댑터 크기가 필요할 때 훌륭한 선택지입니다. 저순위 행렬 대신 학습된 벡터를 사용하므로, 가장 적은 매개변수로 동작하는 방법 중 하나입니다. 디스크/메모리 사용량 최소화 및 빠른 학습이 최우선이라면 IA3는 강력한 후보입니다.

IA3 introduces three vectors, lv, lk and lff to scale value, key and feed-forward activations (image source).

내부 활성화의 억제 및 증폭을 통한 Infused Adapter, 즉 IA3는 self-attention 및 encoder-decoder attention 레이어의 keys와 values, 그리고 position-wise feed-forward network의 intermediate activation을 rescale하기 위해 학습된 세 개의 벡터를 추가하는 방법입니다.

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

Few-shot in-context learning(ICL)은 소수의 학습 예시를 입력의 일부로 제공함으로써, 그라디언트 기반 학습 없이 사전 학습된 언어 모델이 이전에 보지 못한 작업을 수행할 수 있게 합니다. ICL은 예측을 할 때마다 모든 학습 예시를 처리해야 하므로 상당한 계산, 메모리 및 저장 비용을 발생시킵니다. Parameter-efficient fine-tuning(PEFT)(예: adapter modules, prompt tuning, sparse update methods 등)은 소수의 파라미터만 학습하여 모델이 새로운 작업을 수행할 수 있도록 하는 대안적 패러다임을 제공합니다. 이 논문에서는 few-shot ICL과 PEFT를 엄밀하게 비교하고, 후자가 더 높은 정확도와 함께 계산 비용을 극적으로 낮출 수 있음을 보여줍니다. 이 과정에서 학습된 벡터로 activations를 스케일링하는 새로운 PEFT 방법인 (IA)^3을 소개하며, 상대적으로 매우 적은 양의 새로운 파라미터만 도입하면서도 더 강력한 성능을 달성합니다. 또한, T0 모델에 기반하여 새로운 작업에 task-specific tuning이나 수정 없이 적용할 수 있는 간단한 레시피인 T-Few를 제안합니다. RAFT 벤치마크에 T-Few를 적용하여 완전히 보지 못한 작업에서 그 효과를 검증했으며, 처음으로 super-human 성능을 달성하고 state-of-the-art를 6% 절대적으로 초과했습니다. 실험에 사용된 모든 코드는 공개되어 있습니다.

To make fine-tuning more efficient, IA3 (Infused Adapter by Inhibiting and Amplifying Inner Activations) rescales inner activations with learned vectors. These learned vectors are injected in the attention and feedforward modules in a typical transformer-based architecture. These learned vectors are the only trainable parameters during fine-tuning, and thus the original weights remain frozen. Dealing with learned vectors (as opposed to learned low-rank updates to a weight matrix like LoRA) keeps the number of trainable parameters much smaller.

LoRA와 유사하게, IA3는 다음과 같은 동일한 이점을 많이 제공합니다:

  • IA3은 학습 가능한 매개변수의 수를 크게 줄여 fine-tuning을 더 효율적으로 만듭니다. (T0의 경우, IA3 모델은 학습 가능한 매개변수가 약 0.01%에 불과한 반면, LoRA조차 > 0.1%입니다)
  • …
  • IA3를 사용하여 파인튜닝한 모델의 성능은 완전한 파인튜닝을 거친 모델의 성능과 비슷합니다.
  • IA3는 어댑터 가중치를 베이스 모델과 병합할 수 있으므로 추론 지연을 전혀 추가하지 않습니다.

원칙적으로 IA3은 신경망의 가중치 행렬 부분 집합에 적용하여 학습 가능한 매개변수의 수를 줄일 수 있습니다. 저자들의 구현을 따르며, IA3 가중치는 Transformer 모델의 key, value 및 feedforward 레이어에 추가됩니다. 구체적으로, Transformer 모델의 경우 각 Transformer 블록에서 key 및 value 레이어의 출력과 두 번째 feedforward 레이어의 입력에 IA3 가중치가 추가됩니다.

IA3 매개변수를 주입할 대상 레이어가 주어지면, 가중치 행렬의 크기에 따라 학습 가능한 매개변수의 수를 결정할 수 있습니다.

사용

자기회귀 모델의 경우, 저자들이 가장 효과적인 것으로 확인한 레이어인 k_proj, v_proj, down_proj를 대상으로 합니다. IA3가 어떤 모듈이 피드포워드 레이어인지 알고 올바른 스케일링을 적용할 수 있도록 feedforward_modules=["down_proj"]를 설정합니다.

시퀀스 분류 작업의 경우, Llama 모델에 대한 IA3 구성을 다음과 같이 초기화할 수 있습니다:

from peft import IA3Config, TaskType, get_peft_model
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M")
peft_config = IA3Config(
    task_type=TaskType.CAUSAL_LM,
    target_modules=["k_proj", "v_proj", "down_proj"],
    feedforward_modules=["down_proj"],
)
model = get_peft_model(model, peft_config)
model.print_healthcheck()

IA3과 LoRA를 언제 사용할까요

IA3는 저장 공간이 제한된 배포 환경에서 가능한 가장 작은 어댑터가 필요하거나, 학습 가능한 매개변수를 줄이면서 빠른 수렴을 원할 때 특히 효과적입니다. LoRA 변형(DoRA, QLoRA 등)의 더 넓은 생태계가 필요하거나, 광범위한 커뮤니티 지원을 받는 가장 널리 테스트된 접근 방식을 원할 때는 LoRA가 더 적합할 수 있습니다.

벤치마크 개요

API

IA3Config

클래스 peft.IA3Config

< >

( 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]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonefeedforward_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_ia3_weights: bool = True )

매개변수

  • target_modules (Optional[Union[List[str], str]]) — 어댑터를 적용할 모듈의 이름입니다. 이 값이 지정되면, 지정된 이름을 가진 모듈만 교체됩니다. 문자열을 전달하면 정규식 매칭이 수행됩니다. 문자열 목록을 전달하면 정확한 매칭이 수행되거나, 모듈 이름이 전달된 문자열 중 하나로 끝나는지 확인됩니다. 이 값이 ‘all-linear’로 지정되면, 출력 레이어를 제외한 모든 linear/Conv1D 모듈이 선택됩니다. 이 값이 지정되지 않으면, 모델 아키텍처에 따라 모듈이 선택됩니다. 아키텍처가 알려지지 않은 경우 오류가 발생하며, 이 경우 대상 모듈을 수동으로 지정해야 합니다.
  • exclude_modules (Optional[Union[List[str], str]]) — 어댑터를 적용하지 않을 모듈의 이름입니다. 문자열을 전달하면 정규식 매칭이 수행됩니다. 문자열 목록을 전달하면 정확한 매칭이 수행되거나, 모듈 이름이 전달된 문자열 중 하나로 끝나는지 확인됩니다.
  • feedforward_modules (Optional[Union[List[str], str]]) — 원래 논문과 같이 feedforward 모듈로 취급할 모듈의 이름입니다. 이러한 모듈에는 출력이 아닌 입력에 (IA)³ 벡터가 곱해집니다. feedforward_modules는 target_modules에 존재하는 이름이거나 그 이름들의 부분집합이어야 합니다.
  • fan_in_fan_out (bool) — 교체할 레이어가 가중치를 (fan_in, fan_out) 형태로 저장하는 경우 True로 설정합니다. 예를 들어, gpt-2는 가중치를 (fan_in, fan_out) 형태로 저장하는 Conv1D를 사용하므로 이 값을 True로 설정해야 합니다.
  • modules_to_save (Optional[List[str]]) — (IA)³ 레이어를 제외하고 최종 체크포인트에 학습 가능 상태로 설정되어 저장될 모듈 목록.
  • init_ia3_weights (bool) — (IA)³ 레이어의 벡터를 초기화할지 여부입니다. 기본값은 True입니다. 이 값을 False로 설정하는 것은 권장되지 않습니다.

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

IA3Model

클래스 peft.IA3Model

< >

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

반환값

torch.nn.Module

(IA)^3 모델.

사전 학습된 transformers 모델에서 https://huggingface.co/papers/2205.05638에 자세히 설명된 방법인 Infused Adapter by Inhibiting and Amplifying Inner Activations ((IA)^3) 모델을 생성합니다.

예:

>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import IA3Config, get_peft_model

>>> config = IA3Config(
...     peft_type="IA3",
...     task_type="SEQ_2_SEQ_LM",
...     target_modules=["k", "v", "w0"],
...     feedforward_modules=["w0"],
... )

>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> ia3_model = get_peft_model(model, config)

속성:

add_weighted_adapter

< >

( adapters: list[str]weights: list[float]adapter_name: str )

매개변수

  • adapters (list) — 병합할 어댑터 이름 목록.
  • weights (list) — 각 어댑터에 대한 가중치 목록.
  • adapter_name (str) — 새 어댑터의 이름.

이 메서드는 주어진 어댑터를 주어진 가중치로 병합하여 새로운 어댑터를 추가합니다.

Update on GitHub