0Pricing
AI Engineering Academy · Pelajaran

Penyetelan Halus LoRA dengan Hugging Face PEFT

Konfigurasikan peringkat LoRA, alpha, dan modul target, jalankan penyetelan halus terawasi dengan TRL SFTTrainer, pantau loss pelatihan, lalu simpan checkpoint gabungan dan checkpoint khusus adapter.

Penyetelan Halus LoRA dengan Hugging Face PEFT adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Mengapa Menggunakan LoRA, Bukan Fine-Tuning Penuh?

Fine-tuning penuh memperbarui setiap parameter dalam model. Untuk model dengan 7 miliar parameter pada presisi float32, hal ini memerlukan sekitar 28 GB memori GPU hanya untuk bobotnya, ditambah status pengoptimal, gradien, dan aktivasi — totalnya dapat mencapai 80–120 GB. LoRA (Low-Rank Adaptation) justru menambahkan sejumlah kecil parameter yang dapat dilatih (biasanya 0,1–1% dari total parameter) dalam bentuk pasangan matriks berperingkat rendah yang diterapkan pada lapisan tertentu, sehingga kebutuhan GPU berkurang 10–50 kali lipat dengan hasil yang sebanding.

# LoRA math intuition:
# Full fine-tuning: update W (large matrix, e.g., 4096 x 4096 = 16.7M parameters)
# LoRA: instead train W = W_0 + A @ B where:
#   A has shape (4096, r) - only r*4096 params
#   B has shape (r, 4096) - only r*4096 params
#   r (rank) is typically 4, 8, or 16 - much smaller than 4096

# Memory comparison for 7B model:
# Full fine-tuning: ~80GB GPU RAM
# LoRA (rank=8): ~12GB GPU RAM - fits on a single A100 or 3090
print('LoRA makes fine-tuning accessible without massive GPU clusters')

Memasang Pustaka yang Diperlukan

Fine-tuning LoRA dengan Hugging Face memerlukan tiga pustaka: transformers (untuk memuat model dan melakukan tokenisasi), peft (Parameter-Efficient Fine-Tuning, yang mengimplementasikan LoRA), dan trl (Transformer Reinforcement Learning, yang menyediakan SFTTrainer untuk fine-tuning terawasi). Jika digabungkan, ketiganya menyediakan alur kerja fine-tuning tingkat tinggi yang siap digunakan dalam produksi.

# pip install transformers peft trl accelerate bitsandbytes datasets

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, TaskType
from trl import SFTTrainer, SFTConfig
from datasets import Dataset
import torch

print('Libraries imported successfully')
print(f'GPU available: {torch.cuda.is_available()}')
if torch.cuda.is_available():
    print(f'GPU: {torch.cuda.get_device_name(0)}')
    print(f'GPU memory: {torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB')

Memuat Model Dasar dengan Kuantisasi

Untuk sebagian besar fine-tuning LoRA, muat model dasar dalam kuantisasi 4-bit menggunakan bitsandbytes. Cara ini mengurangi jejak memori model dasar sebesar 75% (model 7B berkurang dari sekitar 14 GB menjadi sekitar 4 GB) sekaligus mempertahankan sebagian besar kemampuan model. Hanya lapisan adaptor LoRA yang dilatih dengan presisi penuh. Kombinasi kuantisasi 4-bit + LoRA ini disebut QLoRA dan membuat fine-tuning model 7B dapat dilakukan pada GPU konsumen.

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
import torch

MODEL_NAME = 'mistralai/Mistral-7B-Instruct-v0.2'  # or 'meta-llama/Llama-3.2-3B-Instruct'

# 4-bit quantization config (QLoRA)
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,                         # quantize base model to 4-bit
    bnb_4bit_quant_type='nf4',                 # NF4 quantization type
    bnb_4bit_compute_dtype=torch.float16,      # compute in float16
    bnb_4bit_use_double_quant=True             # double quantization for extra savings
)

# Load quantized model
model = AutoModelForCausalLM.from_pretrained(
    MODEL_NAME,
    quantization_config=bnb_config,
    device_map='auto',                         # automatically distribute across GPUs
    trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
tokenizer.pad_token = tokenizer.eos_token    # required for training batches
print(f'Model loaded. Parameters: {model.num_parameters():,}')

Mengonfigurasi Hyperparameter LoRA

Tiga hyperparameter LoRA yang paling penting adalah: r (peringkat) — dimensi matriks berperingkat rendah; peringkat yang lebih tinggi berarti lebih banyak parameter yang dapat dilatih dan adaptasi yang lebih ekspresif, tetapi juga membutuhkan lebih banyak memori dan meningkatkan risiko overfitting. lora_alpha — faktor penskalaan yang biasanya ditetapkan sebesar 2 kali peringkat. target_modules — matriks bobot yang akan diterapkan LoRA; lapisan perhatian (q_proj, v_proj) adalah pilihan yang paling umum. Mulailah dengan r=8, lalu sesuaikan dari sana.

from peft import LoraConfig, TaskType

lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,         # causal language modeling
    r=8,                                   # rank: 4, 8, 16, 32 — higher = more params
    lora_alpha=16,                         # scaling: usually 2*r
    lora_dropout=0.1,                      # dropout on LoRA layers for regularization
    target_modules=['q_proj', 'v_proj',    # which weight matrices to adapt
                    'k_proj', 'o_proj',    # common to target all attention projections
                    'gate_proj', 'up_proj', 'down_proj'],  # and FFN layers
    bias='none',                           # do not adapt bias parameters
)

# Wrap the model with LoRA adapters
from peft import get_peft_model, prepare_model_for_kbit_training

model = prepare_model_for_kbit_training(model)  # prepares quantized model for training
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# Output: trainable params: 4,194,304 || all params: 3,752,071,168 || trainable%: 0.11%

Menyiapkan Dataset

SFTTrainer mengharapkan dataset dalam format tertentu. Format paling sederhana adalah dataset dengan satu kolom text yang berisi string perintah + respons yang telah diformat sepenuhnya. Gunakan templat obrolan tokenizer untuk memformat contoh percakapan secara konsisten. SFTTrainer menangani tokenisasi, pengelompokan batch, dan penyamaran kerugian (menghitung kerugian hanya pada respons asisten, bukan pada perintah masukan).

from datasets import Dataset
import json

def load_and_format_dataset(jsonl_path: str, tokenizer) -> Dataset:
    examples = []
    with open(jsonl_path) as f:
        for line in f:
            ex = json.loads(line.strip())
            # Apply chat template to format as expected by the model
            formatted = tokenizer.apply_chat_template(
                ex['messages'],
                tokenize=False,
                add_generation_prompt=False
            )
            examples.append({'text': formatted})
    
    return Dataset.from_list(examples)

# Load training and validation datasets
train_dataset = load_and_format_dataset('train.jsonl', tokenizer)
val_dataset = load_and_format_dataset('validation.jsonl', tokenizer)

print(f'Train examples: {len(train_dataset)}')
print(f'Validation examples: {len(val_dataset)}')
print('Sample formatted text:')
print(train_dataset[0]['text'][:300])

Melatih dengan SFTTrainer

SFTTrainer dari TRL membungkus Trainer dari Hugging Face dengan pengaturan bawaan untuk fine-tuning terawasi. Konfigurasikan dengan hyperparameter pelatihan: jumlah epoch (1–3 biasanya cukup untuk fine-tuning instruksi), ukuran batch, langkah akumulasi gradien (untuk menyimulasikan batch yang lebih besar dengan memori terbatas), laju pembelajaran (2e-4 adalah titik awal yang umum), dan direktori keluaran untuk titik pemeriksaan.

from trl import SFTTrainer, SFTConfig

training_args = SFTConfig(
    output_dir='./fine-tuned-model',
    num_train_epochs=2,                    # 2-3 epochs for instruction fine-tuning
    per_device_train_batch_size=4,         # increase if GPU memory allows
    gradient_accumulation_steps=4,         # effective batch size = 4*4 = 16
    learning_rate=2e-4,                    # typical LoRA learning rate
    warmup_ratio=0.05,                     # warmup for 5% of steps
    lr_scheduler_type='cosine',            # cosine decay learning rate schedule
    logging_steps=10,
    eval_strategy='steps',
    eval_steps=50,                         # evaluate on validation set every 50 steps
    save_steps=100,
    max_seq_length=2048,                   # max token length per example
    fp16=True,                             # mixed precision training
    report_to='none'                       # or 'wandb' for experiment tracking
)

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

print('Starting LoRA fine-tuning...')
trainer.train()

Memantau Kemajuan Pelatihan

Selama pelatihan, perhatikan dua metrik utama: kerugian pelatihan seharusnya menurun secara konsisten. Kerugian validasi seharusnya mula-mula menurun, lalu mendatar atau sedikit meningkat (overfitting). Jika kerugian validasi meningkat secara signifikan sementara kerugian pelatihan terus menurun, hentikan pelatihan lebih awal — model sedang menghafal contoh pelatihan, bukan melakukan generalisasi. Titik penghentian yang optimal adalah tepat sebelum kerugian validasi mulai meningkat.

# Reading training logs
# Training step logs look like:
# {'loss': 1.4523, 'grad_norm': 0.85, 'learning_rate': 0.0002, 'epoch': 0.2, 'step': 20}
# {'loss': 1.2341, 'grad_norm': 0.72, 'learning_rate': 0.00018, 'epoch': 0.4, 'step': 40}

# Validation results look like:
# {'eval_loss': 1.1823, 'eval_runtime': 12.3, 'eval_samples_per_second': 8.1, 'step': 50}
# {'eval_loss': 1.0923, 'eval_runtime': 12.1, 'eval_samples_per_second': 8.3, 'step': 100}
# {'eval_loss': 1.1234, 'eval_runtime': 12.4, 'eval_samples_per_second': 8.2, 'step': 150}
# ^ validation loss went UP at step 150 - overfitting starting

# Load the best checkpoint (lowest validation loss)
from transformers import TrainerCallback

print('Best model checkpoint is saved automatically by SFTTrainer (load_best_model_at_end=True)')

Menyimpan Adaptor LoRA dan Menggabungkannya

Setelah pelatihan, simpan bobot adaptor LoRA secara terpisah dari model dasar. Adaptor ini berukuran sangat kecil (beberapa MB hingga beberapa ratus MB) dan dapat diterapkan pada model dasar saat inferensi. Untuk penerapan dalam produksi, Anda juga dapat menggabungkan bobot LoRA ke dalam model dasar, sehingga menghasilkan satu file model yang tidak memerlukan pustaka PEFT saat inferensi — hal ini mengurangi beban tambahan inferensi.

# Save only the LoRA adapter (tiny - typically 10-100MB)
model.save_pretrained('./lora-adapter-only')
tokenizer.save_pretrained('./lora-adapter-only')

# Load the adapter for inference (requires base model + peft)
from peft import PeftModel

base_model = AutoModelForCausalLM.from_pretrained(MODEL_NAME, torch_dtype=torch.float16, device_map='auto')
model_with_adapter = PeftModel.from_pretrained(base_model, './lora-adapter-only')

# Alternative: Merge adapter into base model (no PEFT needed at inference)
print('Merging LoRA weights into base model...')
merged_model = model_with_adapter.merge_and_unload()  # creates a regular model
merged_model.save_pretrained('./merged-model')
print('Merged model saved - can be used with standard transformers, no PEFT needed')

Menjalankan Inferensi pada Model yang Telah Disempurnakan

Uji model yang telah Anda sempurnakan pada sekumpulan perintah yang disisihkan sebelum menyatakan bahwa hasilnya berhasil. Bandingkan keluaran model tersebut secara berdampingan dengan model dasar menggunakan perintah yang sama untuk memverifikasi bahwa fine-tuning mencapai tujuannya. Periksa kasus yang seharusnya ditangani dengan lebih baik (tugas target) maupun kasus yang tetap harus ditangani dengan baik (tugas umum yang tidak ingin Anda biarkan menurun kinerjanya).

def generate(model, tokenizer, prompt: str, max_new_tokens=512) -> str:
    inputs = tokenizer(prompt, return_tensors='pt').to(model.device)
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=max_new_tokens,
            temperature=0.1,
            do_sample=True,
            pad_token_id=tokenizer.eos_token_id
        )
    # Decode only the new tokens (not the input prompt)
    new_tokens = outputs[0][inputs['input_ids'].shape[1]:]
    return tokenizer.decode(new_tokens, skip_special_tokens=True)

# Compare base vs fine-tuned
test_prompt = 'Extract JSON from: "Alice Johnson, 28, software engineer in NYC since 2021"'
print('=== BASE MODEL ===')
print(generate(base_model, tokenizer, test_prompt))
print('\n=== FINE-TUNED MODEL ===')
print(generate(merged_model, tokenizer, test_prompt))

Rangkuman Hyperparameter Utama LoRA

Untuk menyesuaikan LoRA dengan kebutuhan Anda, mulailah dengan nilai bawaan berikut dan ubah satu per satu. r=8 adalah titik awal yang aman — naikkan menjadi 16 atau 32 jika model memerlukan kapasitas yang lebih ekspresif. lora_alpha = 2*r adalah pilihan yang stabil. Laju pembelajaran 2e-4 cocok untuk sebagian besar fine-tuning instruksi; turunkan menjadi 1e-4 jika Anda melihat kerugian pelatihan yang tidak stabil. Epoch 1–3: hentikan pelatihan saat kerugian validasi tidak lagi menurun.

Kapan Sebaiknya Menggunakan Fine-Tuning OpenAI

Hugging Face PEFT LoRA memerlukan GPU. Jika Anda tidak memiliki infrastruktur GPU, API fine-tuning OpenAI merupakan alternatif terkelola yang menangani infrastruktur pelatihan untuk Anda. Unggah file JSONL Anda, panggil API untuk memulai pelatihan, lalu terima ID model yang telah disempurnakan dan dapat digunakan dalam panggilan API. Fine-tuning OpenAI mendukung GPT-4o-mini dan GPT-3.5-turbo. Biayanya per token lebih tinggi, tetapi sepenuhnya menghilangkan kebutuhan untuk mengelola infrastruktur.

from openai import OpenAI

client = OpenAI()

# Upload training file
train_file = client.files.create(
    file=open('train.jsonl', 'rb'),
    purpose='fine-tune'
)
val_file = client.files.create(
    file=open('validation.jsonl', 'rb'),
    purpose='fine-tune'
)

# Create fine-tuning job
job = client.fine_tuning.jobs.create(
    training_file=train_file.id,
    validation_file=val_file.id,
    model='gpt-4o-mini',  # base model to fine-tune
    hyperparameters={
        'n_epochs': 3,
        'batch_size': 'auto',
        'learning_rate_multiplier': 'auto'
    }
)
print(f'Fine-tuning job created: {job.id}')
# Monitor: client.fine_tuning.jobs.retrieve(job.id)
# Use: client.chat.completions.create(model=job.fine_tuned_model, ...)

Pemeriksaan Singkat

Uji pemahaman Anda tentang fine-tuning LoRA dari pelajaran ini.

Rangkuman Pelajaran

Dalam pelajaran ini Anda mempelajari bahwa LoRA mengurangi kebutuhan GPU untuk fine-tuning sebesar 10–50 kali lipat dengan hanya melatih matriks adaptor kecil berperingkat rendah, bukan semua parameter model, QLoRA (kuantisasi 4-bit + LoRA) membuat fine-tuning model 7B dapat dilakukan pada GPU konsumen dengan sekitar 12 GB VRAM, dan SFTTrainer dari TRL menyediakan API tingkat tinggi yang menangani tokenisasi, pengelompokan batch, penyamaran kerugian, serta penyimpanan titik pemeriksaan. Selanjutnya, kita akan mengevaluasi dan menerapkan model yang telah disempurnakan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penyetelan Halus LoRA dengan Hugging Face PEFT” gratis?

Ya — teks lengkap “Penyetelan Halus LoRA dengan Hugging Face PEFT” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Penyetelan Halus LoRA dengan Hugging Face PEFT”?

Konfigurasikan peringkat LoRA, alpha, dan modul target, jalankan penyetelan halus terawasi dengan TRL SFTTrainer, pantau loss pelatihan, lalu simpan checkpoint gabungan dan checkpoint khusus adapter. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?

Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Penyetelan Halus LoRA dengan Hugging Face PEFT” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?

Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Kapan Penyetelan Halus Mengungguli Pemberian Perintah
  2. Menyiapkan Kumpulan Data Pelatihan Berkualitas Tinggi
  3. Penyetelan Halus LoRA dengan Hugging Face PEFT
  4. Mengevaluasi dan Menerapkan Model yang Disetel Halus
← Kembali ke AI Engineering Academy