Llama 3와 같은 대규모 언어 모델(LLM)을 미세 조정하려면 도메인별 데이터 세트를 사용하여 사전 학습된 모델을 특정 작업에 맞게 조정해야 합니다. 이 프로세스는 모델의 기존 지식을 활용하여 처음부터 학습하는 것보다 효율적이고 비용 효율적입니다. 이 가이드에서는 메모리 사용과 계산 비용을 최소화하는 매개변수 효율적인 방법인 QLoRA(양자화된 LoRA)를 사용하여 Llama 3를 미세 조정하는 단계를 살펴보겠습니다.
Fine-Tuning 개요
미세 조정에는 몇 가지 핵심 단계가 포함됩니다.
- 사전 훈련된 모델 선택: 원하는 아키텍처에 맞는 기본 모델을 선택하세요.
- 관련 데이터 세트 수집: 귀하의 작업에 맞는 데이터 세트를 수집하고 사전 처리합니다.
- 미세 조정: 데이터 세트를 사용하여 모델을 조정하여 특정 작업에 대한 성능을 개선합니다.
- 평가: 정성적, 정량적 지표를 모두 사용하여 미세 조정된 모델을 평가합니다.
개념 및 기술
전체 미세 조정
전체 미세 조정 모델의 모든 매개변수를 업데이트하여 새로운 작업에 맞게 구체화합니다. 이 방법은 상당한 계산 리소스가 필요하며 매우 큰 모델에는 종종 비실용적입니다.
매개변수 효율적 미세 조정(PEFT)
PEFT는 모델 매개변수의 하위 집합만 업데이트하여 메모리 요구 사항과 계산 비용을 줄입니다. 이 기술은 치명적인 망각을 방지하고 모델에 대한 일반적인 지식을 유지합니다.
저순위 적응(LoRA) 및 양자화된 LoRA(QLoRA)
LoRA는 몇 개의 저랭크 행렬만 미세 조정하는 반면, QLoRA는 이러한 행렬을 양자화하여 메모리 사용량을 더욱 줄입니다.
미세 조정 방법
- 전체 미세 조정: 여기에는 작업별 데이터 세트에서 모델의 모든 매개변수를 훈련하는 것이 포함됩니다. 이 방법은 매우 효과적일 수 있지만, 컴퓨팅 비용이 많이 들고 상당한 메모리가 필요합니다.
- 매개변수 효율적 미세 조정(PEFT): PEFT는 모델 매개변수의 하위 집합만 업데이트하여 메모리 효율성을 높입니다. Low-Rank Adaptation(LoRA) 및 Quantized LoRA(QLoRA)와 같은 기술이 이 범주에 속합니다.
LoRA란?
LoRA는 개선된 미세 조정 방법으로, 사전 훈련된 모델의 모든 가중치를 미세 조정하는 대신 더 큰 행렬을 근사하는 두 개의 더 작은 행렬을 미세 조정합니다. 이러한 행렬은 LoRA 어댑터를 구성합니다. 이 미세 조정된 어댑터는 사전 훈련된 모델에 로드되어 추론에 사용됩니다.
LoRA의 주요 장점:
- 메모리 효율성: LoRA는 전체 모델 대신 작은 행렬만 미세 조정하여 메모리 사용량을 줄입니다.
- 재사용 성: 원래 모델은 변경되지 않고 여러 LoRA 어댑터를 함께 사용할 수 있어 더 낮은 메모리 요구 사항으로 여러 작업을 처리할 수 있습니다.
양자화된 LoRA(QLoRA)란 무엇인가요?
QLoRA는 LoRA 어댑터의 가중치를 더 낮은 정밀도(예: 8비트 대신 4비트)로 양자화하여 LoRA를 한 단계 더 발전시킵니다. 이를 통해 비슷한 수준의 효과를 유지하면서 메모리 사용량과 저장 요구 사항을 더욱 줄일 수 있습니다.
QLoRA의 주요 장점:
- 더욱 향상된 메모리 효율성: QLoRA는 가중치를 양자화함으로써 모델의 메모리 및 저장 장치 요구 사항을 크게 줄입니다.
- 성능 유지: 정밀도가 낮아졌음에도 불구하고 QLoRA는 전체 정밀도 모델에 가까운 성능 수준을 유지합니다.
업무별 적응
미세 조정 중에 모델의 매개변수는 새로운 데이터세트에 따라 조정되어 특정 작업에 관련된 콘텐츠를 더 잘 이해하고 생성하는 데 도움이 됩니다. 이 프로세스는 사전 학습 중에 얻은 일반적인 언어 지식을 유지하면서 모델을 대상 도메인의 뉘앙스에 맞게 조정합니다.
실제에서의 미세 조정
전체 미세 조정 대 PEFT
- 전체 미세 조정: 전체 모델을 훈련하는 데에는 컴퓨팅 비용이 많이 들고 상당한 메모리가 필요합니다.
- PEFT(LoRA 및 QLoRA): 매개변수의 하위 집합만 미세 조정하여 메모리 요구 사항을 줄이고 치명적인 망각을 방지하므로 더 효율적인 대안입니다.
구현 단계
- 환경 설정: 필요한 라이브러리를 설치하고 컴퓨팅 환경을 설정합니다.
- 데이터 세트 로드 및 사전 처리: 데이터 세트를 로드하여 모델에 적합한 형식으로 사전 처리합니다.
- 사전 훈련된 모델 로드: QLoRA를 사용하는 경우 양자화 구성으로 기본 모델을 로드합니다.
- 토큰화: 데이터 세트를 토큰화하여 학습에 대비합니다.
- 훈련: 준비된 데이터 세트를 사용하여 모델을 미세 조정합니다.
- 평가: 정성적, 정량적 측정 항목을 사용하여 특정 작업에 대한 모델의 성능을 평가합니다.
LLM 미세 조정을 위한 Steo 단계별 가이드
환경 설정하기
이 튜토리얼에서는 Jupyter 노트북을 사용합니다. 무료 GPU 사용을 제공하는 Kaggle이나 Google Colab과 같은 플랫폼은 이러한 실험을 실행하기에 이상적입니다.
1. 필요한 라이브러리 설치
먼저, 필요한 라이브러리가 설치되어 있는지 확인하세요.
!pip install -qqq -U bitsandbytes transformers peft accelerate datasets scipy einops evaluate trl rouge_score
2. 라이브러리 가져오기 및 환경 설정
import osimport torchfrom datasets import load_datasetfrom transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, TrainingArguments, pipeline, HfArgumentParser)from trl import ORPOConfig, ORPOTrainer, setup_chat_format, SFTTrainerfrom tqdm import tqdmimport gcimport pandas as pdimport numpy as npfrom huggingface_hub import interpreter_login# Disable Weights and Biases loggingos.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 모델은 다음과 같이 식별될 수 있습니다.
meta-llama/Meta-Llama-3-8B
껴안는 얼굴에 대하여. - Llama 3와 같은 모델의 경우 필요한 경우 Hugging Face 계정에 대한 액세스를 요청하고 로그인하세요. (껴안는 얼굴)
토큰화:
- Llama 3에 적합한 토크나이저를 사용하고, 해당 모델과 호환되고 패딩, 특수 토큰과 같은 필수 기능을 지원하는지 확인하세요.
메모리 및 계산:
- Llama 3와 같은 대형 모델을 미세 조정하려면 상당한 컴퓨팅 리소스가 필요합니다. 강력한 GPU 설정과 같은 환경이 메모리 및 처리 요구 사항을 처리할 수 있는지 확인하세요. 환경이 메모리 요구 사항을 처리할 수 있는지 확인하세요. 이는 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)
토큰화:
특정 사용 사례 및 모델 요구 사항에 따라 중복 설정 없이 올바른 토크나이저 구성을 보장합니다. 예를 들어, use_fast=True
더 나은 성능을 위해 권장됩니다. (껴안는 얼굴) (가중치 및 편향).
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
5.2 다른 인기 모델 사용(예: GPT-3, Mistral)
모델 선택:
- GPT-3 및 Mistral과 같은 모델의 경우 Hugging Face 모델 허브나 다른 소스에서 올바른 모델 이름과 식별자를 사용해야 합니다.
토큰화:
- Llama 3와 마찬가지로 토크나이저가 올바르게 설정되었고 모델과 호환되는지 확인하세요.
메모리 및 계산:
- 각 모델마다 메모리 요구 사항이 다를 수 있습니다. 환경 설정을 그에 맞게 조정하세요.
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)
미스트랄의 예:
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)
토큰화 고려 사항: 각 모델에는 고유한 토큰화 요구 사항이 있을 수 있습니다. 토크나이저가 모델과 일치하고 올바르게 구성되었는지 확인하십시오.
Llama 3 Tokenizer 예시:
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
GPT-3 및 Mistral Tokenizer 예:
tokenizer = AutoTokenizer.from_pretrained( model_name, use_fast=True)
7. Zero-Shot Inferencing으로 모델 테스트
샘플 입력으로 기본 모델 평가:
from transformers import set_seedset_seed(42)index = 10prompt = dataset['test'][index]['dialogue']formatted_prompt = f"Instruct: Summarize the following conversation.n{prompt}nOutput:n"# Generate outputdef 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 = "nn".join(parts) sample["text"] = formatted_prompt return sampledataset = dataset.map(create_prompt_formats)
포맷된 데이터세트를 토큰화합니다.
def preprocess_batch(batch, tokenizer, max_length): return tokenizer(batch["text"], max_length=max_length, truncation=True)max_length = 1024train_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)
9. QLoRA를 위한 모델 준비
매개변수 효율적 미세 조정을 위한 모델 준비:
original_model = prepare_model_for_kbit_training(original_model)
하이퍼파라미터와 그 영향
하이퍼파라미터는 모델의 성능을 최적화하는 데 중요한 역할을 합니다. 고려해야 할 핵심 하이퍼파라미터는 다음과 같습니다.
- 학습률: 모델이 매개변수를 업데이트하는 속도를 제어합니다. 높은 학습률은 더 빠른 수렴으로 이어질 수 있지만 최적 솔루션을 초과할 수 있습니다. 낮은 학습률은 안정적인 수렴을 보장하지만 더 많은 에포크가 필요할 수 있습니다.
- 배치 크기: 모델이 매개변수를 업데이트하기 전에 처리된 샘플 수입니다. 배치 크기가 클수록 안정성이 향상되지만 더 많은 메모리가 필요합니다. 배치 크기가 작을수록 학습 프로세스에서 노이즈가 더 많아질 수 있습니다.
- 그래디언트 축적 단계: 이 매개변수는 매개변수 업데이트를 수행하기 전에 여러 단계에 걸쳐 그래디언트를 축적하여 더 큰 배치 크기를 시뮬레이션하는 데 도움이 됩니다.
- 에포크 수: 전체 데이터 세트가 모델을 통과하는 횟수입니다. 에포크가 많을수록 성능이 향상될 수 있지만 적절하게 관리하지 않으면 과적합으로 이어질 수 있습니다.
- 체중 감소: 큰 가중치에 대한 패널티를 부여하여 과잉적합을 방지하기 위한 정규화 기술입니다.
- 학습률 스케줄러: 성능과 수렴성을 개선하기 위해 훈련 중 학습률을 조정합니다.
특정 모델 및 작업 요구 사항에 따라 학습률, 배치 크기, 그래디언트 축적 단계와 같은 하이퍼파라미터를 조정하여 학습 구성을 사용자 정의합니다. 예를 들어, Llama 3 모델은 더 작은 모델과 비교하여 다른 학습률이 필요할 수 있습니다. (가중치 및 편향) (깃허브)
예시 훈련 구성
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_scorerscorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True)scores = scorer.score(reference_summary, generated_summary)print(scores)
일반적인 과제와 해결책
1. 메모리 제한
QLoRA를 사용하면 모델 가중치를 4비트로 양자화하여 메모리 문제를 완화하는 데 도움이 됩니다. 배치 크기와 모델 크기를 처리할 수 있는 충분한 GPU 메모리가 있는지 확인하세요.
2. 과적합
과적합을 방지하기 위해 검증 지표를 모니터링합니다. 조기 중단 및 가중치 감소와 같은 기술을 사용합니다.
삼. 느린 훈련
배치 크기, 학습률을 조정하고 그래디언트 축적을 사용하여 학습 속도를 최적화합니다.
4. 데이터 품질
데이터 세트가 깨끗하고 사전 처리가 잘 되었는지 확인하세요. 데이터 품질이 좋지 않으면 모델 성능에 상당한 영향을 미칠 수 있습니다.
결론
LLM을 미세 조정하는 방법 ing QLoRA는 대규모 사전 훈련된 모델을 컴퓨팅 비용을 절감하여 특정 작업에 적응시키는 효율적인 방법입니다. 이 가이드를 따르면 PHI, Llama 3 또는 기타 오픈 소스 모델을 미세 조정하여 특정 작업에서 높은 성능을 달성할 수 있습니다.
게시물 Llama 3 또는 기타 오픈 소스 모델을 미세 조정하는 데 필요한 유일한 가이드 처음 등장 유나이트.AI.