
좋습니다. 기존의 LoRA 방식에 대한 비판적인 시각과 QLoRA, FSDP를 활용한 대규모 모델 파인튜닝에 대한 내용을 중심으로 블로그 글을 수정하고, 최신 트렌드를 반영하여 다시 작성해 보겠습니다.
대규모 언어 모델(LLM)의 등장으로 자연어 처리 분야는 혁신적인 발전을 이루었지만, 이러한 모델을 특정 작업에 맞게 미세 조정(fine-tuning)하는 것은 여전히 쉽지 않은 문제입니다. 특히, 수십억, 수백억 개의 파라미터를 가진 모델을 학습시키려면 막대한 컴퓨팅 자원과 시간이 필요합니다.
이러한 문제에 대한 해결책으로 제시되었던 것이 LoRA (Low-Rank Adaptation) 입니다. LoRA는 원래 모델의 가중치를 동결하고, 작은 "어댑터" 행렬만 학습하여 파라미터 효율성을 높이는 방식입니다. 하지만, 최근 LoRA의 한계에 대한 지적과 함께, 더 효율적이고 강력한 파인튜닝 기법들이 등장하고 있습니다.
저는 최근 Kaggle의 "Google - Unlock Global Communication with Gemma" 대회에 참가하여, Gemma 2 모델을 한국어 감정 대화 데이터셋에 파인튜닝하는 프로젝트를 진행했습니다.(제 노트북)
초기에는 LoRA를 사용하여 파인튜닝을 시도했지만, 만족스러운 결과를 얻기 어려웠습니다.
KISTI에서 개발한 한국어 LLM인 KONI-Llama3.1-70B-Instruct 모델과 비교했을 때, KONI 모델은 과학기술 분야에 특화되어 있어 해당 분야의 질문에는 더 정확했지만, 일반적인 감정 대화에서는 오히려 부자연스러운 응답을 생성하기도 했습니다.
이러한 경험을 통해, 저는 LoRA가 모든 경우에 최적의 솔루션은 아니며, 특히 대규모 모델을 제대로 활용하기에는 한계가 있다는 것을 깨달았습니다.
최근 LLM 연구는 모델의 크기를 키우는 방향으로 진행되고 있습니다. 더 큰 모델은 더 많은 지식을 저장하고, 더 복잡한 추론을 수행할 수 있지만, 학습 비용이 기하급수적으로 증가한다는 문제가 있습니다.
이러한 문제를 해결하기 위해 등장한 것이 QLoRA (Quantized LoRA) 와 FSDP (Fully Sharded Data Parallelism) 입니다.
QLoRA:
FSDP:
QLoRA + FSDP의 장점:
다음은 Philipp Schmid의 블로그 글("Finetune Llama 3 with DPO on Intel GPUs")에서 발췌한, QLoRA와 FSDP를 사용하여 Llama 3 70B 모델을 파인튜닝하는 예시 코드입니다.
# 코드 예시 (상세 내용은 블로그 글 참조)
# ... (필요한 라이브러리 import) ...
# 1. 모델 및 토크나이저 로드 (QLoRA 설정)
model_id = "meta-llama/Meta-Llama-3-70B-Instruct" # 더 큰 모델 사용!
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map={"": 0}, # 모든 것을 GPU 0에 로드 (FSDP가 알아서 분산)
)
# 2. LoRA 설정
peft_config = LoraConfig(
# ... (LoRA 설정, rank는 더 높게!) ...
)
model = get_peft_model(model, peft_config)
# 3. 데이터셋 로드 및 전처리
# ...
# 4. Trainer 설정 (FSDP 사용)
trainer = Trainer(
model=model,
args=TrainingArguments(
# ... (학습 설정) ...
fsdp="full_shard auto_wrap", # FSDP 활성화!
fsdp_transformer_layer_cls_to_wrap="LlamaDecoderLayer", # FSDP 래핑 대상 레이어
),
# ...
)
# 5. 학습 시작
trainer.train()
# 6. 모델 저장
# ...
핵심 변경 사항:
model_id: 더 큰 모델(Llama 3 70B) 사용bnb_config: QLoRA를 위한 4비트 양자화 설정device_map: 모든 것을 GPU 0에 로드 (FSDP가 알아서 분산)peft_config: LoRA 설정 (rank를 더 높게 설정할 수 있음)TrainingArguments: fsdp 파라미터를 사용하여 FSDP 활성화주의: 위 코드는 예시이며, 실제로 실행하려면 추가적인 설정(데이터셋 경로, 하이퍼파라미터 등)이 필요합니다.
LoRA는 여전히 유용한 기법이지만, 대규모 모델 파인튜닝의 "최종 해결책"은 아닙니다. QLoRA와 FSDP와 같은 새로운 기술들은 더 큰 모델, 더 많은 데이터를 사용하여 더 높은 성능을 달성할 수 있는 가능성을 열어주고 있습니다.
물론, 이러한 기술들을 활용하려면 더 많은 컴퓨팅 자원과 기술적인 지식이 필요합니다. 하지만, LLM 연구가 빠르게 발전하고 있는 만큼, 앞으로 더 쉽고 효율적인 파인튜닝 방법들이 등장할 것으로 기대됩니다.
핵심 요약:
참고:
peft 라이브러리를 제공합니다.Trainer를 사용하면 FSDP를 쉽게 사용할 수 있습니다.gradient_checkpointing=True를 통해서 메모리 관리가 가능합니다.대규모 언어 모델(LLM)은 자연어 처리 분야에 혁명을 가져왔지만, 여전히 특정 작업에 맞게 모델을 미세 조정(fine-tuning)하는 것은 어려운 과제입니다. 특히 수십억, 수백억 개의 파라미터를 가진 모델을 학습시키려면 막대한 컴퓨팅 자원과 시간이 필요합니다.
이러한 문제에 대한 해결책으로 LoRA (Low-Rank Adaptation)가 등장했지만, 최근에는 LoRA의 한계에 대한 지적과 함께 더 효율적이고 강력한 파인튜닝 기법들이 주목받고 있습니다.
저는 최근 Kaggle의 "Google - Unlock Global Communication with Gemma" 대회에 참가하여, Gemma 2 모델을 한국어 감정 대화 데이터셋에 파인튜닝하는 프로젝트를 진행했습니다. (제 노트북)
초기에는 LoRA를 사용하여 파인튜닝을 시도했지만, 만족스러운 결과를 얻기 어려웠습니다. 낮은 LoRA rank는 모델의 표현력을 제한했고, 시간과 리소스 제약으로 충분한 학습도 어려웠습니다. 한국어 데이터에 대한 사전 학습이 부족한 Gemma 2 모델의 한계도 느껴졌습니다.
KISTI의 KONI 모델과 비교했을 때, KONI는 과학기술 분야에 특화되어 해당 분야에서는 더 정확했지만, 일반적인 감정 대화에서는 부자연스러운 응답을 보이기도 했습니다.
이러한 경험을 통해, 저는 LoRA가 대규모 모델을 제대로 활용하기에는 한계가 있으며, 특히 한국어와 같이 특정 언어/문화에 대한 고려가 필요한 경우에는 더욱 그렇다는 것을 깨달았습니다.
최근 LLM 연구는 모델의 크기를 키우는 방향으로 진행되고 있습니다. 더 큰 모델은 더 많은 지식을 저장하고 복잡한 추론을 수행할 수 있지만, 학습 비용이 기하급수적으로 증가합니다.
이러한 문제를 해결하기 위해 등장한 것이 바로 QLoRA (Quantized LoRA) 와 FSDP (Fully Sharded Data Parallelism) 입니다.
Philipp Schmid는 그의 블로그 글 "Efficiently fine-tune Llama 3 with PyTorch FSDP and Q-Lora"에서 QLoRA와 FSDP를 사용하여 Llama 3 70B 모델을 파인튜닝하는 방법을 상세히 설명합니다.
핵심 내용 요약:
HuggingFaceH4/no_robots 데이터셋을 로드하고, 대화 형식에 맞게 전처리합니다.transformers 라이브러리를 사용하여 Llama 3 70B 모델과 토크나이저를 로드합니다. 이때, BitsAndBytesConfig를 사용하여 QLoRA를 위한 4비트 양자화 설정을 적용합니다.peft 라이브러리를 사용하여 LoRA 설정을 구성합니다. (rank, alpha, target_modules 등)transformers의 Trainer를 사용하고, TrainingArguments에서 FSDP 관련 설정을 추가합니다. (fsdp="full_shard auto_wrap", fsdp_transformer_layer_cls_to_wrap="LlamaDecoderLayer")trainer.train()을 호출하여 학습을 시작합니다.코드 예시 (일부):
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, TrainingArguments
from peft import LoraConfig, get_peft_model
from trl import SFTTrainer
# QLoRA 설정
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
# 모델 및 토크나이저 로드
model_id = "meta-llama/Meta-Llama-3-70B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map={"": 0}, # FSDP가 알아서 분산
)
# LoRA 설정
peft_config = LoraConfig(
# ... (LoRA 설정, rank는 더 높게!) ...
)
model = get_peft_model(model, peft_config)
# Trainer 설정 (FSDP 사용)
trainer = SFTTrainer( #Trl 라이브러리 사용
model=model,
args=TrainingArguments(
# ... (학습 설정) ...
fsdp="full_shard auto_wrap", # FSDP 활성화!
fsdp_transformer_layer_cls_to_wrap="LlamaDecoderLayer", # FSDP 래핑 대상 레이어, Llama3에 맞는 레이어 이름
),
# ...
)
# 학습 시작
trainer.train()
Philipp Schmid의 블로그 글에서 주목할 점:
LoRA는 여전히 유용한 기법이지만, 대규모 모델 파인튜닝의 "최종 해결책"은 아닙니다. QLoRA와 FSDP와 같은 새로운 기술들은 더 큰 모델, 더 많은 데이터를 사용하여 더 높은 성능을 달성할 수 있는 가능성을 열어주고 있습니다.
물론, 이러한 기술들을 활용하려면 더 많은 컴퓨팅 자원과 기술적인 지식이 필요합니다. 하지만, LLM 연구가 빠르게 발전하고 있는 만큼, 앞으로 더 쉽고 효율적인 파인튜닝 방법들이 등장할 것으로 기대됩니다.
핵심 요약:
이 글은 LoRA에 대한 비판적인 시각을 제시하고, QLoRA와 FSDP를 활용한 대규모 모델 파인튜닝 방법을 소개하는 데 초점을 맞추었습니다. 또한, Philipp Schmid의 블로그 글을 참고하여 실제 코드 예시와 함께 Llama 3 70B 모델 파인튜닝 방법을 설명했습니다. 블로그의 독자층, 목적 등에 따라 내용을 추가하거나 수정할 수 있습니다.