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

내부 활성화의 억제 및 증폭을 통한 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
< 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 = 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
< 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 (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)속성:
- model (PreTrainedModel) — 적응할 모델.
- peft_config (IA3Config): (IA)^3 모델의 구성입니다.
add_weighted_adapter
< source >( adapters: list[str]weights: list[float]adapter_name: str )
이 메서드는 주어진 어댑터를 주어진 가중치로 병합하여 새로운 어댑터를 추가합니다.