- Untuk tugas khusus yang terlalu sempit bagi LLM serbaguna, melakukan fine-tuning langsung pada Llama-2 dapat meningkatkan kualitas, biaya, dan latensi sekaligus dengan model yang lebih kecil dan lebih murah
- Setelah fine-tuning, akurasi Llama-2 13B naik dari 58%→98% untuk representasi fungsi ViGGO, 42%→89% untuk pembuatan SQL, dan 28%→47% untuk GSM8k
- Pada tugas yang menuntut format output penting seperti ViGGO dan pembuatan SQL, model Llama-2 kecil menghasilkan hasil yang lebih baik daripada GPT-4, tetapi pada penalaran matematika masih belum mencapai tingkat GPT-4
- Eksperimen dilakukan dengan skrip berbasis Ray Train, Ray Data, DeepSpeed, dan Accelerate; 7B·13B dilatih pada 16xA10G, sedangkan 70B pada 32xA10G
- Kunci peningkatan performa bukan ukuran model melainkan kualitas data dan pipeline evaluasi, dan trade-off biaya·kualitas antara prompt engineering dan fine-tuning perlu dibandingkan per tugas
Efek fine-tuning pada tiga jenis tugas
- Model serbaguna besar seperti GPT-4 dan Claude-2 berguna untuk prototyping cepat, tetapi untuk kebutuhan yang sempit seperti peringkasan atau klasifikasi tiket dukungan, model tersebut bisa berlebihan dari sisi biaya dan performa
- Eksperimen ini membandingkan seberapa besar peningkatan saat model Llama-2 di-fine-tune full-parameter untuk tiga tugas realistis
- ViGGO: mengekstrak representasi fungsional dari teks tidak terstruktur
- SQL-create-context: membuat SQL dari bahasa alami dan konteks
CREATE TABLE - GSM8k: menyelesaikan soal matematika tingkat sekolah dasar
- Perubahan akurasi untuk Llama-2 13B adalah sebagai berikut
- Representasi fungsi ViGGO: 58% → 98%
- Pembuatan SQL: 42% → 89%
- GSM8k: 28% → 47%
- Pada ViGGO dan pembuatan SQL, model Llama-2 kecil mengungguli GPT-4, tetapi untuk tugas penalaran matematika seperti GSM8k, hasil setelah fine-tuning masih belum menyamai performa GPT-4
Metode fine-tuning dan infrastruktur pelatihan
- Ketiga tugas sama-sama menggunakan fine-tuning full-parameter standar
- Dilatih dengan skema prediksi token berikutnya
- Semua parameter model menjadi target pembaruan gradien
- LoRA atau metode yang membekukan sebagian blok transformer tidak termasuk dalam cakupan eksperimen
- Skrip eksperimen dibangun di atas Ray Train, Ray Data, DeepSpeed, dan Accelerate
- Mendukung eksekusi Llama-2 7B, 13B, dan 70B
- TorchTrainer dari Ray Train mendistribusikan loop pelatihan ke banyak proses worker dan resource GPU
- Sharding data ditangani oleh Ray Train, dan tiap worker mengakses pecahan data yang dialokasikan dengan
session.get_dataset_shard("train")dansession.get_dataset_shard("valid")
- Sharding model ditangani dengan DeepSpeed ZeRO stage 3 dan offloading optimizer state
- Karena pecahan model tersebar ke beberapa worker, saat diperlukan akses ke model penuh seperti untuk menyimpan checkpoint, model harus di-unwarp dengan
accelerator.unwrap_model(model)
- Karena pecahan model tersebar ke beberapa worker, saat diperlukan akses ke model penuh seperti untuk menyimpan checkpoint, model harus di-unwarp dengan
- Resource komputasi yang digunakan adalah sebagai berikut
- 7B·13B: 16xA10G
- 70B: 32xA10G, 4 instance
g5.48xlarge - Dengan Ray, fine-tuning full-parameter tidak harus memakai A100
- Pelatihan dijalankan hingga maksimum 10 epoch, dan checkpoint dengan perplexity terendah pada validation set dipilih
Mengunci struktur input·output dengan token khusus
- Data fine-tuning merepresentasikan struktur tugas dengan token khusus, bukan prompt instruksi
- Contoh:
<START_Q>{question}<END_Q><START_A>{answer}<END_A>
- Contoh:
- Token khusus membantu model membedakan bagian input dan output, serta mempelajari dengan jelas kapan output harus dihentikan
- Pada contoh,
<END_A>didefinisikan sebagai stopping token agar output berhenti saat tugas selesai
- Pada contoh,
- Tokenizer Llama pada dasarnya menghasilkan 32.000 token ID
- Jika empat token khusus ditambahkan, maka akan menghasilkan 32.004 ID
<START_Q>mendapat ID baru seperti 32000,<END_Q>seperti 32001, dan seterusnya
- Skrip menambahkan token khusus dengan
tokenizer.add_tokens(special_tokens, special_tokens=True)dan membuat parameter latih baru denganmodel.resize_token_embeddings(len(tokenizer))
ViGGO: mengubah teks tidak terstruktur menjadi representasi fungsional
- ViGGO awalnya adalah dataset berbahasa Inggris untuk mengubah representasi fungsional berbasis atribut-nilai menjadi teks alami, tetapi dalam eksperimen ini arahnya dibalik untuk mengubah teks tidak terstruktur menjadi representasi fungsional terstruktur
- Domainnya adalah opini tentang video game
- Representasi hasil dapat digunakan untuk pengindeksan dan aplikasi lanjutan
- Model harus menghasilkan fungsi dan nilai atribut yang sesuai dengan kalimat
- Kandidat fungsi mencakup
inform,request,give_opinion,confirm,verify_attribute,suggest,request_explanation,recommend, danrequest_attribute - Kandidat atribut mencakup
name,release_year,esrb,genres,platforms,available_on_steam,has_linux_release,has_mac_release,specifier,rating,player_perspective,has_multiplayer,developer,exp_release_date, dan lain-lain
- Kandidat fungsi mencakup
- Untuk input contoh
What's a really fast-paced game with multiplayer that you like to play?, output yang diharapkan adalahrequest(has_multiplayer[yes], specifier[fast-paced]) - Model umum tidak mampu mengikuti format output yang diinginkan dengan baik, dan karena konteks input yang panjang, waktu pemrosesan input bisa lebih besar daripada waktu menghasilkan output
- Tugas ini lebih berfokus pada pengenalan pola dan pemahaman bahasa dasar daripada penalaran logis yang kompleks
- Ini adalah grounded task karena semua fakta yang diperlukan sudah ada di input
- Fakta bahwa prompt few-shot membantu menjadi sinyal bahwa model Llama-2 kecil juga bisa membaik lewat fine-tuning
Evaluasi dan hasil ViGGO
- Evaluasi tidak hanya memakai kecocokan string penuh
- Dicek apakah fungsi output benar
- Dicek apakah tipe atribut benar
- Dicek apakah atribut dalam fungsi mengikuti urutan prioritas yang telah ditentukan
- Untuk model instruction-following seperti GPT dan Llama-2-chat, aturan urutan atribut dicantumkan di prompt, sehingga evaluasi mengharuskan model mengikuti aturan itu
- Untuk mempercepat evaluasi, digunakan batch inference API dari Ray bersama Aviary milik Anyscale
- Generasi LLM dan post-processing dirangkai lalu didistribusikan ke banyak mesin
- Setelah fine-tuning, akurasi model 7B dan 13B meningkat tajam
- Akurasi GPT-4 turun besar bila evaluasi memasukkan prioritas atribut
- Model yang di-fine-tune selalu mengikuti prioritas, sehingga penambahan kendala ini tidak mengubah akurasinya
- Hasil ViGGO menunjukkan bahwa fine-tuning bisa menjadi cara yang stabil dan efisien untuk tugas yang memerlukan format terstruktur
- Ini bukan sekadar mencocokkan regex atau format JSON, tetapi menentukan argumen apa yang harus disertakan dan menjaga urutan argumen tersebut
- Karena hasil ini dicapai dengan model 7B·13B, biaya serving bisa lebih rendah dibanding memanggil endpoint GPT-4
Pembuatan SQL: membuat kueri dari bahasa alami dan konteks tabel
- Tugas pembuatan SQL menerima kueri bahasa alami dan pernyataan SQL
CREATE TABLEsebagai input, lalu menghasilkan kueri SQL yang dapat dieksekusi - Dataset yang digunakan, b-mc2/sql-create-context, adalah dataset Hugging Face yang menggabungkan WikiSQL dan Spider
- Tiap data point terdiri dari kueri bahasa alami, pernyataan SQL
CREATE TABLE, dan kueri SQL yang bersesuaian - Totalnya ada 78.577 data point
- Tiap data point terdiri dari kueri bahasa alami, pernyataan SQL
- Ada masalah pada SQL jawaban di dataset
- Di
CREATE TABLE, atribut integer sering ditandai sebagaiVARCHAR, tetapi di kueri SQL diperlakukan sebagai integer - Semua kueri SQL yang mengasumsikan atribut integer dihapus, sehingga ukuran dataset berkurang dari sekitar 70k menjadi 45k
- Di
- Tugas ini juga cocok untuk fine-tuning karena mengubah bahasa alami menjadi representasi terstruktur berupa SQL
- Berbeda dari ViGGO, beberapa SQL berbeda bisa sama-sama menghasilkan output yang benar, sehingga tugasnya lebih ambigu
Evaluasi dan hasil SQL
- Evaluasi pembuatan SQL tidak cocok jika hanya membandingkan string sederhana
- Perbandingan per karakter bisa menghasilkan banyak false negative
- Perbandingan AST juga bisa sensitif terhadap hal seperti urutan nama variabel
- Cara paling andal adalah mengeksekusi kode pada dataset sintetis dan membandingkan apakah outputnya sama
- Dalam eksperimen, endpoint OpenAI GPT-3.5 digunakan untuk membuat tabel palsu untuk unit test pada ratusan contoh
- GPT-3.5 melihat pertanyaan, skema tabel, dan jawaban benar lalu membuat tabel palsu berisi 10 data point
- Dengan
sqlglot.executor.execute, SQL jawaban benar dan SQL hasil model dieksekusi lalu hasilnya dibandingkan
- Untuk memeriksa kualitas tabel data yang dibuat GPT-3.5, SQL jawaban benar dijalankan terlebih dahulu
- Jika tabel hasil kosong atau panjangnya sama dengan tabel asli, contoh tersebut dibuang
- Dalam proses ini, sekitar 50% tabel data buatan GPT terfilter
- Llama-2 7B dan 13B yang di-fine-tune menghasilkan performa lebih tinggi daripada 70B-chat dan GPT-4
- Kesalahan umum pada model Llama chat adalah tidak secara konsisten menaruh SQL di dalam tag
<SQL>sesuai instruksi prompt - Masalah ini lebih sering terjadi pada model chat 7B·13B daripada 70B
- Kesalahan umum pada model Llama chat adalah tidak secara konsisten menaruh SQL di dalam tag
- Sebagian kueri bahasa alami di dataset SQL tidak menggunakan bahasa Inggris yang sempurna, dan noise semacam ini mungkin memengaruhi hasil GPT-4
- Model yang di-fine-tune cepat beradaptasi dengan kebiasaan aneh dalam dataset
GSM8k: penalaran matematika yang lebih sulit daripada pembelajaran struktur
- GSM8k adalah benchmark akademik standar untuk mengevaluasi kemampuan penalaran dan pemahaman matematika
- Jika dua tugas sebelumnya terutama berfokus pada pembelajaran struktur, GSM8k menguji seberapa jauh model bisa meningkatkan proses penalaran untuk menyelesaikan soal matematika
- Soal contohnya menanyakan total penjualan jika pada April terjual 48 unit dan pada Mei terjual setengahnya; jawaban berakhir dalam format
#### 72bersama perhitungan antara - LLM saat ini cenderung perlu menghasilkan proses berpikir sebagai bagian dari output agar generasi token berikutnya bisa didasarkan pada alur logis, alih-alih langsung menghitung jawaban akhir secara internal
- Tugas ini membutuhkan bukan hanya perhitungan sederhana, tetapi juga chain of thought logis dari premis ke kesimpulan antara hingga jawaban akhir
Metode evaluasi GSM8k dan baseline
- Evaluasi memerlukan cara yang stabil untuk mengekstrak jawaban akhir dari output model
- Model bahasa umum mungkin tidak konsisten mengikuti format output yang diinginkan sehingga evaluasi otomatis sulit dilakukan
- Untuk itu digunakan OpenAI function calling API
gpt-3.5-turbo-0613diminta memanggil fungsireport_answeruntuk mengekstrak jawaban bilangan bulat akhir dari hasil generasi model lain- Misalnya, meski model menjawab “The answer is four”, hasilnya tetap bisa di-parse menjadi
4
- Metode ini telah diuji terhadap jawaban dataset untuk memastikan validitasnya, tetapi kekurangannya adalah menambah biaya token OpenAI dalam evaluasi
- Model yang di-fine-tune cepat mempelajari pola jawaban target, sehingga bahkan saat salah pun struktur outputnya tetap bisa diprediksi
- Evaluasi model yang di-fine-tune cukup ditangani dengan regex
#### {answer}sehingga tidak perlu post-processing via endpoint OpenAI
- Evaluasi model yang di-fine-tune cukup ditangani dengan regex
- Baseline yang digunakan adalah sebagai berikut
- Hasil 8-shot prompting dari model base pre-trained yang dipublikasikan di paper
- Berbagai template hasil prompt engineering untuk varian Llama-2 chat-tuned yang dilatih Meta dengan RLHF agar menjadi assistant serbaguna
Hasil GSM8k dan fine-tuning dua tahap
- Fine-tuning model base secara konsisten meningkatkan performa GSM8k, tetapi tidak selalu menghasilkan hasil yang jauh lebih baik daripada model chat-tuned
- Model chat kemungkinan sudah melihat contoh matematika selama proses chat-tuning, sehingga akurasinya lebih tinggi daripada model base
- Cara memasukkan prompt ke model yang di-fine-tune juga tidak selalu memberi hasil lebih baik daripada model base
- Misalnya, Llama-2-70B-chat bisa lebih rendah daripada model base yang diberi prompt contoh 8-shot
- Namun model yang di-fine-tune secara konsisten lebih baik daripada model base dengan prompt 8-shot
- Dari sisi biaya serving, model yang di-fine-tune bisa lebih menguntungkan
- Pendekatan berbasis prompt menambah biaya token prompt pada setiap permintaan
- Pada model yang di-fine-tune, biaya pada dasarnya hanya mencerminkan jumlah token pertanyaan
- Data pelatihan GSM8k relatif kecil, sekitar 8k data, sehingga dianggap belum cukup untuk sepenuhnya mengeluarkan potensi Llama-13B
- Pendekatan dua tahap yang lebih dulu melakukan fine-tuning Llama-13B base pada MathQA lalu kembali fine-tuning pada GSM8k memberikan peningkatan tambahan
- Fine-tuning hanya dengan GSM8k memberi peningkatan 10 poin persentase dibanding base
- Fine-tuning dua tahap dengan MathQA lalu GSM8k memberi tambahan 10 poin persentase lagi dari hasil fine-tuning awal, atau total 20 poin persentase di atas base
- MathQA terdiri dari 30.000 pasangan tanya-jawab, tetapi lebih noisy dan strukturnya berbeda dari GSM8k
- Kualitas jawabannya lebih rendah, dan jawaban akhir berbentuk multiple choice
- Meski begitu, fine-tuning dua tahap tetap efektif memanfaatkan MathQA untuk meningkatkan hasil akhir GSM8k
Kriteria yang perlu dilihat saat penerapan di dunia nyata
- Model tertutup seperti GPT-4 dan Claude-2 kuat untuk prototyping dan validasi nilai awal, tetapi tidak selalu cukup untuk mengoperasikan aplikasi LLM di produksi
- Fine-tuning LLM untuk niche task bisa bernilai bukan hanya dari sisi privasi, tetapi juga dari sisi latensi, biaya, dan kualitas
- Pada contoh ViGGO dan SQL, kualitasnya bahkan lebih baik daripada GPT-4
- Dalam fine-tuning, fokus penting bukan detail implementasi infrastruktur, melainkan pengumpulan data dan pembangunan pipeline evaluasi
- Pipeline evaluasi menjadi dasar untuk membandingkan trade-off berbagai solusi sesuai kebutuhan bisnis
- Eksperimen dilakukan menggunakan platform fine-tuning dan serving Anyscale serta Anyscale Endpoints
- Proses yang sama dapat diulang pada data dan cloud milik sendiri karena solusi fine-tuning dan serving Anyscale dibangun di atas Ray
1 komentar
Komentar Hacker News
Beberapa minggu lalu, dalam live stream coding, saya banyak membahas fine-tuning Llama 2 dengan dataset sendiri, dan melakukannya di satu GPU Colab.
Dalam kasus saya, datasetnya adalah kode saya sendiri.
Fine-tuning Llama stream: https://www.youtube.com/watch?v=TYgtG2Th6fI&t=2282s
Ada juga beberapa sesi fine-tuning QLoRA lain, tempat saya menjelaskan konsep dari sudut pandang software engineer 8 tahun yang baru-baru ini beralih ke machine learning dan belajar secara otodidak.
QloRa fine-tuning stream: https://www.youtube.com/watch?v=LitybCiLhSc&t=4584s
Saya berusaha menjelaskan semudah mungkin bagaimana saya mendekatinya untuk proyek pribadi dan startup berbasis AI yang sedang saya kerjakan. Seri tentang fine-tuning LLM terkecil untuk web development juga tampaknya mendapat respons cukup baik; saya baru streaming sekitar sebulan dan berencana mengunggah lebih banyak lagi ke depannya.
Saya juga belum begitu memahami cara membagi model yang sudah di-fine-tune. Apakah perlu LLM Terraform, LLM SQL, dan LLM Python secara terpisah, atau cukup satu LLM “kode” saja?
Detail implementasinya terlalu banyak sehingga sulit diakses kecuali untuk kasus penggunaan yang benar-benar berarti. privateGPT sepertinya perlahan akan sampai ke titik itu.
Ini bagian yang sering dilewati banyak tutorial. Saya terutama penasaran bagaimana menyiapkannya untuk tujuan yang berbeda seperti keamanan dan akurasi.
Saya mengalami masalah yang sama dengan Llama 2. Hampir mustahil membuatnya hanya mengeluarkan teks yang diinginkan; selalu ada sesuatu yang ditambahkan sebelum atau sesudah respons.
Saya penasaran apakah ada teknik prompting untuk memperbaiki masalah ini.
airoboros mendukung token PLAINFORMAT agar hanya mengeluarkan kode dan menghindari backtick, penjelasan, dan sebagainya.
https://huggingface.co/TheBloke/airoboros-l2-70B-GPT4-2.0-GG...
Jika ingin menjaminnya, paling baik fine-tune dengan dataset kecil, kira-kira sekitar 1.000 contoh, lalu perbaiki dari sana.
Kasus penggunaan saya adalah tugas sederhana untuk mengekstrak/menyintesis informasi dari teks, bukan penulisan kreatif. Model dasar mungkin tidak cocok untuk semua tugas.
contentatau JSON.Kalau JSON, awal dan akhirnya bisa diidentifikasi, jadi konten di luar JSON bisa dihapus.
Senang melihat tulisan seperti ini muncul. Ada terlalu banyak diskusi tentang kustomisasi model di internet, dan artikel ini cukup berhasil menyingkirkan noise.
Saya juga suka metodologi evaluasinya, dan tulisannya tampak bagus.
Aneh bahwa LoRA dan quantized training tidak dibahas lebih serius. Keduanya jauh lebih murah, memakan waktu lebih sedikit, dan ada banyak bukti bahwa hasilnya cukup bagus.
Menurut saya ini bukan sesuatu yang layak disisihkan seperti opsi tambahan untuk dicoba nanti.
Senang melihat tugas mirip NER menghasilkan performa terbaik. Saya baru saja hendak melakukan pengujian serupa untuk membandingkannya dengan model BERT yang di-fine-tune.
Saya penasaran berapa biaya training untuk tugas ini.
Ukuran blok bisa saja diturunkan, tetapi lebih mudah membiarkan kode apa adanya. 7B membutuhkan sekitar 15 menit per epoch pada 16xA10G, dan 13B sekitar 25 menit. Jadi biaya on-demand per epoch kira-kira $7,2 untuk 7B dan $12 untuk 13B. Angka ini hanya berdasarkan waktu yang dipakai untuk training dan tidak mencakup waktu start/stop cluster.
Disebutkan bahwa 7B dan 13B memakai 16xA10G, sedangkan 70B memakai 32xA10G yang dibagi ke 4 instance g5.48xlarge. Dengan Ray, tidak perlu mendapatkan A100 untuk fine-tuning full-parameter model seperti ini, dan proses yang sama diulang untuk tiap tugas. Pada dataset GSM8k, mereka menunjukkan contoh run dengan panjang konteks 512 dan 3,7 juta token efektif per epoch.
Mereka melatih hingga maksimal 10 epoch dan memilih checkpoint dengan perplexity minimum pada validation set.
Salah satu kesulitannya adalah untuk membuat dataset kustom yang cukup besar, Anda membutuhkan semacam pasukan kecil atau model lama yang sangat kuat.
Pada akhirnya kemungkinan besar harus memakai OpenAI, tetapi membuat materi training untuk model lain dengan OpenAI melanggar ketentuan layanannya. Saya penasaran apakah ini pernah sampai menjadi gugatan. Apakah orang-orang menganggapnya tidak adil lalu mengabaikannya saja?
Belakangan saya lebih sering melihat contoh NER, dan saya penasaran mengapa tidak memakai spaCy untuk tugas seperti itu.
Saya bekerja di Anyscale.
Blog ini tampaknya mendapat perhatian yang baik, jadi kami berencana memasukkannya ke Ray Summit: https://raysummit.anyscale.com/agenda
Kalau ada ide jenis konten apa lagi yang ingin Anda lihat di Ray Summit, beri tahu kami.
Tertulis bahwa untuk 3,5 juta token, 7B butuh sekitar 14 menit untuk 1 epoch, sedangkan 13B sekitar 26 menit untuk 1 epoch.
Katanya baik 7B maupun 13B membutuhkan minimal 1xg5.16xlarge sebagai head node dan 15xg5.4xlarge sebagai worker node; saya penasaran berapa biayanya di AWS.
Jika dijalankan di us-east-1, kira-kira bisa dianggap sekitar $30 per jam.
https://instances.vantage.sh/?selected=g5.16xlarge,g5.4xlarg...
Saya penasaran apakah Llama-2 bisa di-fine-tune secara lokal di M1 Ultra 64GB. Sebagian besar referensi memakai cloud atau Nvidia CUDA di Linux, jadi akan bagus kalau ada materi yang bisa dijadikan acuan.
Untuk training, saya berencana membeli sedikit kredit RunPod, dan sepertinya bisa dilakukan dengan beberapa puluh dolar.