Materi section large-language-model telah membahas konsep fine-tuning dan LoRA satu per satu; proyek ini merangkainya menjadi alur kerja utuh pada skala yang benar-benar bisa dijalankan di CPU. Kita membangun model bahasa mini level karakter sebagai padanan konseptual LLM, melatihnya sebagai model dasar pada korpus umum, kemudian menempelkan adapter LoRA untuk mengarahkannya ke domain kopi — pola yang sama dengan menyesuaikan LLM besar ke domain tertentu, hanya dengan 27257 parameter alih-alih miliaran. Proyek ditutup dengan perbandingan jujur melawan full fine-tuning, evaluasi perplexity pada dua domain, dan inference generasi teks.

Seluruh kode berjalan di CPU dengan benih tetap (torch.manual_seed(7)) sehingga setiap eksekusi menghasilkan angka yang identik dengan yang tercetak di halaman ini. Pra-latih 150 epoch ditambah fine-tuning 60 epoch selesai dalam hitungan detik.

Prasyarat #

Sebelum masuk ke pengerjaan, pastikan materi berikut sudah dikuasai:

Perilaku Akhir yang Dituju #

Program terdiri atas lima skrip di src/: model_bahasa.py menjadi pustaka bersama (korpus, tokenisasi, model, siklus latih), latih_lora.py menjalankan pra-latih lalu fine-tuning LoRA, latih_full.py pembanding full fine-tuning, evaluasi.py membandingkan perplexity, dan inference.py menghasilkan teks. Sesi inferensi terakhir berjalan sebagai berikut:

bash
python3 src/latih_lora.py
python3 src/evaluasi.py
python3 src/inference.py

Output yang Dihasilkan (keluaran inference.py; keluaran latih_lora.py dan evaluasi.py dibahas pada Bagian 3 dan Bagian 4):

text
== persiapan ==
pra-latih  : 150 epoch pada subset umum
fine-tune  : 60 epoch LoRA r=4 pada subset kopi, loss 2.598 -> 1.721
generasi   : greedy, 40 karakter per prompt

prompt     : 'kopi '
model beku : 'kopi di derangan malam.sikore dengu laman mal'
model lora : 'kopi dingi kopi dingi kopi dingi kopi dingi k'

prompt     : 'barista '
model beku : 'barista semerananang memanak man malam.siti dera'
model lora : 'barista sepanga kopi dingi kopi dingi kopi dingi'

prompt     : 'sore '
model beku : 'sore dituku daman setama kama berjalan ketu m'
model lora : 'sore dingi kopi kopi dingi kopi dingi kopi di'

Model dasar beku masih menghasilkan teks generik campuran kalimat umum, sedangkan model ber-adapter mengulang pola domain kopi. LoRA melatih hanya 1764 dari 27257 parameter (6,5 persen) tanpa mengubah satu bobot dasar pun — buktinya dicetak oleh skrip latih_lora.py.

Struktur Berkas #

text
fine-tuning-model-bahasa/
├── _index.md
├── bagian/                      # lima tahap pengerjaan
│   ├── memilih-model-dan-dataset/
│   ├── menyiapkan-format-data/
│   ├── fine-tuning-dengan-lora/
│   ├── mengevaluasi-model/
│   └── menjalankan-inference/
├── data/
│   ├── generate_data.py         # penulis korpus (deterministik)
│   └── korpus.txt               # 30 kalimat, tiga subset
├── src/
│   ├── model_bahasa.py          # pustaka: korpus, tokenisasi, model, latih
│   ├── latih_lora.py            # pra-latih + fine-tuning LoRA
│   ├── latih_full.py            # pembanding full fine-tuning
│   ├── evaluasi.py              # perplexity dua domain, tiga model
│   └── inference.py             # generasi greedy
└── tests/
    ├── test_lora.py             # uji adapter beku dan delta W
    └── test_generate.py         # uji determinisme generasi

Seluruh berkas pada src/, tests/, dan data/ dapat diunduh dari bagian Berkas Sumber di bawah halaman ini dan setiap bagian pengerjaan.

Tahapan Pengerjaan #

Proyek dikerjakan dalam lima bagian berurutan, dan setiap bagian menghasilkan kode yang benar-benar dapat dijalankan:

  1. Bagian 1 — Memilih Model dan Dataset: memahami padanan konseptual LLM dan isi korpus tiga subset.
  2. Bagian 2 — Menyiapkan Format Data: tokenisasi karakter dan jendela latih 32 token.
  3. Bagian 3 — Fine-Tuning dengan LoRA: memasang adapter r=4 serta membandingkannya dengan full fine-tuning.
  4. Bagian 4 — Mengevaluasi Model: membaca perplexity pada domain baru dan domain lama.
  5. Bagian 5 — Menjalankan Inference: generasi greedy dan pembacaan perilaku model.

Mulailah dari Bagian 1 karena keputusan skala model dan pembagian korpus menentukan seluruh angka pada bagian-bagian berikutnya.