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:
- LoRA dan QLoRA — rumus delta W = B @ A dan alasan bobot dasar dibekukan.
- Supervised Fine-Tuning — apa yang membedakan fine-tuning dari pra-latih.
- Long Short-Term Memory — gerbang pada sel LSTM yang kita tulis eksplisit.
- Next-Token Prediction — tugas memprediksi token berikut sebagai sumber loss.
- Training Loop
— cetakan
zero_gradhinggastep()yang dipakai ulang di sini.
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:
python3 src/latih_lora.py
python3 src/evaluasi.py
python3 src/inference.pyOutput yang Dihasilkan (keluaran inference.py; keluaran latih_lora.py dan evaluasi.py dibahas pada Bagian 3 dan Bagian 4):
== 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 #
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 generasiSeluruh 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:
- Bagian 1 — Memilih Model dan Dataset: memahami padanan konseptual LLM dan isi korpus tiga subset.
- Bagian 2 — Menyiapkan Format Data: tokenisasi karakter dan jendela latih 32 token.
- Bagian 3 — Fine-Tuning dengan LoRA: memasang adapter r=4 serta membandingkannya dengan full fine-tuning.
- Bagian 4 — Mengevaluasi Model: membaca perplexity pada domain baru dan domain lama.
- 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.
Pilih padanan konseptual LLM berskala mini dan susun korpus tiga subset sebagai bahan pra-latih dan fine-tuning.
Buka → # Bagian 2: Menyiapkan Format DataTokenisasi teks menjadi indeks karakter lalu susun jendela latih 32 token dengan target bergeser satu posisi.
Buka → # Bagian 3: Fine-Tuning dengan LoRABekukan model dasar, tempel adapter LoRA rank 4 pada dua lapisan terberat, lalu latih hanya matriks A dan B.
Buka → # Bagian 4: Mengevaluasi ModelBandingkan perplexity tiga model pada domain kopi dan domain umum untuk mengukur penyesuaian sekaligus indikasi lupa.
Buka → # Bagian 5: Menjalankan InferenceLanjutkan teks dengan decoding greedy karakter demi karakter lalu bandingkan generasi model beku dan model ber-LoRA.
Buka →