LLM

LoRA와 QLoRA

LoRA (Low-Rank Adaptation of LLM)

-  HuggingFace에서 개발한 Parameter-Efficient Fine-Tuning (PEFT) 방식 중 하나

- 사전 훈련된 모델 가중치는 고정하고 훈련 가능한 레이어(LoRA adapter 의 A Layer, B Layer) 들을 별도로 붙이고 추가 훈련을 통해 학습

위 식에서 는 frozen,  는 trainable한 상태이다. 기존의 LoRA는 트랜스포머 모듈의 query와 value 행렬에 adapt해 붙어있었고, 기존 LLM의 1%도 안되는 trainable 파라미터로 full-finetuning과 거의 동일한 수준의 성능을 보여주었다.

 

장점

- 작은 크기

- 대기 시간 없이 효율적인 작업 전환

 

단점

- 모델 자체를 추가 훈련할 때의 성능은 넘을 수 없음


LoRA Hyperparameters

LoraConfig(
	r=16
	,lora_alpha=8
	,target_modules=TARGET_MODULES = ["q_proj",    "v_proj"]
	,lora_dropout=0.05
	,bias="none"
	,task_type="CAUSAL_LM"
)

 

1. r : LoRA : Adapter 파라미터의 차원 갯수 , 기본값은 8 (LoRA adapter의 차원지정)

r 값을 낮게 설정 하면 학습속도가 빨라지고 계산 비용이 적은 훈련 과정을 이끌 수 있지만 생성된 모델의 품질이 낮아질 수 있습니다. 그렇다고 r 을 특정 값 이상으로 설정해도 모델의 품질이 눈에 띄게 향상되지 않을 수 있습니다.

값이 크면 클수록 더 많은 수정이 이루어지며, 모델이 더 복잡해질 수 있음

 

2. lora_alpha : Adapter 의 Scaling값으로 Adapter 에서 나온 output 값에 곱해지는 값, 기본값은 8

여기서 α는 상수입니다. Adam으로 최적화할 때, 초기화가 적절하게 스케일 조정되었다면 α를 조정하는 것은 거의 학습률을 조정하는 것과 동일합니다. 

LoRA가 적용될 때 원래 모델의 가중치에 얼마나 영향을 미칠지 결정. 높은 값은 가중치 조정의 강도를 증가시킴

 

3. lora_dropout : LoRA 레이어의 드롭아웃 확률, 기본값은 0

훈련 중에 드롭아웃 확률에 따라 무작위로 뉴런을 선택하여 생략하고 과적합을 줄이는 기술입니다.

 

4. target_modules , 기본값은 None (LoRA Adapter를 적용할 layer 목록)

LoRA로 미세 조정할 때 모델 아키텍처에서 타겟팅할 모듈을 설정합니다.

"r"과 유사하게 많은 모듈을 타겟팅하면 훈련 시간이 증가하고 컴퓨팅 리소스 수요가 증가합니다.

따라서 트랜스포머의 어텐션 블록만 타겟팅하는 것이 일반적입니다.

 

5. lora_bias : LoRA 바이어스 유형,  기본값은 None

바이어스는 'none', 'all', 또는 'lora_only'가 될 수 있습니다.

'all' 또는 'lora_only'인 경우 해당하는 바이어스는 훈련 중에 업데이트됩니다.

 


LoRA 사용하기 (ex. gpt2에 적용)

1. 기본 환경 설정

pip install transformers
pip install peft

 

2. 모델 로드 및 LoRA 적용

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model

# 모델과 토크나이저 로드
model_name = "gpt2"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# LoRA 설정
lora_config = LoraConfig(
	r=8,  # LoRA에서 사용하는 low-rank matrices 어텐션 차원을 정의. 값이 크면 클수록 더 많은 수정이 이루어지며, 모델이 더 복잡해질 수 있음
    lora_alpha=32, # 스케일링 계수. LoRA가 적용될 때 원래 모델의 가중치에 얼마나 영향을 미칠지 결정. 높은 값은 가중치 조정의 강도를 증가시킴
    lora_dropout=0.1, # 드롭아웃 비율
    target_modules=["c_attn", "c_proj"] # LoRA를 적용할 대상 모듈 (GPT-2의 경우)
)

# LoRA 적용
model = get_peft_model(model, lora_config)

# 모델 요약
model.print_trainable_parameters()

 

더보기

AutoModelForCausalLM 이란?

Hugging Face의 transformers 라이브러리에서 제공하는 자동 모델 로더(AutoModel) 중 하나로, Causal Language Modeling (인과 언어 모델링) 작업을 위해 사전 학습된 언어 모델을 불러오는 데 사용됩니다. 이 클래스는 주로 텍스트 생성 작업에 사용되며, 특정 작업에 맞게 모델을 미세 조정하거나 새롭게 훈련할 수 있습니다.

 

사용 예시

from transformers import AutoModelForCausalLM, AutoTokenizer

# 모델과 토크나이저 로드
model_name = "gpt2"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 입력 텍스트 설정
input_text = "Once upon a time"

# 입력 텍스트를 토큰화
input_ids = tokenizer(input_text, return_tensors="pt").input_ids

# 텍스트 생성
output = model.generate(input_ids, max_length=50, num_return_sequences=1)

# 출력 텍스트 디코딩
output_text = tokenizer.decode(output[0], skip_special_tokens=True)

print(output_text)

 

코드 설명

  • AutoModelForCausalLM.from_pretrained(model_name):
    • 지정된 이름의 사전 학습된 모델을 로드합니다. gpt2를 사용하면 GPT-2 모델을 불러옵니다.
  • tokenizer(input_text, return_tensors="pt"):
    • 입력 텍스트를 모델이 처리할 수 있는 텐서 형식으로 변환합니다. 여기서 return_tensors="pt"는 PyTorch 텐서 형식으로 반환하라는 의미입니다.
  • model.generate():
    • 모델을 사용해 입력 텍스트에 이어지는 다음 텍스트를 생성합니다. max_length는 생성할 텍스트의 최대 길이를, num_return_sequences는 생성할 시퀀스의 수를 설정합니다.
  • tokenizer.decode():
    • 생성된 텍스트를 다시 사람이 읽을 수 있는 문자열 형식으로 변환합니다.

3. LoRA가 적용된 모델 훈련

from transformers import Trainer, TrainingArguments

# 데이터 준비 (샘플 텍스트 데이터)
texts = ["Hello, how are you?", "I am fine, thank you!"]

# 토크나이저를 사용해 데이터 전처리
inputs = tokenizer(texts, return_tensors="pt", padding=True, truncation=True)

# train 설정
training_args = TrainingArguments(
	output_dir="./results",
    num_train_epochs=3,
    per_device_train_batch_size=2,
    logging_dir="./logs",
    logging_steps=10,
)

# trainer 설정
trainer = Trainer(
	model=model,
    args=training_args,
    train_dataset=inputs["input_ids"],
)

# 모델 훈련
trainer.train()

 

4. 모델 저장 및 사용

# 모델 저장
model.save_pretrained("./lora_model")
tokenizer.save_pretrained("./lora_model")

# 모델 로드
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("./lora_model")

 

  • LoraConfig: LoRA의 설정을 정의하는 클래스입니다. 여기서 r은 저차원 공간의 랭크를, lora_alpha는 스케일링 계수를, lora_dropout은 드롭아웃 비율을 설정합니다.
  • target_modules: LoRA를 적용할 모델의 특정 레이어를 지정합니다. GPT-2 모델의 경우, c_attn과 c_proj 모듈이 주요 타겟입니다.
  • get_peft_model: 이 함수는 주어진 모델에 LoRA를 적용하여, 새로운 훈련 가능한 파라미터를 추가합니다.
  • Trainer: Hugging Face Trainer 클래스를 사용해 훈련을 진행합니다. 이 과정은 일반적인 모델 훈련과 유사하며, 추가된 LoRA 파라미터만 업데이트됩니다.

QLoRA (Quantized Low-Rank Adaptation)

RoLA와 유사하게 저차원 공간에서의 학습을 기반으로 하지만, 추가로 양자화(quantization) 기술을 활용하여 모델의 파라미터를 4비트(또는 그 이하)로 양자화합니다. 이를 통해 모델의 메모리 사용량을 더욱 줄이고, 훈련 및 추론 속도를 높입니다.