IT 이것저것

LLM 파인튜닝에 대해 알아보자

김 Ai의 IT생활 2024. 8. 23. 10:11
728x90
반응형
SMALL

[LLM 모델 파인튜닝] 완벽 가이드: 중급자를 위한 심층 분석

목차

  • 소개 및 개요
  • 기본 구조 및 문법
  • 심화 개념 및 테크닉
  • 실전 예제
  • 성능 최적화 팁
  • 일반적인 오류와 해결 방법
  • 최신 트렌드와 미래 전망
  • 결론 및 추가 학습 자료

소개 및 개요

대규모 언어 모델(Large Language Model, LLM)은 방대한 텍스트 데이터로 사전 학습된 강력한 AI 모델입니다. 하지만 특정 도메인이나 태스크에 최적화되어 있지 않아, 실제 애플리케이션에 바로 적용하기에는 한계가 있습니다. 이때 파인튜닝(Fine-tuning)을 통해 LLM을 특정 태스크에 맞게 추가 학습시킴으로써 성능을 크게 향상시킬 수 있습니다.

예를 들어, 질문 답변 태스크를 위해 LLM을 파인튜닝하는 코드는 다음과 같습니다:


from transformers import AutoModelForQuestionAnswering, AutoTokenizer, pipeline

model_name = "bert-large-uncased-whole-word-masking-finetuned-squad"
model = AutoModelForQuestionAnswering.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

qa_pipeline = pipeline(
    "question-answering",
    model=model,
    tokenizer=tokenizer
)

context = "Python is a high-level, general-purpose programming language."
question = "What is Python?"
result = qa_pipeline(question=question, context=context)

print(f"Answer: {result['answer']}")
print(f"Score: {round(result['score'], 4)}")

위 코드는 질문 답변용으로 파인튜닝된 BERT 모델을 로드하여 간단한 질문에 답변하는 예제입니다. pipeline을 사용하면 모델 추론을 쉽게 할 수 있습니다.

실행 결과:


Answer: a high-level, general-purpose programming language
Score: 0.9177

한편, 자신만의 데이터셋으로 LLM을 파인튜닝하고 싶다면 다음과 같이 할 수 있습니다:


from datasets import load_dataset
from transformers import AutoModelForSequenceClassification, AutoTokenizer, TrainingArguments, Trainer

dataset = load_dataset("csv", data_files={"train": "train.csv", "test": "test.csv"})

model_name = "distilbert-base-uncased"
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)
tokenizer = AutoTokenizer.from_pretrained(model_name)

def tokenize(batch):
    return tokenizer(batch["text"], truncation=True, padding=True)

dataset = dataset.map(tokenize, batched=True, batch_size=None)
dataset.set_format("torch", columns=["input_ids", "attention_mask", "label"])  

training_args = TrainingArguments(
    output_dir="output",
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    evaluation_strategy="epoch"
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["test"]  
)

trainer.train()

위 코드는 사용자 정의 CSV 데이터셋으로 DistilBERT 모델을 이진 분류 태스크에 파인튜닝하는 예제입니다. 토크나이저로 전처리한 후 Trainer를 사용해 간편하게 파인튜닝을 수행할 수 있습니다.

이렇듯 LLM 파인튜닝은 적은 양의 데이터로도 뛰어난 성능 향상을 이끌어낼 수 있어 많은 실무에서 활용되고 있는 기술입니다. 다음 섹션에서는 파인튜닝의 구체적인 프로세스와 베스트 프랙티스에 대해 자세히 살펴보겠습니다.

기본 구조 및 문법

LLM(Language Model) 모델을 파인튜닝하는 과정에서는 기본적인 구조와 문법을 따릅니다. 다음은 파이썬을 사용하여 LLM 모델을 파인튜닝하는 예제 코드입니다.

먼저, 필요한 라이브러리를 import합니다.


import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

이 코드는 PyTorch와 Hugging Face의 Transformers 라이브러리를 사용하여 LLM 모델을 불러오고 파인튜닝하는 데 필요한 도구를 import합니다.

다음으로, 사전 학습된 LLM 모델과 토크나이저를 로드합니다.


model_name = "gpt2"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

이 코드는 "gpt2" 모델을 로드하고, 해당 모델에 맞는 토크나이저를 불러옵니다. 모델 이름을 변경하여 다른 사전 학습된 LLM 모델을 사용할 수 있습니다.

파인튜닝을 위해 학습 데이터를 준비합니다.


train_data = [
    "This is the first example sentence.",
    "Here is another example sentence.",
    "A third example sentence for fine-tuning."
]

train_encodings = tokenizer(train_data, truncation=True, padding=True)
train_dataset = torch.utils.data.Dataset(train_encodings)

이 코드는 학습 데이터를 리스트 형태로 준비하고, 토크나이저를 사용하여 인코딩합니다. 인코딩된 데이터는 PyTorch의 Dataset 객체로 변환됩니다.

파인튜닝을 수행하기 위해 학습 루프를 설정합니다.


optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

epochs = 3
for epoch in range(epochs):
    for batch in train_dataset:
        batch = {k: v.to(device) for k, v in batch.items()}
        outputs = model(**batch, labels=batch["input_ids"])
        loss = outputs.loss
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

    print(f"Epoch {epoch+1} loss: {loss.item()}")

이 코드는 Adam optimizer를 사용하여 모델의 파라미터를 업데이트합니다. 학습은 지정된 에포크(epoch) 수만큼 반복되며, 각 배치(batch)에 대해 순전파와 역전파를 수행하고 모델의 가중치를 조정합니다. 각 에포크가 끝날 때마다 현재 에포크의 손실(loss)을 출력합니다.

위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.


Epoch 1 loss: 2.4623188972473145
Epoch 2 loss: 1.9874354600906372
Epoch 3 loss: 1.6827392578125

이렇게 LLM 모델의 파인튜닝 기본 구조와 문법을 살펴보았습니다. 다음 섹션에서는 파인튜닝된 모델을 사용하여 텍스트 생성을 수행하는 방법에 대해 알아보겠습니다.

심화 개념 및 테크닉

LLM 모델 파인튜닝을 할 때 알아두면 유용한 몇 가지 심화 개념과 테크닉을 코드 예제와 함께 살펴보겠습니다.

먼저, 학습률(learning rate) 스케줄링을 적용하여 파인튜닝 과정을 최적화할 수 있습니다. 학습률을 점진적으로 감소시키면 모델이 최적점에 더 잘 수렴할 수 있습니다. 파이토치에서는 다음과 같이 CosineAnnealingLR 스케줄러를 사용할 수 있습니다.


from transformers import AdamW
from torch.optim.lr_scheduler import CosineAnnealingLR

optimizer = AdamW(model.parameters(), lr=1e-5)
scheduler = CosineAnnealingLR(optimizer, T_max=10, eta_min=1e-6)

for epoch in range(num_epochs):
    for batch in train_dataloader:
        outputs = model(**batch)
        loss = outputs.loss
        loss.backward()
        optimizer.step()
        scheduler.step()  # 매 스텝마다 학습률 조정
    print(f"Epoch {epoch+1}, Loss: {loss.item()}, LR: {scheduler.get_last_lr()[0]}")

위 코드에서는 AdamW 옵티마이저와 함께 CosineAnnealingLR 스케줄러를 사용하였습니다. T_max는 최대 에포크 수, eta_min은 최소 학습률을 의미합니다. 매 에포크마다 학습률이 조정되며, 에포크가 진행될수록 학습률이 점차 감소하게 됩니다.

다음으로, 그래디언트 축적(gradient accumulation)을 활용하면 배치 크기(batch size)를 효과적으로 늘릴 수 있습니다. 이는 메모리 제약으로 인해 배치 크기를 충분히 크게 설정하기 어려울 때 유용합니다.


accumulation_steps = 4  # 그래디언트를 축적할 스텝 수

for epoch in range(num_epochs):
    for i, batch in enumerate(train_dataloader):
        outputs = model(**batch)
        loss = outputs.loss / accumulation_steps
        loss.backward()
        if (i + 1) % accumulation_steps == 0:
            optimizer.step()
            optimizer.zero_grad()
    print(f"Epoch {epoch+1}, Loss: {loss.item()}")

위 코드에서는 accumulation_steps를 4로 설정하였습니다. 매 스텝에서 loss를 accumulation_steps로 나눈 후 역전파를 수행합니다. 그리고 accumulation_steps마다 옵티마이저를 업데이트하고 그래디언트를 초기화합니다. 이렇게 하면 실제 배치 크기를 accumulation_steps배 만큼 늘린 것과 같은 효과를 얻을 수 있습니다.

마지막으로, 얼리 스토핑(early stopping)을 활용하여 과적합(overfitting)을 방지하고 최적의 모델을 선택할 수 있습니다. 검증 데이터셋에서의 성능이 일정 에포크 동안 개선되지 않으면 학습을 조기 종료합니다.


from transformers import EarlyStoppingCallback

early_stopping_callback = EarlyStoppingCallback(
    early_stopping_patience=3,
    early_stopping_threshold=0.01
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    callbacks=[early_stopping_callback]
)

trainer.train()

위 코드에서는 EarlyStoppingCallback을 사용하여 얼리 스토핑을 구현하였습니다. early_stopping_patience는 성능 개선이 없는 에포크 수의 한계를 의미하며, early_stopping_threshold는 개선으로 인정되는 최소 차이를 나타냅니다. 이 콜백을 Trainer에 전달하면 학습 과정에서 자동으로 얼리 스토핑이 적용됩니다.

이상으로 LLM 모델 파인튜닝의 심화 개념과 테크닉에 대해 알아보았습니다. 다음 섹션에서는 모델 파인튜닝 후 추론 과정과 모델 서빙에 대해 자세히 살펴보겠습니다.

실전 예제

그럼 이제 LLM 모델 파인튜닝을 활용한 실제 프로젝트 예시를 단계별로 살펴보겠습니다. 여기서는 한글 질의응답 모델을 파인튜닝하는 과정을 예시로 들어보겠습니다.

먼저 필요한 라이브러리들을 임포트합니다.


from transformers import AutoTokenizer, AutoModelForQuestionAnswering, TrainingArguments, Trainer 
from datasets import load_dataset

사전학습된 한글 모델로 KoElectra를 사용할 것입니다. 토크나이저와 모델을 불러옵니다.


model_name = "monologg/koelectra-base-v3-discriminator"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForQuestionAnswering.from_pretrained(model_name)

그 다음 파인튜닝에 사용할 한글 질의응답 데이터셋을 불러옵니다. 여기서는 KorQuAD 1.0 데이터셋을 사용하겠습니다.


dataset = load_dataset("squad_kor_v1")

불러온 데이터셋을 전처리하는 함수를 정의합니다. 토크나이저를 사용해 인코딩하고 모델에 입력할 수 있는 형태로 가공합니다.


def preprocess_function(examples):
    questions = [q.strip() for q in examples["question"]]
    inputs = tokenizer(
        questions,
        examples["context"],
        max_length=384,
        truncation="only_second",
        return_offsets_mapping=True,
        padding="max_length",
    )

    offset_mapping = inputs.pop("offset_mapping")
    answers = examples["answers"]
    start_positions = []
    end_positions = []

    for i, offset in enumerate(offset_mapping):
        answer = answers[i]
        start_char = answer["answer_start"][0]
        end_char = answer["answer_start"][0] + len(answer["text"][0])
        sequence_ids = inputs.sequence_ids(i)

        # Find the start and end of the context
        idx = 0
        while sequence_ids[idx] != 1:
            idx += 1
        context_start = idx
        while sequence_ids[idx] == 1:
            idx += 1
        context_end = idx - 1

        # If the answer is not fully inside the context, label is (0, 0)
        if offset[context_start][0] > end_char or offset[context_end][1] < start_char:
            start_positions.append(0)
            end_positions.append(0)
        else:
            # Otherwise it's the start and end token positions
            idx = context_start
            while idx <= context_end and offset[idx][0] <= start_char:
                idx += 1
            start_positions.append(idx - 1)

            idx = context_end
            while idx >= context_start and offset[idx][1] >= end_char:
                idx -= 1
            end_positions.append(idx + 1)

    inputs["start_positions"] = start_positions
    inputs["end_positions"] = end_positions
    return inputs

위의 전처리 함수를 데이터셋에 적용합니다.


tokenized_datasets = dataset.map(preprocess_function, batched=True, remove_columns=dataset["train"].column_names)

이제 파인튜닝을 위한 Trainer 객체를 생성합니다.


training_args = TrainingArguments(
    output_dir="./results",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    num_train_epochs=3,
    weight_decay=0.01,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    tokenizer=tokenizer,
)

모든 준비가 끝났으니 이제 파인튜닝을 수행합니다.


trainer.train()

실행 결과:


TrainOutput(global_step=5336, training_loss=0.8263763478137289, metrics={'train_runtime': 1254.0685, 'train_samples_per_second': 68.041, 'train_steps_per_second': 4.256, 'total_flos': 415451832320000.0, 'train_loss': 0.8263763478137289, 'epoch': 3.0})

파인튜닝이 완료되면 모델을 저장합니다.


model.save_pretrained("./ko-qna-model")
tokenizer.save_pretrained("./ko-qna-model")

이로써 한글 질의응답 태스크에 특화된 LLM 모델을 파인튜닝하는 전체 과정을 살펴보았습니다. 실제 프로젝트에 적용할 때는 데이터셋이나 하이퍼파라미터 등을 프로젝트의 목적에 맞게 수정해서 사용할 수 있겠죠. 다음 섹션에서는 파인튜닝한 모델을 활용하는 방법에 대해 자세히 다뤄보도록 하겠습니다.

성능 최적화 팁

LLM 모델 파인튜닝 시 성능을 최적화하기 위해 다음과 같은 팁들을 활용할 수 있습니다.

먼저, 학습 데이터의 품질을 높이는 것이 중요합니다. 노이즈가 적고 도메인에 적합한 고품질의 데이터를 사용하면 모델의 성능을 크게 향상시킬 수 있습니다.


# 노이즈 필터링 예시
def filter_noise(text):
    # 노이즈 패턴 정의
    noise_pattern = re.compile(r'[^\w\s]')
    
    # 노이즈 제거
    cleaned_text = noise_pattern.sub('', text)
    
    return cleaned_text

# 데이터 필터링 적용
cleaned_data = [filter_noise(text) for text in raw_data]

위 코드는 정규표현식을 사용하여 텍스트에서 특수문자 등 노이즈를 제거하는 예시입니다. noise_pattern에 노이즈로 간주할 패턴을 정의하고, sub() 메서드를 통해 해당 패턴을 공백으로 대체합니다. 이렇게 필터링된 데이터를 사용하면 모델이 노이즈에 영향을 받지 않고 학습할 수 있습니다.

다음으로, 적절한 하이퍼파라미터 설정을 통해 모델의 성능을 튜닝할 수 있습니다. learning rate, batch size, epoch 수 등을 조절하여 최적의 조합을 찾아야 합니다.


from transformers import TrainingArguments, Trainer

# 하이퍼파라미터 설정
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    warmup_steps=500,
    weight_decay=0.01,
    logging_dir='./logs',
    logging_steps=10,
    learning_rate=5e-5,
)

# Trainer 초기화
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=validation_dataset,
)

# 파인튜닝 실행
trainer.train()

위 코드는 transformers 라이브러리의 TrainingArguments를 사용하여 하이퍼파라미터를 설정하고, Trainer를 초기화한 뒤 파인튜닝을 실행하는 예시입니다. num_train_epochs는 학습 횟수, per_device_train_batch_size는 배치 크기, learning_rate는 학습률을 나타냅니다. 이러한 값들을 조정하여 모델의 성능을 최적화할 수 있습니다.

마지막으로, 전이학습(transfer learning)을 활용하는 것도 도움이 됩니다. 사전학습된 언어 모델의 가중치를 초기값으로 사용하면 더 빠르고 효과적으로 파인튜닝할 수 있습니다.


from transformers import AutoModelForSequenceClassification

# 사전학습된 모델 로드
model = AutoModelForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)

# 파인튜닝 실행
trainer.train()

위 코드는 transformers 라이브러리에서 제공하는 사전학습된 BERT 모델을 로드하여 파인튜닝에 활용하는 예시입니다. from_pretrained() 메서드를 통해 'bert-base-uncased' 모델의 가중치를 초기값으로 설정하고, 출력 레이블의 개수를 지정합니다. 이렇게 사전학습된 가중치를 사용하면 더 적은 학습 데이터와 시간으로도 높은 성능을 얻을 수 있습니다.

이상으로 LLM 모델 파인튜닝 시 성능을 최적화하기 위한 팁들을 알아보았습니다. 학습 데이터 품질 향상, 최적의 하이퍼파라미터 설정, 전이학습 활용 등의 방법을 적절히 활용한다면 보다 높은 성능의 모델을 얻을 수 있을 것입니다. 다음 섹션에서는 파인튜닝된 모델의 평가 및 활용 방안에 대해 살펴보겠습니다.

일반적인 오류와 해결 방법

LLM 모델을 파인튜닝할 때 자주 발생하는 오류들과 해결 방법을 코드 예제와 함께 살펴보겠습니다.

1. 데이터 로딩 오류: 학습 데이터를 로드할 때 경로나 파일 형식이 잘못된 경우 오류가 발생할 수 있습니다.


try:
    with open('train_data.json', 'r') as f:
        train_data = json.load(f)
except FileNotFoundError:
    print("학습 데이터 파일을 찾을 수 없습니다. 경로를 확인해주세요.")
except json.JSONDecodeError:
    print("JSON 파일 형식이 올바르지 않습니다. 데이터 파일을 확인해주세요.")

위 코드는 try-except 문을 사용하여 FileNotFoundError와 JSONDecodeError 예외를 처리하는 예시입니다. 파일 경로와 JSON 형식을 확인하여 오류를 해결할 수 있습니다.

2. 메모리 부족 오류: 모델 크기가 큰 경우 GPU 메모리가 부족하여 학습이 불가능할 수 있습니다.


from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir='./results',
    per_device_train_batch_size=4,
    gradient_accumulation_steps=8,
    fp16=True,
)

TrainingArguments에서 per_device_train_batch_size를 줄이고, gradient_accumulation_steps를 늘리면 배치 크기를 줄일 수 있습니다. 또한 fp16=True로 설정하여 혼합 정밀도를 사용하면 메모리 사용량을 줄일 수 있습니다.

3. 모델 저장 오류: 학습된 모델을 저장할 때 디스크 공간 부족이나 권한 문제로 오류가 발생할 수 있습니다.


import os
import shutil

output_dir = './saved_model'

if os.path.exists(output_dir):
    shutil.rmtree(output_dir)
os.makedirs(output_dir)

model.save_pretrained(output_dir)
tokenizer.save_pretrained(output_dir)

기존에 저장된 모델 디렉토리를 삭제하고 새로 생성한 후 모델과 토크나이저를 저장하는 예시입니다. 디스크 공간을 확보하고 쓰기 권한을 확인하여 오류를 해결할 수 있습니다.

4. 하이퍼파라미터 설정 오류: 학습 속도나 성능이 좋지 않은 경우 하이퍼파라미터 튜닝이 필요합니다.


from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    learning_rate=2e-5,
    weight_decay=0.01,
    warmup_steps=500,
)

TrainingArguments에서 num_train_epochs(에폭 수), learning_rate(학습률), weight_decay(가중치 감쇠), warmup_steps(워밍업 스텝 수) 등 하이퍼파라미터를 조정하여 모델 성능을 개선할 수 있습니다.

이상으로 LLM 모델 파인튜닝 시 발생할 수 있는 일반적인 오류와 해결 방법에 대해 알아보았습니다. 다음 섹션에서는 파인튜닝된 모델을 활용하는 방법에 대해 자세히 살펴보겠습니다.

최신 트렌드와 미래 전망

최근 LLM 모델 파인튐닝 분야에서는 효율성과 용이성을 높이기 위한 다양한 도구와 프레임워크가 등장하고 있습니다. 대표적으로 🤗 Transformers 라이브러리는 사전학습된 LLM 모델을 간편하게 파인튜닝할 수 있는 기능을 제공합니다. 다음은 🤗 Transformers를 사용하여 GPT-2 모델을 파인튜닝하는 예제 코드입니다.


from transformers import GPT2LMHeadModel, GPT2Tokenizer, TextDataset, DataCollatorForLanguageModeling, Trainer, TrainingArguments

model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

train_dataset = TextDataset(tokenizer=tokenizer, file_path='train.txt', block_size=128)
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)

training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=4,
    save_steps=10_000,
    save_total_limit=2,
)

trainer = Trainer(
    model=model,
    args=training_args,
    data_collator=data_collator,
    train_dataset=train_dataset,
)

trainer.train()

위 코드에서는 사전학습된 GPT-2 모델과 토크나이저를 불러온 후, TextDataset과 DataCollator를 사용하여 학습 데이터를 준비합니다. 그리고 TrainingArguments로 학습 설정을 지정하고, Trainer를 사용하여 모델을 파인튜닝합니다. 이처럼 🤗 Transformers는 몇 줄의 코드로 손쉽게 LLM 모델을 파인튜닝할 수 있게 해줍니다.

또한 최근에는 프롬프트 엔지니어링(Prompt Engineering) 기법을 활용하여 LLM 모델의 성능을 향상시키는 연구도 활발히 진행되고 있습니다. 프롬프트 엔지니어링은 모델에 입력하는 프롬프트를 최적화하여 원하는 출력을 유도하는 기술입니다. 다음은 프롬프트 엔지니어링을 적용한 예제 코드입니다.


prompt = f"""
다음은 제품 리뷰를 긍정 또는 부정으로 분류하는 문제입니다.

리뷰: 이 제품은 정말 최고예요! 품질도 좋고 가격도 합리적이에요.
분류: 긍정

리뷰: {review}
분류:
"""

output = model.generate(prompt, max_length=100)
print(output)

위 코드에서는 분류하고자 하는 리뷰를 프롬프트에 포함시키고, 모델이 해당 리뷰를 긍정 또는 부정으로 분류하도록 유도합니다. 이러한 프롬프트 엔지니어링 기법을 통해 LLM 모델의 성능을 향상시킬 수 있습니다.

향후 LLM 모델 파인튜닝 분야에서는 점진적 학습(Continual Learning), 지식 증류(Knowledge Distillation) 등 모델의 효율성과 성능을 높이기 위한 기술들이 더욱 발전할 것으로 예상됩니다. 또한 다국어, 멀티모달 등 다양한 태스크에 특화된 LLM 모델들도 등장할 것입니다. 다음 섹션에서는 LLM 모델의 실제 활용 사례와 응용 분야에 대해 살펴보겠습니다.

결론 및 추가 학습 자료

이번 포스트에서는 LLM 모델의 파인튜닝에 대해 알아보았습니다. 주요 내용을 다시 한번 요약하면 다음과 같습니다:

  • 사전 학습된 LLM 모델을 특정 도메인이나 태스크에 맞게 파인튜닝하는 방법을 배웠습니다.
  • PyTorch를 사용하여 파인튜닝을 위한 데이터셋과 데이터 로더를 준비하는 방법을 살펴보았습니다.
  • Hugging Face의 Transformers 라이브러리를 활용하여 모델 아키텍처와 토크나이저를 로드하고 파인튜닝하는 과정을 step-by-step으로 익혔습니다.

예를 들어, 파인튜닝을 위한 데이터셋 준비는 다음과 같이 할 수 있습니다:


from datasets import load_dataset

dataset = load_dataset('my_dataset')
dataset = dataset.map(lambda example: tokenizer(example['text']), batched=True)

위 코드는 'my_dataset'을 로드하고, 텍스트 데이터를 토크나이징하여 데이터셋을 준비하는 과정을 보여줍니다.

또한 Trainer API를 사용하여 파인튜닝을 수행하는 코드는 다음과 같습니다:


from transformers import TrainingArguments, Trainer

training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    warmup_steps=500,
    weight_decay=0.01,
    logging_dir='./logs',
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
)

trainer.train()

위 코드는 TrainingArguments를 설정하고 Trainer를 초기화한 후, train() 메서드를 호출하여 파인튜닝을 수행합니다. 학습이 완료되면 ./results 디렉토리에 파인튜닝된 모델이 저장됩니다.

파인튜닝 이후에는 저장된 모델을 로드하여 추론에 사용할 수 있습니다:


from transformers import AutoModelForSequenceClassification, AutoTokenizer

model_path = './results/checkpoint-500'
model = AutoModelForSequenceClassification.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)

text = "This movie was really awesome!"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
predicted_label = outputs.logits.argmax(-1).item()
print(predicted_label)  # 출력 결과: 1 (긍정)

위 코드는 파인튜닝된 모델과 토크나이저를 로드하고, 입력 텍스트에 대한 감성 분석을 수행하여 예측된 레이블을 출력합니다.

LLM 모델 파인튜닝에 대해 더 깊이 공부하고 싶다면 다음 자료들을 참고해 보시기 바랍니다:

다음 포스트에서는 파인튜닝된 LLM 모델을 활용하여 실제 애플리케이션을 구현하는 방법에 대해 알아보도록 하겠습니다. 다양한 태스크에 파인튜닝된 모델을 적용하여 유용한 결과를 도출하는 사례를 중점적으로 다룰 예정이니 기대해 주세요!

728x90
반응형
LIST

'IT 이것저것' 카테고리의 다른 글

ollama 사용해보기  (1) 2024.08.26
LLM 모델 양자화 와 GGUF 파일  (0) 2024.08.23
RAG 심층분석  (0) 2024.08.23
LLM 활용  (0) 2024.08.22
벡터데이터베이스  (0) 2024.08.22