LLM으로 다양한 작업을 처리하기 위해 맞춤형 조정이 필요합니다. 이를 위해 SFT(Supervised Fine-Tuning)이라는 방법을 사용하여 모델의 성능을 개선할 수 있습니다. 이전 글 참고
SFT에는 여러 가지 튜닝 기법이 있으며, 이번 글에서는 Full Fine-Tuning과 Parameter-Efficient Fine-Tuning(PEFT)의 주요 기법인 LoRA와 QLoRA에 대해 알아보겠습니다.
1. Full Fine-Tuning
Full Fine-Tuning은 말 그대로 모델의 모든 파라미터를 업데이트하는 방식입니다. 이 기법은 모델의 모든 가중치를 조정하여 특정 작업에 맞게 성능을 개선합니다. 전체 모델을 조정하기 때문에 메모리와 계산 자원이 많이 요구됩니다.
일반적인 딥러닝 모델(bert, resnet)을 학습하는 방법을 Full Fine-Tuning이라고 이해하면 됩니다.
2. Parameter-Efficient Fine-Tuning (PEFT)
Parameter-Efficient Fine-Tuning (PEFT)은 모델의 모든 파라미터를 조정하지 않고, 특정 파라미터 집합만을 업데이트하여 모델을 튜닝하는 방법입니다.
이는 계산 자원과 메모리 사용을 줄이면서도 효과적인 성능 개선을 제공합니다. PEFT는 기존의 LLM 파라미터를 ‘Freeze’시키고, 선택된 부분만을 조정하여 훈련의 효율성을 높입니다.
LoRA (Low-Rank Adaptation)
LoRA (Low-Rank Adaptation)는 PEFT의 한 형태로, 모델의 특정 층에서 저 차원(low-rank) 행렬을 사용하여 파라미터를 조정합니다. LoRA는 전체 모델을 업데이트하지 않고, 일부 파라미터만을 조정하여 효율적인 튜닝을 가능하게 합니다.
위 그림에서 알수 있듯이 LoRA는 전체 Weight는 고정해 두고, 대신 아래쪽에서(그림에서 초록색 박스) 아주 적은 연산양을 필요로 하는 A, B Matrix만을 학습합니다.
최종 업데이트 되는 layer는 두 개의 연산 결과를 합쳐서 구성됩니다.
llama3 lora tuning 예제
LoRA tuning을 할때는, 아래 코드처럼 어떤 layer를 target으로 할지 정의해 주어야 합니다.
# 모델 로드
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Meta-Llama-3-8B",
device_map={"": 0}
)
model.config.use_cache = False
model.config.pretraining_tp = 1
# 토크나이저 로드
tokenizer = AutoTokenizer.from_pretrained(
"meta-llama/Meta-Llama-3-8B",
trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"
# LoRA 설정
peft_params = LoraConfig(
lora_alpha=16, # LoRA 스케일링 팩터
lora_dropout=0.1, # LoRA 드롭아웃 비율
r=64, # LoRA 랭크
bias="none",
task_type="CAUSAL_LM",
)
# 훈련 파라미터 설정
training_params = TrainingArguments(
output_dir="/results", # 결과 저장 디렉토리
num_train_epochs = 1, # 전체 데이터셋에 대한 학습 횟수
max_steps=5000, # 최대 훈련 스텝 수
per_device_train_batch_size=1,
gradient_accumulation_steps=4, # 그래디언트 누적 스텝 수
optim="paged_adamw_8bit", # 8비트 AdamW 옵티마이저 사용
warmup_steps=0.03, # 웜업 스텝 비율
learning_rate=2e-4, # 학습률
fp16=True, # 16비트 부동소수점 사용
logging_steps=100, # 로깅 간격
push_to_hub=False, # Hugging Face Hub에 푸시하지 않음
report_to='tensorboard', # TensorBoard에 결과 보고
)
# SFT(Supervised Fine-Tuning) 트레이너 설정
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
peft_config=peft_params,
dataset_text_field="text", # 데이터셋의 텍스트 필드 이름
max_seq_length=256, # 최대 시퀀스 길이
tokenizer=tokenizer,
args=training_params,
packing=False, # 시퀀스 패킹 비활성화
)
# 훈련 시작
trainer.train()
위 코드에서 Lora config 부분만 자세히 살펴보겠습니다.
# LoRA 설정
peft_params = LoraConfig(
lora_alpha=16, # LoRA 스케일링 팩터
lora_dropout=0.1, # LoRA 드롭아웃 비율
r=64, # LoRA 랭크
bias="none",
task_type="CAUSAL_LM",
)
- lora_alpha=16
- 이는 LoRA의 스케일링 factor입니다.
- LoRA 업데이트의 강도를 조절합니다.
- 값이 클수록 LoRA의 영향력이 커집니다.
- 일반적으로 r 값의 2배로 설정하는 것이 좋습니다.
- lora_dropout=0.1
- LoRA 레이어에 적용되는 드롭아웃 비율입니다.
- 0.1은 10%의 뉴런이 랜덤하게 비활성화됨을 의미합니다.
- 과적합을 방지하고 모델의 일반화 성능을 향상하는 데 도움이 됩니다.
- r=64
- LoRA의 랭크(rank)를 설정합니다.
- 이 값은 LoRA 행렬의 차원을 결정합니다.
- 값이 클수록 모델의 표현력이 증가하지만, 학습해야 할 파라미터 수도 증가합니다.
- 일반적으로 8에서 64 사이의 값을 사용합니다.
QLoRA (Quantized LoRA)
QLoRA (Quantized Low-Rank Adaptation)는 LoRA 기법의 확장으로, 모델의 파라미터를 양자화하여 더욱 효율적으로 튜닝하는 방법입니다. 양자화는 모델 파라미터를 낮은 정밀도로 표현하여 메모리와 계산 자원을 절약할 수 있게 해주는 기법입니다.
llama3 QLoRA tuning 예제
QLoRA와 LoRA의 차이는 모델의 양자화입니다. 그렇기 때문에 학습 코드에도 LoRA tuning 코드에서 양자화하는 부분만 추가하면 됩니다.
# 모델 설정
quant_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch_dtype,
quantization_config=quant_config,
bnb_4bit_use_double_quant=False,
)
# 모델 로드
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Meta-Llama-3-8B",
device_map={"": 0}
)
...
# 훈련 시작
trainer.train()
결론
Full Fine-Tuning은 모델의 모든 파라미터를 업데이트하여 성능을 최적화하는 반면, LoRA와 QLoRA와 같은 Parameter-Efficient Fine-Tuning(PEFT) 기법은 적은 자원으로 일부 파라미터만을 최적화하게됩니다.
LoRA는 저차원 행렬을 이용하여 모델의 특정 파라미터만 조정함으로써 메모리와 계산 자원을 절감하고, QLoRA는 여기에 양자화를 추가하여 더욱 효율적으로 자원을 관리하면서도 성능을 유지합니다.
PEFT는 LLM의 효율적인 활용을 위한 강력한 도구로 자리 잡고 있으며, 앞으로도 다양한 task를 위해 LLM을 최적화하는데 꾸준히 활용 될 것이라 생각됩니다.
Reference
- https://www.databricks.com/kr/blog/efficient-fine-tuning-lora-guide-llms
- https://ffighting.net/deep-learning-paper-review/language-model/lora/
- [우아한 스터디] LLM(LLaMA3) Fine-Tuning 방법 정리
- https://medium.com/@zahmed333/qlora-black-boxed-a-brief-summary-b9cf6386473a
'딥러닝 > LLM' 카테고리의 다른 글
LLM의 양자화가 한국어에 미치는 영향 (0) | 2024.08.19 |
---|---|
[논문리뷰] How Does Quantization Affect Multilingual LLMs? (0) | 2024.08.12 |
Supervised Fine-tuning: customizing LLMs (0) | 2024.08.06 |
Gemma 2 (9B & 27B) Evaluation vs. Open/Closed-Source LLMs (0) | 2024.08.01 |
Pretraining LLMs (0) | 2024.07.31 |