오픈소스 LLM을 무료 코랩에서 나의 데이터셋으로 파인튜닝하기|LoRA 파라미터 전체 해석

신 영·2024년 8월 28일
0

자연어처리(NLP)

목록 보기
11/18

✅ PEFT(Parameter-Efficient Fine-Tuning)

PEFT는 소수의 모델 매개변수만 파인튜닝하여 계산 및 저장 비용을 크게 줄이는 동시에 fully 파인튜닝 된 모델과 비슷한 성능을 제공한다. 이를 통해 소비자 하드웨어에서 대규모 언어 모델(LLM)을 훈련하고 저장하는 것이 쉬워진다.

✅ LoRA(Low-Rank Adaptation)

PEFT 방법 중 하나인 LoRA는 대형 모델의 적응과 미세 조정을 효율적으로 수행하기 위한 기법이다. 주로 자연어 처리(NLP)와 같은 큰 모델을 다룰 때, 전체 모델을 재학습하는 대신 모델의 일부를 적응시키는 방법으로 사용된다. LoRA의 핵심 아이디어와 특징은 다음과 같습니다:

📌 핵심 아이디어

  1. 저차원 랭크 기반의 파라미터 조정
    LoRA는 모델의 가중치에 대해 저차원 랭크의 행렬을 도입하여, 학습할 파라미터의 수를 줄인다. 즉, 기존의 가중치 매트릭스 𝑊를 두 개의 저차원 행렬 𝐴와 𝐵로 분해하여 파라미터 수를 줄인다. 수식으로 표현하면, 기존의 가중치 매트릭스 𝑊 = 𝑊0 + Δ𝑊로 표현되고, Δ𝑊 = A ⋅ B이다.

  2. 모델의 주요 가중치는 고정
    LoRA에서는 원래의 모델 파라미터를 고정하고, 새로운 저차원 파라미터만 학습한다. 이렇게 하면 메모리와 계산 자원을 절약하면서도 모델을 효과적으로 적응시킬 수 있다.

📌 특징 및 장점

  1. 효율적인 학습
    LoRA는 적은 수의 파라미터만 학습하기 때문에, 전체 모델을 학습하는 것보다 계산 자원과 시간이 절약된다. 이는 특히 대형 모델을 다룰 때 큰 장점이 된다.
  2. 전이 학습의 용이성
    사전 학습된 대형 모델을 적은 자원으로 특정 작업에 적응시킬 수 있다. 이는 새로운 데이터셋이나 태스크에 맞게 모델을 조정할 때 유용하다.
  3. 모델 성능 유지
    LoRA는 전체 모델 파라미터를 변경하지 않기 때문에, 원래의 모델 성능을 유지하면서도 추가적인 적응을 할 수 있다.
  4. 사용 용이성
    복잡한 최적화 기법을 필요로 하지 않고, 기존 모델에 쉽게 통합할 수 있다.

📌 LoRAConfig

LoraConfig 클래스는 LoRA (Low-Rank Adaptation) 설정을 정의하는 데 사용됩니다. 이 클래스의 매개변수들은 LoRA를 적용할 때의 다양한 구성 요소와 옵션을 설정하는 데 사용됩니다. 각 매개변수의 의미와 역할은 다음과 같습니다:

class peft.LoraConfig

( peft_type: Union = Noneauto_mapping: Optional = Nonebase_model_name_or_path: Optional = Nonerevision: Optional = Nonetask_type: Union = Noneinference_mode: bool = Falser: int = 8target_modules: Optional[Union[list[str], str]] = Nonelora_alpha: int = 8lora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: Literal['none', 'all', 'lora_only'] = 'none'use_rslora: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_lora_weights: bool | Literal['gaussian', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'loftq'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonerank_pattern: Optional[dict] = <factory>alpha_pattern: Optional[dict] = <factory>megatron_config: Optional[dict] = Nonemegatron_core: Optional[str] = 'megatron.core'loftq_config: Union[LoftQConfig, dict] = <factory>use_dora: bool = Falselayer_replication: Optional[list[tuple[int, int]]] = Noneruntime_config: LoraRuntimeConfig = <factory> )

주요 매개변수 설명

r(int):
low-rank 매개변수의 차원. 일반적으로 낮은 랭크를 사용하여 파라미터를 효율적으로 조정합니다.

target_modules(Optional[Union[List[str], str]]):
LoRA를 적용할 모듈의 이름 리스트
- 특정 모듈 지정할 경우 : 지정된 모듈에 적용
- all-linear로 지정할 경우 : 출력 레이어 제외 모든 linear/Conv1D 모듈에 적용
- 지정 안할 경우 : 모델 구조에 따라 지정됨, 구조를 알 수 없으면 오류 발생(수동 지정 필요)
*모듈은 model 불러온 뒤 print(model)로 확인 가능

lora_alpha(int):
LoRA의 스케일링을 위한 알파 파라미터

lora_dropout(float):
LoRA에서 사용할 드롭아웃 비율

fan_in_fan_out(bool):
교체할 레이어가 (fan_in, fan_out)과 같이 weight를 저장하는 경우 True로 설정
예. GPT-2는 (fan_in, fan_out)과 같이 weight를 저장하는 Conv1D를 사용하므로 True로 설정해야 함

bias(str):
LoRA의 bias 처리 방식
'none', 'all', 'lora_only' 
'all' 또는 'lora_only'인 경우 해당 바이어스는 훈련 중에 업데이트 됨
어댑터를 비활성화하더라도 기본 모델이 적응하지 않으면 동일한 출력을 생성하지 못함

use_rslora(bool):
True로 설정하면 Rank-StabilizedLoRA를 사용하여 어댑터 스케일링 팩터를 lora_alpha/math.sqrt(r)로 설정합
그렇지 않으면 원래 기본값인 lora_alpha/r을 사용

modules_to_save(List[str]):
훈련 가능한 것으로 설정되어 최종 체크포인트에 저장될 어댑터 레이어를 제외한 모듈 목록

init_lora_weights(bool | Literal["gaussian", "olora", "pissa", "pissa_niter_[number of iters]", "loftq"]) :
어댑터 레이어의 가중치를 초기화하는 방법
- 'True':
Microsoft의 참조 구현에서 기본으로 제공되는 초기화 방법 사용
- 'gaussian'
선형과 레이어에 대한 LoRA 랭크를 기준으로 가우시안 초기화
False 설정 시 완전 무작위 초기화 → 권장 X
- 'loftq'
LoftQ 방법을 사용하여 초기화
- 'olora'
OLoRA 방법을 사용하여 초기화
- 'pissa'
Principal Singular values and Singular vectors Adaptation (PiSSA) 방법을 사용하여 초기화
LoRA보다 더 빠르게 수렴하고 궁극적으로 우수한 성능을 달성
QLoRA보다 양자화 오류를 줄여 성능 향상
- 'pissa_niter_[number of iters]'
Fast-SVD 기반 PiSSA 초기화
[number of iters]는 FSVD 수행을 위한 부분 공간 반복 횟수
예. [number of iters]를 16으로 설정하면 7B 모델의 초기화를 몇 초 내에 완료할 수 있으며, SVD를 사용하는 것과 비슷한 성능을 발휘

layers_to_transform(Union[List[int], int]):
변환할 레이어 인덱스
ints가 통과하면 이 목록에 지정된 레이어 인덱스에 어댑터 적용됨
단일 정수가 통과하면 이 인덱스의 레이어에 변환 적용됨

layers_pattern(str):
레이어 패턴 이름으로, layers_to_transform가 None과 다를 경우에만 사용됨

rank_pattern(dict):
계층 이름 또는 regexp 식에서 r에 의해 지정된 기본 순위와 다른 순위로의 매핑

alpha_pattern(dict):
lora_alpha에서 지정한 기본 알파와 다른 레이어 이름 또는 regexp 식에서 알파로 매핑

megatron_config(Optional[dict]):
Megatron에 대한 TransformerConfig 인수
LoRA의 병렬 선형 레이어를 만드는 데 사용

megatron_core(Optional[str]):
Megatron에서 사용할 핵심 모듈 지정
기본값 "megatron.core"

loftq_config(Optional[LoftQConfig]):
LoftQ의 구성
None이 아니면 init_lora_weights='loftq' 통과, 백본 가중치를 양자화하고 Lora 레이어를 초기화하는 데 사용됨
LoftQ가 스스로 양자화 할 경우 양자화된 모델 통과해서는 안됨

use_dora(bool):
Weight-Decomposed Low-Rank Adaptation(DoRA)을 사용할지 여부 결정
자세한 내용 : https://arxiv.org/abs/2402.09353

layer_replication(List[Tuple[int, int]]):
지정된 범위에 따라 원래 모델 레이어를 적층하여 새로운 레이어 스택 구축
기본 모델 가중치를 복제하지 않고도 모델을 확장(또는 축소) 가능
새로운 레이어에는 모두 별도의 LoRA 어댑터 부착됨

runtime_config(LoraRuntimeConfig):
런타임 구성(저장/복원 X)

📌 PEFT 설정 예시

# 모델과 PEFT 설정
from transformers import AutoModelForCausalLM
from peft import PeftModelForCausalLM, get_peft_config

# PEFT 설정 구성
config = {
    "peft_type": "PREFIX_TUNING",
    "task_type": "CAUSAL_LM",   # 텍스트 생성 작업 가장 잘 하는 모델
    "inference_mode": False,
    "num_virtual_tokens": 20,
    "token_dim": 1280,
    "num_transformer_submodules": 1,
    "num_attention_heads": 20,
    "num_layers": 36,
    "encoder_hidden_size": 1280,
    "prefix_projection": False,
    "postprocess_past_key_value_function": None,
}

peft_config = get_peft_config(config)

# 모델 불러오기 및 PEFT 적용
model = AutoModelForCausalLM.from_pretrained("gpt2-large")
peft_model = PeftModelForCausalLM(model, peft_config)
peft_model.print_trainable_parameters()
----------
# PEFT 적용 결과
trainable params: 1843200 || all params: 775873280 || trainable%: 0.23756456724479544
# 학습 파라미터 수, 전체 파라미터 수, 학습 비율

✅ 구현

HK CODE - Llama3 Model FineTune 학습데이터 파인튜닝 방법 모델만 변경


참고자료
[Huggingface] Single GPU에서 효율적인 모델 학습을 하는 방법
HuggingFace docs
Target modules for applying PEFT / LoRA on different models
[Python] Llama3를 파인튜닝을 통해 나만의 데이터로 학습 및 Huggingface에 적재해보자.

0개의 댓글

관련 채용 정보