AI 모델 및 플랫폼

Llama 3 또는 다른 오픈 소스 모델을 미세 조정하기 위한 唯一한 가이드

mm
Unite.AI를 Google의 선호 소스에 추가

대규모 언어 모델(LLM)을 미세 조정하는 것은 특정 작업에 대한 도메인별 데이터셋을 사용하여 사전 훈련된 모델을 적응시키는 것을 포함합니다. 이 프로세스는 모델의 기존 지식을 활용하여 효율적이고 비용 효율적인 방식으로 작업을 수행할 수 있도록 합니다. 이 가이드에서는 QLoRA(Quantized LoRA)를 사용하여 Llama 3를 미세 조정하는 단계를 설명합니다. QLoRA는 매개 변수 효율적인 방법으로 메모리 사용량과 계산 비용을 최소화합니다.

미세 조정 개요

미세 조정에는 여러 중요한 단계가 포함됩니다.

  1. 사전 훈련된 모델 선택: 원하는 아키텍처와 일치하는 기본 모델을 선택합니다.
  2. 관련 데이터셋 수집: 작업에 특정한 데이터셋을 수집하고 전처리합니다.
  3. 미세 조정: 데이터셋을 사용하여 모델을 특정 작업에 대한 성능을 향상시키기 위해 적응시킵니다.
  4. 평가: 미세 조정된 모델의 성능을 질적 및 양적 지표를 사용하여 평가합니다.

개념 및 기술

대규모 언어 모델 미세 조정

대규모 언어 모델 미세 조정

전체 미세 조정

전체 미세 조정은 모델의 모든 매개 변수를 업데이트하여 새로운 작업에 특정합니다. 이 방법은 상당한 계산 리소스가 필요하며 매우 큰 모델의 경우 비실용적일 수 있습니다.

매개 변수 효율적인 미세 조정 (PEFT)

PEFT는 모델의 매개 변수의 하위 집합만 업데이트하여 메모리 요구 사항과 계산 비용을 줄입니다. 이 기술은 치명적인忘却을 방지하고 모델의 일반 지식을 유지합니다.

Low-Rank Adaptation (LoRA) 및 Quantized LoRA (QLoRA)

LoRA는 몇 개의 저랭크 행렬만 미세 조정하며 QLoRA는 이러한 행렬을 더 낮은 정밀도로 양자화하여 메모리 사용량을进一步 줄입니다.

미세 조정 방법

  1. 전체 미세 조정: 작업별 데이터셋에 대한 모델의 모든 매개 변수를 훈련하는 것을 포함합니다. 이 방법은 매우 효과적일 수 있지만 계산적으로 비용이 많이 들고 많은 메모리가 필요합니다.
  2. 매개 변수 효율적인 미세 조정 (PEFT): PEFT는 모델의 매개 변수의 하위 집합만 업데이트하여 메모리 효율성을 향상시킵니다. LoRA 및 QLoRA와 같은 기술이 이 범주에 속합니다.

LoRA란 무엇인가?

미세 조정 방법 비교: QLORA는 LoRA를 4비트 정밀도 양자화 및 페이지 최적화器를 사용하여 메모리 스파이크 관리를 강화합니다

미세 조정 방법 비교: QLORA는 LoRA를 4비트 정밀도 양자화 및 페이지 최적화器를 사용하여 메모리 스파이크 관리를 강화합니다

LoRA는 사전 훈련된 모델의 모든 가중치를 미세 조정하는 대신 두 개의 작은 행렬을 미세 조정하여 더 큰 행렬을 근사하는 것을 포함하는 향상된 미세 조정 방법입니다. 이러한 행렬은 LoRA 어댑터를 구성합니다. 이 미세 조정된 어댑터는 사전 훈련된 모델에 로드되어 추론에 사용됩니다.

LoRA의 주요优势:

  • 메모리 효율성: LoRA는 모델의 전체를 미세 조정하는 대신 작은 행렬만 미세 조정하여 메모리 사용량을 줄입니다.
  • 재사용성: 원래 모델은 변경되지 않으며 여러 LoRA 어댑터를 사용하여 다중 작업을 처리할 수 있습니다. 이는 메모리 요구 사항을 낮추어 다중 작업을 처리하는 것을 용이하게 합니다.

Quantized LoRA (QLoRA)란 무엇인가?

QLoRA는 LoRA를 한 단계 더 나아가서 LoRA 어댑터의 가중치를 더 낮은 정밀도로 양자화합니다(예: 4비트 대신 8비트). 이것은 메모리 사용량과 저장 요구 사항을 더욱 줄이면서 비교할 수 있는 수준의 효과를 유지합니다.

QLoRA의 주요优势:

  • さらに 큰 메모리 효율성: 가중치를 양자화함으로써 QLoRA는 모델의 메모리 및 저장 요구 사항을 크게 줄입니다.
  • 성능 유지: 정밀도가 줄어든尽管, QLoRA는 전반적인 성능을 높은 정밀도 모델과 비교할 수 있는 수준으로 유지합니다.

작업별 적응

미세 조정 동안 모델의 매개 변수는 새로운 데이터셋에 따라 조정되어 특정 작업에 대한 내용을 더 잘 이해하고 생성할 수 있습니다. 이 프로세스는 사전 훈련 중에 얻은 일반 언어 지식을 유지하면서 모델을 대상 도메인의 세부 사항에 맞추어 조정합니다.

실제 미세 조정

전체 미세 조정 대 매개 변수 효율적인 미세 조정

  • 전체 미세 조정: 모델의 전체를 훈련하는 것을 포함하며 계산적으로 비용이 많이 들고 많은 메모리가 필요합니다.
  • 매개 변수 효율적인 미세 조정 (PEFT): 모델의 매개 변수의 하위 집합만 미세 조정하여 메모리 요구 사항을 줄이고 치명적인忘却을 방지합니다. LoRA 및 QLoRA와 같은 기술이 이 범주에 속합니다.

구현 단계

  1. 환경 설정: 필요한 라이브러리를 설치하고 컴퓨팅 환경을 설정합니다.
  2. 데이터셋 로드 및 전처리: 데이터셋을 로드하고 모델에 적합한 형식으로 전처리합니다.
  3. 사전 훈련된 모델 로드: QLoRA를 사용하는 경우 양자화 구성과 함께 기본 모델을 로드합니다.
  4. 토큰화: 데이터셋을 토큰화하여 훈련에 준비합니다.
  5. 훈련: 준비된 데이터셋을 사용하여 모델을 미세 조정합니다.
  6. 평가: 모델의 성능을 특정 작업에 대한 질적 및 양적 지표를 사용하여 평가합니다.

LLM 미세 조정 단계별 가이드

환경 설정

이 튜토리얼에서는 Jupyter 노트북을 사용합니다. Kaggle과 같은 플랫폼이나 Google (GOOGL ) Colab은 이러한 실험을 실행하기에 이상적입니다.

1. 필요한 라이브러리 설치

먼저 필요한 라이브러리가 설치되어 있는지 확인합니다.

!pip install -qqq -U bitsandbytes transformers peft accelerate datasets scipy einops evaluate trl rouge_score

2. 라이브러리 가져오기 및 환경 설정

import os
import torch
from datasets import load_dataset
from transformers import (
AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, TrainingArguments,
pipeline, HfArgumentParser
)
from trl import ORPOConfig, ORPOTrainer, setup_chat_format, SFTTrainer
from tqdm import tqdm
import gc
import pandas as pd
import numpy as np
from huggingface_hub import interpreter_login

# Weights and Biases 로깅 비활성화
os.environ['WANDB_DISABLED'] = "true"
interpreter_login()

3. 데이터셋 로드

이 튜토리얼에서는 DialogSum 데이터셋을 사용합니다.

dataset_name = "neil-code/dialogsum-test"
dataset = load_dataset(dataset_name)

데이터셋 구조를 검사합니다.

print(dataset['test'][0])

4. BitsAndBytes 구성

4비트 형식으로 모델을 로드하기 위해:

compute_dtype = getattr(torch, "float16")
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type='nf4',
bnb_4bit_compute_dtype=compute_dtype,
bnb_4bit_use_double_quant=False,
)

5. 사전 훈련된 모델 로드

Microsoft의 Phi-2 모델을 사용합니다.

model_name = 'microsoft/phi-2'
device_map = {"": 0}
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

6. 토큰화

토크나이저를 구성합니다.

tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True,
padding_side="left",
add_eos_token=True,
add_bos_token=True,
use_fast=False
)
tokenizer.pad_token = tokenizer.eos_token

Llama 3 또는 다른 모델 미세 조정

Llama 3 또는 다른 최첨단 오픈 소스 LLM을 미세 조정할 때 성능을 최적화하기 위해 특정 고려 사항과 조정이 필요합니다. 여기에서는 Llama 3, GPT-3, Mistral을 포함한 다양한 모델에 대한 자세한 단계와 통찰력을 제공합니다.

5.1 Llama 3 사용

모델 선택:

  • Hugging Face 모델 허브에서 올바른 모델 식별자를 확인합니다. 예를 들어, Llama 3 모델은 Hugging Face에서 meta-llama/Meta-Llama-3-8B로 식별될 수 있습니다.
  • 모델에 필요한 경우 Hugging Face 계정에 로그인하고 접근을 요청합니다.

토큰화:

  • Llama 3에 적합한 토크나이저를 사용하여 모델과 호환되며 필요한 기능을 지원하는지 확인합니다.

메모리 및 계산:

  • Llama 3와 같은 대규모 모델을 미세 조정하려면 상당한 계산 리소스가 필요합니다. 환경이 메모리 및 처리 요구 사항을 처리할 수 있는지 확인합니다. QLoRA와 같은 기술을 사용하여 메모리 사용량을 줄일 수 있습니다.

예제:

model_name = 'meta-llama/Meta-Llama-3-8B'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type='nf4',
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

5.2 다른 인기 모델 사용 (예: GPT-3, Mistral)

모델 선택:

  • GPT-3 및 Mistral과 같은 모델에 대한 올바른 모델 이름과 식별자를 사용합니다.

토큰화:

  • 모델과 호환되며 필요한 기능을 지원하는 토크나이저를 사용합니다.

메모리 및 계산:

  • 각 모델에는 다른 메모리 요구 사항이 있을 수 있습니다. 환경 설정을 조정하여 메모리 요구 사항을 처리할 수 있도록 합니다.

GPT-3 예제:

model_name = 'openai/gpt-3'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type='nf4',
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

Mistral 예제:

model_name = 'mistral-7B'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type='nf4',
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

7. 제로샷 추론으로 모델 테스트

샘플 입력으로 기본 모델을 평가합니다.

from transformers import set_seed

set_seed(42)
index = 10
prompt = dataset['test'][index]['dialogue']
formatted_prompt = f"Instruct: Summarize the following conversation.\n{prompt}\nOutput:\n"

def gen(model, prompt, max_length):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=max_length)
return tokenizer.batch_decode(outputs, skip_special_tokens=True)

res = gen(original_model, formatted_prompt, 100)
output = res[0].split('Output:\n')[1]

print(f'INPUT PROMPT:\n{formatted_prompt}')
print(f'MODEL GENERATION - ZERO SHOT:\n{output}')

8. 데이터셋 전처리

대화-요약 쌍을 프롬프트로 변환합니다.

def create_prompt_formats(sample):
blurb = "Below is an instruction that describes a task. Write a response that appropriately completes the request."
instruction = "### Instruct: Summarize the below conversation."
input_context = sample['dialogue']
response = f"### Output:\n{sample['summary']}"
end = "### End"

parts = [blurb, instruction, input_context, response, end]
formatted_prompt = "\n\n".join(parts)
sample["text"] = formatted_prompt
return sample

dataset = dataset.map(create_prompt_formats)

전처리된 데이터셋을 토큰화합니다.

def preprocess_batch(batch, tokenizer, max_length):
return tokenizer(batch["text"], max_length=max_length, truncation=True)

max_length = 1024
train_dataset = dataset["train"].map(lambda batch: preprocess_batch(batch, tokenizer, max_length), batched=True)
eval_dataset = dataset["validation"].map(lambda batch: preprocess_batch(batch, tokenizer, max_length), batched=True)

하이퍼파라미터 및 영향

하이퍼파라미터는 모델의 성능을 최적화하는 데 중요한 역할을 합니다. 다음은 몇 가지 주요 하이퍼파라미터를 고려해야 합니다.

  1. 학습률: 모델이 매개 변수를 업데이트하는 속도를 제어합니다. 높은 학습률은 빠른 수렴을 초래할 수 있지만 최적의 솔루션을 초과할 수 있습니다. 낮은 학습률은 안정적인 수렴을 보장하지만 더 많은 에포크가 필요할 수 있습니다.
  2. 배치 크기: 매개 변수를 업데이트하기 전에 처리되는 샘플의 수입니다. 더 큰 배치 크기는 안정성을 개선할 수 있지만 더 많은 메모리가 필요합니다. 더 작은 배치 크기는 훈련 과정에서 더 많은 노이즈를 유발할 수 있습니다.
  3. 그라디언트 누적 단계: 더 큰 배치 크기를 시뮬레이션하기 위해 여러 단계에서 그라디언트를 누적하는 데 도움이 됩니다.
  4. 에포크 수: 전체 데이터셋이 모델을 통해 전달되는 횟수입니다. 더 많은 에포크는 성능을 개선할 수 있지만 올바르게 관리되지 않으면 과적합으로 이어질 수 있습니다.
  5. 가중치 감소: 과적합을 방지하기 위한 정규화 기술로 가중치가 너무 커지는 것을 방지합니다.
  6. 학습률 스케줄러: 훈련 중에 학습률을 조정하여 성능과 수렴을 개선합니다.

예시 훈련 구성

orpo_args = ORPOConfig(
learning_rate=8e-6,
lr_scheduler_type="linear",
max_length=1024,
max_prompt_length=512,
beta=0.1,
per_device_train_batch_size=2,
per_device_eval_batch_size=2,
gradient_accumulation_steps=4,
optim="paged_adamw_8bit",
num_train_epochs=1,
evaluation_strategy="steps",
eval_steps=0.2,
logging_steps=1,
warmup_steps=10,
report_to="wandb",
output_dir="./results/",
)

10. 모델 훈련

트레이너를 설정하고 훈련을 시작합니다.

trainer = ORPOTrainer(
model=original_model,
args=orpo_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
tokenizer=tokenizer,
)
trainer.train()
trainer.save_model("fine-tuned-llama-3")

미세 조정된 모델 평가

훈련 후에 모델의 성능을 질적 및 양적 방법을 사용하여 평가합니다.

1. 인간 평가

생성된 요약과 인간이 작성한 요약을 비교하여 품질을 평가합니다.

2. 양적 평가

ROUGE와 같은 지표를 사용하여 성능을 평가합니다.

from rouge_score import rouge_scorer

scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True)
scores = scorer.score(reference_summary, generated_summary)
print(scores)

공통적인 도전 과제 및 해결책

1. 메모리 제한

QLoRA를 사용하면 메모리 문제를 완화할 수 있습니다. 배치 크기와 모델 크기에 따라 충분한 GPU 메모리가 있는지 확인합니다.

2. 과적합

검증 메트릭을 모니터링하여 과적합을 방지합니다. 조기 중단 및 가중치 감소와 같은 기술을 사용합니다.

3. 느린 훈련

배치 크기, 학습률 및 그라디언트 누적을 조정하여 훈련 속도를 최적화합니다.

4. 데이터 품질

데이터셋이 깨끗하고 잘 전처리되었는지 확인합니다. 데이터 품질이 나쁘면 모델의 성능에 큰 영향을 미칠 수 있습니다.

결론

QLoRA를 사용하여 LLM을 미세 조정하는 것은 특정 작업에 대한 성능을 향상시키기 위한 효율적인 방법입니다. 이 가이드를 따라 PHI, Llama 3 또는 다른 오픈 소스 모델을 미세 조정하여 특정 작업에 대한 높은 성능을 달성할 수 있습니다.

지난 5년 동안私は Machine Learning과 Deep Learning의 매혹적인 세계에 몰두해 왔습니다.私の熱情と専門知識は私を50以上의多様한 소프트웨어 엔지니어링 프로젝트에 기여하게 했으며, 특히 AI/ML에 중점을 두었습니다.私の継続的な 호기심은 또한私를自然어 처리로 끌어들였습니다.私は이 분야를さらに 탐구하기를熱望합니다.