Llama 3 또는 기타 오픈 소스 모델을 미세 조정하는 데 필요한 유일한 가이드

Date:

FINE TUNING 오픈소스 LLM 파이썬 가이드

Llama 3와 같은 대규모 언어 모델(LLM)을 미세 조정하려면 도메인별 데이터 세트를 사용하여 사전 학습된 모델을 특정 작업에 맞게 조정해야 합니다. 이 프로세스는 모델의 기존 지식을 활용하여 처음부터 학습하는 것보다 효율적이고 비용 효율적입니다. 이 가이드에서는 메모리 사용과 계산 비용을 최소화하는 매개변수 효율적인 방법인 QLoRA(양자화된 LoRA)를 사용하여 Llama 3를 미세 조정하는 단계를 살펴보겠습니다.

Fine-Tuning 개요

미세 조정에는 몇 가지 핵심 단계가 포함됩니다.

  1. 사전 훈련된 모델 선택: 원하는 아키텍처에 맞는 기본 모델을 선택하세요.
  2. 관련 데이터 세트 수집: 귀하의 작업에 맞는 데이터 세트를 수집하고 사전 처리합니다.
  3. 미세 조정: 데이터 세트를 사용하여 모델을 조정하여 특정 작업에 대한 성능을 개선합니다.
  4. 평가: 정성적, 정량적 지표를 모두 사용하여 미세 조정된 모델을 평가합니다.

개념 및 기술

대규모 언어 모델 미세 조정

대규모 언어 모델 미세 조정

전체 미세 조정

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

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

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

저순위 적응(LoRA) 및 양자화된 LoRA(QLoRA)

LoRA는 몇 개의 저랭크 행렬만 미세 조정하는 반면, QLoRA는 이러한 행렬을 양자화하여 메모리 사용량을 더욱 줄입니다.

미세 조정 방법

  1. 전체 미세 조정: 여기에는 작업별 데이터 세트에서 모델의 모든 매개변수를 훈련하는 것이 포함됩니다. 이 방법은 매우 효과적일 수 있지만, 컴퓨팅 비용이 많이 들고 상당한 메모리가 필요합니다.
  2. 매개변수 효율적 미세 조정(PEFT): PEFT는 모델 매개변수의 하위 집합만 업데이트하여 메모리 효율성을 높입니다. Low-Rank Adaptation(LoRA) 및 Quantized LoRA(QLoRA)와 같은 기술이 이 범주에 속합니다.

LoRA란?

미세 조정 방법 비교: QLORA는 메모리 스파이크 관리를 위한 4비트 정밀 양자화 및 페이지 최적화기를 통해 LoRA를 향상시킵니다.

미세 조정 방법 비교: QLORA는 메모리 스파이크 관리를 위한 4비트 정밀 양자화 및 페이지 최적화기를 통해 LoRA를 향상시킵니다.

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

LoRA의 주요 장점:

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

양자화된 LoRA(QLoRA)란 무엇인가요?

QLoRA는 LoRA 어댑터의 가중치를 더 낮은 정밀도(예: 8비트 대신 4비트)로 양자화하여 LoRA를 한 단계 더 발전시킵니다. 이를 통해 비슷한 수준의 효과를 유지하면서 메모리 사용량과 저장 요구 사항을 더욱 줄일 수 있습니다.

QLoRA의 주요 장점:

  • 더욱 향상된 메모리 효율성: QLoRA는 가중치를 양자화함으로써 모델의 메모리 및 저장 장치 요구 사항을 크게 줄입니다.
  • 성능 유지: 정밀도가 낮아졌음에도 불구하고 QLoRA는 전체 정밀도 모델에 가까운 성능 수준을 유지합니다.

업무별 적응

미세 조정 중에 모델의 매개변수는 새로운 데이터세트에 따라 조정되어 특정 작업에 관련된 콘텐츠를 더 잘 이해하고 생성하는 데 도움이 됩니다. 이 프로세스는 사전 학습 중에 얻은 일반적인 언어 지식을 유지하면서 모델을 대상 도메인의 뉘앙스에 맞게 조정합니다.

실제에서의 미세 조정

전체 미세 조정 대 PEFT

  • 전체 미세 조정: 전체 모델을 훈련하는 데에는 컴퓨팅 비용이 많이 들고 상당한 메모리가 필요합니다.
  • PEFT(LoRA 및 QLoRA): 매개변수의 하위 집합만 미세 조정하여 메모리 요구 사항을 줄이고 치명적인 망각을 방지하므로 더 효율적인 대안입니다.

구현 단계

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

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)

하이퍼파라미터와 그 영향

하이퍼파라미터는 모델의 성능을 최적화하는 데 중요한 역할을 합니다. 고려해야 할 핵심 하이퍼파라미터는 다음과 같습니다.

  1. 학습률: 모델이 매개변수를 업데이트하는 속도를 제어합니다. 높은 학습률은 더 빠른 수렴으로 이어질 수 있지만 최적 솔루션을 초과할 수 있습니다. 낮은 학습률은 안정적인 수렴을 보장하지만 더 많은 에포크가 필요할 수 있습니다.
  2. 배치 크기: 모델이 매개변수를 업데이트하기 전에 처리된 샘플 수입니다. 배치 크기가 클수록 안정성이 향상되지만 더 많은 메모리가 필요합니다. 배치 크기가 작을수록 학습 프로세스에서 노이즈가 더 많아질 수 있습니다.
  3. 그래디언트 축적 단계: 이 매개변수는 매개변수 업데이트를 수행하기 전에 여러 단계에 걸쳐 그래디언트를 축적하여 더 큰 배치 크기를 시뮬레이션하는 데 도움이 됩니다.
  4. 에포크 수: 전체 데이터 세트가 모델을 통과하는 횟수입니다. 에포크가 많을수록 성능이 향상될 수 있지만 적절하게 관리하지 않으면 과적합으로 이어질 수 있습니다.
  5. 체중 감소: 큰 가중치에 대한 패널티를 부여하여 과잉적합을 방지하기 위한 정규화 기술입니다.
  6. 학습률 스케줄러: 성능과 수렴성을 개선하기 위해 훈련 중 학습률을 조정합니다.

특정 모델 및 작업 요구 사항에 따라 학습률, 배치 크기, 그래디언트 축적 단계와 같은 하이퍼파라미터를 조정하여 학습 구성을 사용자 정의합니다. 예를 들어, 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.

Share post:

Subscribe

Popular

More like this
Related

생성 AI 활용: 업계 리더를 위한 대담한 도전과 보상

조직이 AI의 잠재력을 계속 탐구함에 따라 Microsoft 고객은 워크플로를...

식품 안전 분야에서 AI의 필요성 증가

특히 광범위한 조류독감 발생의 영향이 농업 부문 전반에 걸쳐...

12월23일 정부지원사업 신규 공고 리스트 (12건) _ (파일 재가공/재배포 가능)

12월 23일 12건<12/23지원사업 신규 공고 목록> *전 영업일인 12/20에 올라온...

Waste Robotics와 Greyparrot가 분류 로봇을 강화하는 방법

Waste Robotics는 FANUC 로봇 팔을 사용하여 안정적이고 정확한 피킹을...