AI 모델 및 플랫폼
Llama 3 또는 다른 오픈 소스 모델을 미세 조정하기 위한 唯一한 가이드
대규모 언어 모델(LLM)을 미세 조정하는 것은 특정 작업에 대한 도메인별 데이터셋을 사용하여 사전 훈련된 모델을 적응시키는 것을 포함합니다. 이 프로세스는 모델의 기존 지식을 활용하여 효율적이고 비용 효율적인 방식으로 작업을 수행할 수 있도록 합니다. 이 가이드에서는 QLoRA(Quantized LoRA)를 사용하여 Llama 3를 미세 조정하는 단계를 설명합니다. QLoRA는 매개 변수 효율적인 방법으로 메모리 사용량과 계산 비용을 최소화합니다.
미세 조정 개요
미세 조정에는 여러 중요한 단계가 포함됩니다.
- 사전 훈련된 모델 선택: 원하는 아키텍처와 일치하는 기본 모델을 선택합니다.
- 관련 데이터셋 수집: 작업에 특정한 데이터셋을 수집하고 전처리합니다.
- 미세 조정: 데이터셋을 사용하여 모델을 특정 작업에 대한 성능을 향상시키기 위해 적응시킵니다.
- 평가: 미세 조정된 모델의 성능을 질적 및 양적 지표를 사용하여 평가합니다.
개념 및 기술
전체 미세 조정
전체 미세 조정은 모델의 모든 매개 변수를 업데이트하여 새로운 작업에 특정합니다. 이 방법은 상당한 계산 리소스가 필요하며 매우 큰 모델의 경우 비실용적일 수 있습니다.
매개 변수 효율적인 미세 조정 (PEFT)
PEFT는 모델의 매개 변수의 하위 집합만 업데이트하여 메모리 요구 사항과 계산 비용을 줄입니다. 이 기술은 치명적인忘却을 방지하고 모델의 일반 지식을 유지합니다.
Low-Rank Adaptation (LoRA) 및 Quantized LoRA (QLoRA)
LoRA는 몇 개의 저랭크 행렬만 미세 조정하며 QLoRA는 이러한 행렬을 더 낮은 정밀도로 양자화하여 메모리 사용량을进一步 줄입니다.
미세 조정 방법
- 전체 미세 조정: 작업별 데이터셋에 대한 모델의 모든 매개 변수를 훈련하는 것을 포함합니다. 이 방법은 매우 효과적일 수 있지만 계산적으로 비용이 많이 들고 많은 메모리가 필요합니다.
- 매개 변수 효율적인 미세 조정 (PEFT): PEFT는 모델의 매개 변수의 하위 집합만 업데이트하여 메모리 효율성을 향상시킵니다. LoRA 및 QLoRA와 같은 기술이 이 범주에 속합니다.
LoRA란 무엇인가?
LoRA는 사전 훈련된 모델의 모든 가중치를 미세 조정하는 대신 두 개의 작은 행렬을 미세 조정하여 더 큰 행렬을 근사하는 것을 포함하는 향상된 미세 조정 방법입니다. 이러한 행렬은 LoRA 어댑터를 구성합니다. 이 미세 조정된 어댑터는 사전 훈련된 모델에 로드되어 추론에 사용됩니다.
LoRA의 주요优势:
- 메모리 효율성: LoRA는 모델의 전체를 미세 조정하는 대신 작은 행렬만 미세 조정하여 메모리 사용량을 줄입니다.
- 재사용성: 원래 모델은 변경되지 않으며 여러 LoRA 어댑터를 사용하여 다중 작업을 처리할 수 있습니다. 이는 메모리 요구 사항을 낮추어 다중 작업을 처리하는 것을 용이하게 합니다.
Quantized LoRA (QLoRA)란 무엇인가?
QLoRA는 LoRA를 한 단계 더 나아가서 LoRA 어댑터의 가중치를 더 낮은 정밀도로 양자화합니다(예: 4비트 대신 8비트). 이것은 메모리 사용량과 저장 요구 사항을 더욱 줄이면서 비교할 수 있는 수준의 효과를 유지합니다.
QLoRA의 주요优势:
- さらに 큰 메모리 효율성: 가중치를 양자화함으로써 QLoRA는 모델의 메모리 및 저장 요구 사항을 크게 줄입니다.
- 성능 유지: 정밀도가 줄어든尽管, QLoRA는 전반적인 성능을 높은 정밀도 모델과 비교할 수 있는 수준으로 유지합니다.
작업별 적응
미세 조정 동안 모델의 매개 변수는 새로운 데이터셋에 따라 조정되어 특정 작업에 대한 내용을 더 잘 이해하고 생성할 수 있습니다. 이 프로세스는 사전 훈련 중에 얻은 일반 언어 지식을 유지하면서 모델을 대상 도메인의 세부 사항에 맞추어 조정합니다.
실제 미세 조정
전체 미세 조정 대 매개 변수 효율적인 미세 조정
- 전체 미세 조정: 모델의 전체를 훈련하는 것을 포함하며 계산적으로 비용이 많이 들고 많은 메모리가 필요합니다.
- 매개 변수 효율적인 미세 조정 (PEFT): 모델의 매개 변수의 하위 집합만 미세 조정하여 메모리 요구 사항을 줄이고 치명적인忘却을 방지합니다. LoRA 및 QLoRA와 같은 기술이 이 범주에 속합니다.
구현 단계
- 환경 설정: 필요한 라이브러리를 설치하고 컴퓨팅 환경을 설정합니다.
- 데이터셋 로드 및 전처리: 데이터셋을 로드하고 모델에 적합한 형식으로 전처리합니다.
- 사전 훈련된 모델 로드: QLoRA를 사용하는 경우 양자화 구성과 함께 기본 모델을 로드합니다.
- 토큰화: 데이터셋을 토큰화하여 훈련에 준비합니다.
- 훈련: 준비된 데이터셋을 사용하여 모델을 미세 조정합니다.
- 평가: 모델의 성능을 특정 작업에 대한 질적 및 양적 지표를 사용하여 평가합니다.
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)
하이퍼파라미터 및 영향
하이퍼파라미터는 모델의 성능을 최적화하는 데 중요한 역할을 합니다. 다음은 몇 가지 주요 하이퍼파라미터를 고려해야 합니다.
- 학습률: 모델이 매개 변수를 업데이트하는 속도를 제어합니다. 높은 학습률은 빠른 수렴을 초래할 수 있지만 최적의 솔루션을 초과할 수 있습니다. 낮은 학습률은 안정적인 수렴을 보장하지만 더 많은 에포크가 필요할 수 있습니다.
- 배치 크기: 매개 변수를 업데이트하기 전에 처리되는 샘플의 수입니다. 더 큰 배치 크기는 안정성을 개선할 수 있지만 더 많은 메모리가 필요합니다. 더 작은 배치 크기는 훈련 과정에서 더 많은 노이즈를 유발할 수 있습니다.
- 그라디언트 누적 단계: 더 큰 배치 크기를 시뮬레이션하기 위해 여러 단계에서 그라디언트를 누적하는 데 도움이 됩니다.
- 에포크 수: 전체 데이터셋이 모델을 통해 전달되는 횟수입니다. 더 많은 에포크는 성능을 개선할 수 있지만 올바르게 관리되지 않으면 과적합으로 이어질 수 있습니다.
- 가중치 감소: 과적합을 방지하기 위한 정규화 기술로 가중치가 너무 커지는 것을 방지합니다.
- 학습률 스케줄러: 훈련 중에 학습률을 조정하여 성능과 수렴을 개선합니다.
예시 훈련 구성
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 또는 다른 오픈 소스 모델을 미세 조정하여 특정 작업에 대한 높은 성능을 달성할 수 있습니다.














