llm lora tune

Hyunwoo·2025년 2월 12일

https://huggingface.co/KISTI-KONI/KONI-Llama3.1-70B-Instruct-![](https://velog.velcdn.com/images/hwkims/post/867e984f-bbd5-461a-b83c-eaf941f4317b/image.png)


좋습니다. 기존의 LoRA 방식에 대한 비판적인 시각과 QLoRA, FSDP를 활용한 대규모 모델 파인튜닝에 대한 내용을 중심으로 블로그 글을 수정하고, 최신 트렌드를 반영하여 다시 작성해 보겠습니다.


LoRA는 이제 그만? Gemma, KONI 파인튜닝 삽질 후기와 대규모 모델 학습의 새로운 길 (QLoRA + FSDP)

서론: LoRA의 한계와 대규모 모델 파인튜닝의 어려움

대규모 언어 모델(LLM)의 등장으로 자연어 처리 분야는 혁신적인 발전을 이루었지만, 이러한 모델을 특정 작업에 맞게 미세 조정(fine-tuning)하는 것은 여전히 쉽지 않은 문제입니다. 특히, 수십억, 수백억 개의 파라미터를 가진 모델을 학습시키려면 막대한 컴퓨팅 자원과 시간이 필요합니다.

이러한 문제에 대한 해결책으로 제시되었던 것이 LoRA (Low-Rank Adaptation) 입니다. LoRA는 원래 모델의 가중치를 동결하고, 작은 "어댑터" 행렬만 학습하여 파라미터 효율성을 높이는 방식입니다. 하지만, 최근 LoRA의 한계에 대한 지적과 함께, 더 효율적이고 강력한 파인튜닝 기법들이 등장하고 있습니다.

Gemma와 KONI, 그리고 LoRA: 삽질 후기

저는 최근 Kaggle의 "Google - Unlock Global Communication with Gemma" 대회에 참가하여, Gemma 2 모델을 한국어 감정 대화 데이터셋에 파인튜닝하는 프로젝트를 진행했습니다.(제 노트북)

초기에는 LoRA를 사용하여 파인튜닝을 시도했지만, 만족스러운 결과를 얻기 어려웠습니다.

  • 낮은 LoRA Rank의 한계: 모델의 표현력이 제한되어 파인튜닝 데이터에 과도하게 의존하고, 일반화 능력이 떨어지는 문제가 발생했습니다.
  • 짧은 학습 시간: 시간과 리소스 제약으로 인해 충분한 epoch 동안 학습시키지 못했습니다.
  • Gemma 2 모델 자체의 한계?: 한국어 데이터에 대한 사전 학습이 부족한 것인지, 한국어 특유의 뉘앙스나 감정 표현을 제대로 이해하지 못하는 경우가 있었습니다.

KISTI에서 개발한 한국어 LLM인 KONI-Llama3.1-70B-Instruct 모델과 비교했을 때, KONI 모델은 과학기술 분야에 특화되어 있어 해당 분야의 질문에는 더 정확했지만, 일반적인 감정 대화에서는 오히려 부자연스러운 응답을 생성하기도 했습니다.

이러한 경험을 통해, 저는 LoRA가 모든 경우에 최적의 솔루션은 아니며, 특히 대규모 모델을 제대로 활용하기에는 한계가 있다는 것을 깨달았습니다.

대규모 모델 파인튜닝의 새로운 길: QLoRA + FSDP

최근 LLM 연구는 모델의 크기를 키우는 방향으로 진행되고 있습니다. 더 큰 모델은 더 많은 지식을 저장하고, 더 복잡한 추론을 수행할 수 있지만, 학습 비용이 기하급수적으로 증가한다는 문제가 있습니다.

이러한 문제를 해결하기 위해 등장한 것이 QLoRA (Quantized LoRA)FSDP (Fully Sharded Data Parallelism) 입니다.

  • QLoRA:

    • LoRA를 양자화(quantization) 기법과 결합한 방식입니다.
    • 모델의 가중치를 4비트 또는 8비트와 같이 낮은 정밀도로 표현하여 메모리 사용량을 획기적으로 줄입니다.
    • 이를 통해, 더 큰 모델을 더 적은 GPU 메모리로 파인튜닝할 수 있게 됩니다.
    • QLoRA 논문(https://arxiv.org/abs/2305.14314)에서는 4비트 QLoRA가 16비트 full fine-tuning과 거의 동등한 성능을 낸다고 보고합니다.
  • FSDP:

    • 대규모 모델을 여러 GPU에 분산하여 학습하는 기법입니다.
    • 모델의 가중치, 옵티마이저 상태, 그래디언트 등을 여러 GPU에 나누어 저장하고, 각 GPU가 자신의 몫에 대한 연산을 수행합니다.
    • 이를 통해, 단일 GPU로는 학습하기 어려운 초대규모 모델도 학습할 수 있게 됩니다.
    • PyTorch, DeepSpeed, Megatron-LM 등 다양한 프레임워크에서 FSDP를 지원합니다.

QLoRA + FSDP의 장점:

  • 메모리 효율성: QLoRA를 통해 모델의 메모리 사용량을 줄입니다.
  • 병렬 처리: FSDP를 통해 여러 GPU를 사용하여 학습 속도를 높입니다.
  • 확장성: 더 큰 모델, 더 많은 데이터를 사용하여 학습할 수 있습니다.
  • 성능: (이론적으로) full fine-tuning에 근접하거나 더 나은 성능을 낼 수 있습니다.

QLoRA + FSDP를 활용한 Llama 3 70B 파인튜닝 (예시)

다음은 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는 끝났는가? 대규모 모델 파인튜닝의 미래

LoRA는 여전히 유용한 기법이지만, 대규모 모델 파인튜닝의 "최종 해결책"은 아닙니다. QLoRA와 FSDP와 같은 새로운 기술들은 더 큰 모델, 더 많은 데이터를 사용하여 더 높은 성능을 달성할 수 있는 가능성을 열어주고 있습니다.

물론, 이러한 기술들을 활용하려면 더 많은 컴퓨팅 자원과 기술적인 지식이 필요합니다. 하지만, LLM 연구가 빠르게 발전하고 있는 만큼, 앞으로 더 쉽고 효율적인 파인튜닝 방법들이 등장할 것으로 기대됩니다.

핵심 요약:

  • LoRA는 파라미터 효율적인 파인튜닝 기법이지만, 한계도 존재합니다.
  • QLoRA와 FSDP는 대규모 모델 파인튜닝의 새로운 가능성을 열어줍니다.
  • 최신 연구 동향을 지속적으로 파악하고, 자신의 상황에 맞는 최적의 방법을 선택하는 것이 중요합니다.

참고:

  • Huggingface 에서는 QLoRA를 지원하는 peft 라이브러리를 제공합니다.
  • Huggingface의 Trainer를 사용하면 FSDP를 쉽게 사용할 수 있습니다.
  • QLoRA 튜닝시 gradient_checkpointing=True를 통해서 메모리 관리가 가능합니다.
    알겠습니다. Philipp Schmid의 블로그 글 "Efficiently fine-tune Llama 3 with PyTorch FSDP and Q-Lora"를 읽고, LoRA에 대한 비판적인 시각과 QLoRA, FSDP를 활용한 대규모 모델 파인튜닝에 대한 내용을 중심으로 블로그 글을 작성해 드리겠습니다.

"LoRA는 이제 한물갔나?" - Gemma와 KONI 파인튜닝 삽질 후기, 그리고 QLoRA + FSDP를 활용한 Llama 3 70B 파인튜닝 가이드

서론: 대규모 언어 모델 파인튜닝, LoRA로는 부족하다

대규모 언어 모델(LLM)은 자연어 처리 분야에 혁명을 가져왔지만, 여전히 특정 작업에 맞게 모델을 미세 조정(fine-tuning)하는 것은 어려운 과제입니다. 특히 수십억, 수백억 개의 파라미터를 가진 모델을 학습시키려면 막대한 컴퓨팅 자원과 시간이 필요합니다.

이러한 문제에 대한 해결책으로 LoRA (Low-Rank Adaptation)가 등장했지만, 최근에는 LoRA의 한계에 대한 지적과 함께 더 효율적이고 강력한 파인튜닝 기법들이 주목받고 있습니다.

LoRA를 이용한 Gemma 2, KONI 파인튜닝: 나의 삽질 경험

저는 최근 Kaggle의 "Google - Unlock Global Communication with Gemma" 대회에 참가하여, Gemma 2 모델을 한국어 감정 대화 데이터셋에 파인튜닝하는 프로젝트를 진행했습니다. (제 노트북)

초기에는 LoRA를 사용하여 파인튜닝을 시도했지만, 만족스러운 결과를 얻기 어려웠습니다. 낮은 LoRA rank는 모델의 표현력을 제한했고, 시간과 리소스 제약으로 충분한 학습도 어려웠습니다. 한국어 데이터에 대한 사전 학습이 부족한 Gemma 2 모델의 한계도 느껴졌습니다.

KISTI의 KONI 모델과 비교했을 때, KONI는 과학기술 분야에 특화되어 해당 분야에서는 더 정확했지만, 일반적인 감정 대화에서는 부자연스러운 응답을 보이기도 했습니다.

이러한 경험을 통해, 저는 LoRA가 대규모 모델을 제대로 활용하기에는 한계가 있으며, 특히 한국어와 같이 특정 언어/문화에 대한 고려가 필요한 경우에는 더욱 그렇다는 것을 깨달았습니다.

대규모 모델 파인튜닝, 이제는 QLoRA + FSDP 시대!

최근 LLM 연구는 모델의 크기를 키우는 방향으로 진행되고 있습니다. 더 큰 모델은 더 많은 지식을 저장하고 복잡한 추론을 수행할 수 있지만, 학습 비용이 기하급수적으로 증가합니다.

이러한 문제를 해결하기 위해 등장한 것이 바로 QLoRA (Quantized LoRA)FSDP (Fully Sharded Data Parallelism) 입니다.

  • QLoRA: LoRA를 양자화(quantization) 기법과 결합하여 모델 가중치를 4비트 또는 8비트로 표현, 메모리 사용량을 획기적으로 줄입니다. 덕분에 더 큰 모델을 더 적은 GPU 메모리로 파인튜닝할 수 있습니다.
  • FSDP: 대규모 모델을 여러 GPU에 분산하여 학습하는 기법입니다. 모델 가중치, 옵티마이저 상태, 그래디언트 등을 여러 GPU에 나누어 저장하고, 각 GPU가 자신의 몫에 대한 연산을 수행합니다. 단일 GPU로는 학습하기 어려운 초대규모 모델도 학습 가능하게 합니다.

Philipp Schmid의 블로그 글: QLoRA + FSDP로 Llama 3 70B 파인튜닝하기

Philipp Schmid는 그의 블로그 글 "Efficiently fine-tune Llama 3 with PyTorch FSDP and Q-Lora"에서 QLoRA와 FSDP를 사용하여 Llama 3 70B 모델을 파인튜닝하는 방법을 상세히 설명합니다.

핵심 내용 요약:

  1. 환경 설정: 필요한 라이브러리(PyTorch, Transformers, TRL, peft, datasets 등)를 설치하고, Hugging Face에 로그인합니다.
  2. 데이터셋 준비: HuggingFaceH4/no_robots 데이터셋을 로드하고, 대화 형식에 맞게 전처리합니다.
  3. 모델 및 토크나이저 로드: transformers 라이브러리를 사용하여 Llama 3 70B 모델과 토크나이저를 로드합니다. 이때, BitsAndBytesConfig를 사용하여 QLoRA를 위한 4비트 양자화 설정을 적용합니다.
  4. LoRA 설정: peft 라이브러리를 사용하여 LoRA 설정을 구성합니다. (rank, alpha, target_modules 등)
  5. Trainer 설정: transformersTrainer를 사용하고, TrainingArguments에서 FSDP 관련 설정을 추가합니다. (fsdp="full_shard auto_wrap", fsdp_transformer_layer_cls_to_wrap="LlamaDecoderLayer")
  6. 학습 시작: trainer.train()을 호출하여 학습을 시작합니다.
  7. 모델 저장 및 추론: 학습된 모델(LoRA 어댑터)을 저장하고, 새로운 입력에 대한 추론을 수행합니다.

코드 예시 (일부):

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의 블로그 글에서 주목할 점:

  • 4xA10G (24GB) GPU 환경에서 Llama 3 70B 모델을 파인튜닝하는 구체적인 방법을 제시합니다.
  • PyTorch FSDPHugging Face Transformers, TRL, peft 라이브러리를 통합하여 사용하는 방법을 보여줍니다.
  • Flash Attention v2를 활용하여 학습 속도를 높입니다.
  • 자세한 코드 예시와 설명을 제공하여 독자들이 쉽게 따라 할 수 있도록 합니다.

결론: LoRA는 끝이 아니다. 대규모 모델 파인튜닝의 미래

LoRA는 여전히 유용한 기법이지만, 대규모 모델 파인튜닝의 "최종 해결책"은 아닙니다. QLoRA와 FSDP와 같은 새로운 기술들은 더 큰 모델, 더 많은 데이터를 사용하여 더 높은 성능을 달성할 수 있는 가능성을 열어주고 있습니다.

물론, 이러한 기술들을 활용하려면 더 많은 컴퓨팅 자원과 기술적인 지식이 필요합니다. 하지만, LLM 연구가 빠르게 발전하고 있는 만큼, 앞으로 더 쉽고 효율적인 파인튜닝 방법들이 등장할 것으로 기대됩니다.

핵심 요약:

  • LoRA는 파라미터 효율적인 파인튜닝 기법이지만, 한계도 존재합니다.
  • QLoRA와 FSDP는 대규모 모델 파인튜닝의 새로운 가능성을 열어줍니다.
  • 최신 연구 동향을 지속적으로 파악하고, 자신의 상황에 맞는 최적의 방법을 선택하는 것이 중요합니다.
  • Philipp Schmid의 블로그 글은 QLoRA + FSDP를 활용한 Llama 3 70B 파인튜닝의 좋은 시작점이 될 수 있습니다.

이 글은 LoRA에 대한 비판적인 시각을 제시하고, QLoRA와 FSDP를 활용한 대규모 모델 파인튜닝 방법을 소개하는 데 초점을 맞추었습니다. 또한, Philipp Schmid의 블로그 글을 참고하여 실제 코드 예시와 함께 Llama 3 70B 모델 파인튜닝 방법을 설명했습니다. 블로그의 독자층, 목적 등에 따라 내용을 추가하거나 수정할 수 있습니다.

profile
현우

0개의 댓글