PEFT documentation
UniLoRA
UniLoRA
Uni-LoRA는 저순위 어댑터 가중치 간에 컴팩트한 학습 가능 벡터 뱅크를 공유하는 PEFT 방법입니다. 모든 LoRA 행렬 요소를 독립적으로 학습하는 대신, UniLoRA는 항목을 결정적으로 공유 theta_d 값으로 투영하고 어댑터 업데이트에 사용되는 공유 매개변수를 학습합니다.
빠른 시작
from peft import UniLoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B")
config = UniLoraConfig(
r=32,
theta_d_length=256,
proj_seed=42,
target_modules=["q_proj", "v_proj"],
unilora_dropout=0.0,
init_weights=True,
task_type="CAUSAL_LM",
)
peft_model = get_peft_model(model, config)
peft_model.print_healthcheck()중요한 매개변수
r는 저랭크 어댑터의 차원을 제어합니다. 값이 클수록 어댑터의 용량과 메모리 사용량이 증가합니다.
theta_d_length은 공유된 UniLoRA 벡터 뱅크의 길이를 제어합니다. 이는 투영된 어댑터 항목이 공유하는 주요 학습 가능한 저장소입니다.
proj_seed은 theta_d로의 고정 투영에 대한 결정론적 인덱스 생성을 제어합니다. 동일한 시드와 구성을 재사용하면 생성된 어댑터 인덱스가 재현 가능합니다.
target_modules는 UniLoRA 어댑터를 적용할 모듈을 선택합니다. ["q_proj", "v_proj"]와 같은 모듈 접미사, 정규식 문자열, 또는 모델 아키텍처가 지원하는 경우 "all-linear"를 사용할 수 있습니다.
unilora_dropout은 학습 중 UniLoRA 어댑터 레이어 내부에 dropout을 적용합니다.
init_weights는 UniLoRA 파라미터 초기화를 제어합니다. 초기화를 수동으로 관리해야 하는 경우 무작위 theta_d 초기화를 유지하려면 False로 설정하세요.
save_indices는 UniLoRA 체크포인트가 생성된 인덱스 및 스케일 텐서를 공유 theta_d 매개변수와 함께 저장할지 여부를 제어합니다. 이 옵션을 비활성화하면 체크포인트 크기가 작아지고 proj_seed에서 인덱스를 재생성합니다. 활성화하면 저장된 어댑터가 향후 인덱스 생성 방식의 변경 사항에서 독립적으로 동작합니다.
벤치마크 개요
API
UniLoraConfig
class peft.UniLoraConfig
< 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 = 4proj_seed: int = 42theta_d_length: int = 256target_modules: list[str] | str | None = Noneunilora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: list[str] | None = Noneinit_theta_d_bound: float = 0.02init_weights: bool = Truesave_indices: bool = Falselayers_to_transform: list[int] | int | None = Nonelayers_pattern: list[str] | str | None = None )
매개변수
- r (
int) — 저순위 적응의 랭크입니다. 이는 UniLora 업데이트의 표현 역량을 제어합니다. - proj_seed (
int) — 고정된 인덱스 할당을 생성하는 데 사용되는 랜덤 시드입니다. 이를 통해 실행 간 재현성을 보장합니다. - theta_d_length (
int) — 공유 UniLora 벡터theta_d의 길이입니다. - target_modules (
Union[list[str], str], 선택 사항) — UniLora 어댑터가 적용될 모듈의 이름 또는 패턴입니다.- 문자열이 제공되면 정규식으로 처리됩니다.
- list가 제공되면, 모듈은 정확한 이름 또는 접미사로 일치합니다.
- 특수 값 ‘all-linear’은 출력 레이어를 제외한 모든 Linear / Conv1D 레이어에 UniLora를 적용합니다. 지정하지 않으면 모델 아키텍처에서 모듈을 추론합니다. 아키텍처가 지원되지 않으면 오류가 발생합니다.
- unilora_dropout (
float) — UniLora 레이어 내에서 적용되는 Dropout 확률입니다. - fan_in_fan_out (
bool) — 교체된 레이어가 가중치를 (fan_in, fan_out) 형식으로 저장하는지 여부입니다. Conv1D 레이어를 사용하는 GPT-2와 같은 모델의 경우 True로 설정해야 합니다. - bias (
str) — 학습 가능한 bias 항을 지정합니다:- ‘none’: 편향 매개변수가 업데이트되지 않습니다
- ‘all’: 모든 bias 매개변수가 업데이트됩니다
- ‘unilora_only’: UniLora 레이어 내부의 bias만 업데이트됩니다 참고: bias 업데이트를 활성화하면 어댑터가 비활성화된 상태에서도 모델 출력이 변경됩니다.
- modules_to_save (
list[str], 선택 사항) — UniLora 레이어 외부에서 최종 체크포인트에 저장되어야 하는 추가 모듈입니다. 분류기 같은 작업별 헤드를 사용할 때 흔히 사용됩니다. - init_theta_d_bound (
float) — UniLora 벡터 뱅크의 초기화 경계입니다. 벡터는 [-init_theta_d_bound, init_theta_d_bound] 범위에서 균등하게 샘플링됩니다. 기울기 소실(vanishing gradients)을 방지하기 위해 0으로 초기화하는 것은 피해야 합니다. 안정적인 학습을 위해 작은 값(예: 0.02)을 사용하는 것이 권장됩니다. - init_weights (
bool) —theta_d를 기본 UniLora 초기화로 초기화할지 여부입니다.False로 설정하면theta_d는 무작위 초기화를 유지합니다. - save_indices (
bool) —theta_d와 함께 생성된 UniLora 인덱스 및 스케일 버퍼를 저장할지 여부입니다. 이는 체크포인트 크기를 증가시키지만, 저장된 어댑터가 인덱스 생성 루틴의 향후 변경 사항에 독립적이 되도록 합니다. - layers_to_transform (
Union[list[int], int], 선택 사항) — UniLora가 적용될 transformer 레이어의 인덱스입니다. 지정된 경우, 해당 레이어만 수정됩니다. 이 옵션은target_modules가 리스트일 때만 유효합니다. - layers_pattern (
Union[list[str], str], 선택 사항) — 모델이 표준 레이어 명명 규칙을 따르지 않을 때layers_to_transform와 함께 사용되는 사용자 정의 레이어 이름 패턴입니다. 이 옵션은target_modules가 리스트일 때만 유효합니다.
UniLora 어댑터용 구성 클래스입니다.
이 클래스는 PEFT 프레임워크 내에서 UniLora 레이어를 초기화하고 적용하는 데 필요한 모든 하이퍼파라미터를 정의합니다. 이 구성은 의도적으로 최소한으로 유지되며, 현재 UniLora 구현에서 실제로 사용되는 파라미터만 포함합니다.
Reference: Uni-LoRA: One Vector Is All You Need https://arxiv.org/abs/2506.00799
UniLoraModel
class peft.UniLoraModel
< source >( modelconfigadapter_namelow_cpu_mem_usage: bool = Falsestate_dict: dict[str, torch.Tensor] | None = None )
UniLora 어댑터를 사전 학습된 모델 주위에 생성합니다.
평탄화된 UniLora 매개변수 공간에 결정론적인 theta_d 인덱스를 할당합니다.
np.random.choice(np.arange(theta_d_length), size=lora_param_count)만 사용하면 각 위치가 독립적으로 샘플링되어 작은 어댑터의 경우 일부 theta_d 항목이 사용되지 않을 수 있습니다. UniLora는 균형 잡힌 결정론적 할당을 사용합니다. 여기서 D는 평탄화된 LoRA 매개변수 수이고 d는 theta_d_length이며, 각 인덱스는 floor(D / d)번 또는 ceil(D / d)번 등장합니다. 이를 통해 proj_seed로 할당을 셔플하더라도 인덱스별 정규화가 안정적으로 유지됩니다.