Mistral-finetune - Melakukan fine-tuning model Mistral
(github.com/mistralai)mistral-finetuneadalah codebase ringan untuk melakukan fine-tuning model Mistral secara efisien memori dan berkinerja baik; repositori ini saat ini sudah diarsipkan dan tidak lagi dipelihara secara aktif- Metode pelatihannya berbasis LoRA, yang membekukan sebagian besar bobot dan hanya melatih 1–2% bobot tambahan dalam bentuk perturbasi matriks berperingkat rendah
- Untuk efisiensi maksimal, disarankan menggunakan GPU A100 atau H100; kodenya dioptimalkan untuk pelatihan multi-GPU pada satu node, tetapi model kecil seperti 7B juga dapat dijalankan dengan satu GPU
- Model yang didukung mencakup 7B, Mixtral 8x7B, Mixtral 8x22B, Mistral-Nemo 12B, dan Mistral Large v2 123B Instruct; Mistral-Nemo dan Large v2 masing-masing memiliki batasan terkait panjang sekuens dan learning rate
- Data harus mengikuti format
jsonldan skema yang ketat; sebelum pelatihan, penting menjalankan validasi format dan estimasi waktu pelatihan denganutils.validate_data
Status dan tujuan proyek
- Repositori
mistral-finetuneberstatus Archived dan tidak lagi dipelihara secara aktif - Jika ada permintaan komunitas atau dinilai dapat menambah nilai bagi ekosistem fine-tuning, pustaka baru atau pembaruan besar dapat dirilis di masa mendatang
- Tujuannya adalah menyediakan titik masuk yang sederhana dan terpandu untuk melakukan fine-tuning model Mistral
- Codebase ini cukup beropini, khususnya soal format data, dan tidak ditujukan sebagai alat umum yang mencakup berbagai arsitektur model atau jenis hardware
- Untuk pendekatan yang lebih umum, proyek seperti torchtune dapat dijadikan referensi
Metode fine-tuning dan rekomendasi hardware
mistral-finetuneberbasis LoRA- Sebagian besar bobot model dibekukan
- Hanya 1–2% bobot tambahan dalam bentuk perturbasi matriks berperingkat rendah yang dilatih
- Untuk efisiensi maksimal, disarankan menggunakan GPU A100 atau H100
- Kodenya dioptimalkan untuk lingkungan pelatihan multi-GPU pada satu node
- Model kecil seperti 7B cukup dijalankan dengan satu GPU
Pembaruan model kompatibel terbaru
- Sejak 13 Agustus 2024, Mistral Large v2 kompatibel dengan
mistral-finetune- Anda harus mengunduh checkpoint 123B Instruct dan mengatur
model_id_or_pathke direktori checkpoint tersebut - Karena ukuran modelnya besar, fine-tuning membutuhkan memori jauh lebih besar
- Saat ini
seq_lenharus diatur ke 8192 atau kurang - Learning rate yang lebih rendah dibanding model lain disarankan; dalam sebagian besar kasus,
lr=1e-6disebut kemungkinan bekerja dengan baik
- Anda harus mengunduh checkpoint 123B Instruct dan mengatur
- Sejak 19 Juli 2024, Mistral Nemo kompatibel dengan
mistral-finetune- Anda harus mengunduh model 12B Base atau Instruct dan mengatur
model_id_or_pathke direktori checkpoint - Diperlukan versi
mistral-commonyang mendukung Tekkenizer; pasang versi>=1.3.1denganpip install --upgrade mistral-common - Karena ukuran kosakata yang besar, kebutuhan memori puncak untuk CE loss meningkat sehingga saat ini diperlukan lebih banyak memori
- Saat ini
seq_lenharus diatur ke 16384 atau kurang - Disarankan menggunakan hyperparameter yang sama seperti 7B v3
- Anda harus mengunduh model 12B Base atau Instruct dan mengatur
Instalasi dan pengunduhan model
- Prosedur awal terdiri dari clone repositori dan instalasi dependensi
git clone https://github.com/mistralai/mistral-finetune.gitpip install -r requirements.txt
- Fine-tuning model resmi Mistral disarankan, dan README menyediakan tautan unduhan model serta checksum berikut
- 7B Base:
0663b293810d7571dad25dae2f2a5806 - 7B Instruct v3:
80b71fcb6416085bcb4efad86dfb4d52 - 8x7B Base: tautan Hugging Face
- 8x7B Instruct:
8e2d3930145dc43d3084396f49d38a3f - 8x22 Instruct:
471a02a6902706a2f1e44a693813855b - 8x22B Base:
a2fa75117174f87d1197e3a4eb50371a - 12B Instruct (Mistral-Nemo):
296fbdf911cb88e6f0be74cd04827fe7 - 12 Base (Mistral-Nemo):
c5d079ac4b55fc1ae35f51f0a3c0eb83 - 123B Instruct (Large v2):
fc602155f9e39151fba81fcaab2fa7c4
- 7B Base:
- 8x7B Base V1 dan 8x7B Instruct V1 harus menggunakan v3 tokenizer dan memperluas ukuran kosakata menjadi 32768 sebelum fine-tuning
- Path folder model yang diunduh harus ditentukan sebagai path absolut pada
model_id_or_pathdi YAML pelatihan
Persyaratan format data
- Semua file data harus berformat jsonl
- Data pra-pelatihan menyimpan teks biasa pada key
"text" - Data instruction menyimpan daftar percakapan pada key
"messages"- Setiap item menyertakan key
"content"dan"role" "role"adalah salah satu dari"user","assistant","system"- Loss hanya dihitung ketika
"role" == "assistant" - Anda dapat mengecualikan pesan assistant dari pelatihan dengan menetapkan
"weight": 0pada pesan tersebut
- Setiap item menyertakan key
- Data function calling juga menyimpan daftar percakapan pada key
"messages"- Setiap item menyertakan key
"role"dan"content"atau"tool_calls" "role"adalah salah satu dari"user","assistant","system","tool"- Loss hanya dihitung ketika
"role" == "assistant" "id"dan"tool_call_id"pada"tool_calls"harus berupa string acak dengan panjang tepat 9 karakter- README menyarankan agar nilai ini dibuat otomatis dalam skrip persiapan data
- Setiap item menyertakan key
Validasi data dan contoh workflow
- Sebelum memulai pelatihan, format data harus divalidasi dan waktu pelatihan harus diestimasi dengan utils.validate_data
- Contoh instruction menggunakan sebagian dari Ultachat_200k
- Memuat data parquet dengan Pandas
- Membaginya menjadi 95% pelatihan dan 5% evaluasi
- Menyimpannya sebagai
jsonl - Menentukan path pada
data.instruct_datadandata.eval_instruct_datadiexample/7B.yaml
- Saat proses validasi, dapat ditemukan masalah bahwa sebagian percakapan berakhir dengan role
user- Karena hanya pesan assistant yang dilatih, pesan
userterakhir menjadi item yang tidak perlu diproses - Data dapat diperbaiki dengan utils.reformat_data.py
- Karena hanya pesan assistant yang dilatih, pesan
- Setelah diperbaiki dan divalidasi ulang, ringkasan seperti jumlah token data, jumlah token pelatihan, jumlah epoch,
max_steps, dan perkiraan waktu akan ditampilkan - Dalam contoh README,
max_steps=500mengiterasi dataset sekitar 5 kali dan memerlukan sekitar 30 menit pada klaster 8xH100; konfigurasimax_steps=300disarankan
Contoh fine-tuning function calling
- Contoh function calling menggunakan Glaive function calling dataset
- Data dimuat dengan Pandas, dibagi menjadi 95% pelatihan dan 5% evaluasi, lalu disimpan sebagai
jsonl - Dataset asli tidak mengikuti format function calling yang disyaratkan sehingga perlu diformat ulang
"from"harus diubah menjadi"user"- Karakter
"\n"yang tidak diperlukan harus dihapus
- Dengan utils.reformat_data_glaive.py, sebagian besar sampel dapat dibuat ke format yang benar
- Karena mustahil menulis skrip reformat yang bekerja untuk semua jenis dataset, dataset yang tidak mengikuti format yang disyaratkan mungkin memerlukan skrip reformat terpisah
- Dengan
utils.validate_data --create_corrected, error yang tersisa dapat dihapus dan dataset.correcteddapat dibuat
Eksekusi pelatihan dan contoh hasil
- Setelah validasi data, pelatihan dapat dimulai
- Untuk pelatihan yang lebih cepat, konfigurasi yang menetapkan
max_stepske 300 disarankan run_dirharus diatur sebagai folder eksperimen, dan secara opsionalwandb.projectdapat ditentukan untuk menggunakan logging Weights & Biases- Pelatihan dijalankan menggunakan
torchrun, dan--nproc-per-nodeharus diatur sesuai jumlah GPU yang tersedia - Pelatihan UltraChat memerlukan sekitar 30 menit pada node 8xH100, dan bobot hasilnya dapat menghasilkan skor MT Bench sekitar 6.3
- Pelatihan Glaive memerlukan sekitar 1 jam pada node 8xH100, dan bobot hasilnya disebut bekerja dengan baik untuk function calling
Item utama konfigurasi pelatihan
model_id_or_path: path ke model pra-pelatihan atau direktori model lokal untuk memulai pelatihanrun_dir: direktori untuk menyimpan checkpoint dan metrikseq_len: panjang sekuens pelatihan; sampel dipacking agar sesuai dengan panjangseq_lendemi efisiensibatch_size: jumlah contoh pelatihan per GPU- Ukuran batch token efektif keseluruhan adalah
num_gpus x batch_size x seq_len
- Ukuran batch token efektif keseluruhan adalah
max_steps: jumlah total iterasi pelatihan- Total token yang dilihat selama pelatihan adalah
max_steps x num_gpus x batch_size x seq_len
- Total token yang dilihat selama pelatihan adalah
optim.lr: learning rate awal optimizeroptim.weight_decay: weight decay; README menyarankan tetap 0.1optim.pct_start: rasio tahap warm-up pada PyTorchOneCycleLRlora.rank: ukuran adapter LoRA; disarankan 64 atau kurangseed: seed acak untuk reproducibility inisialisasi serta pengacakan dan sampling datadata.instruct_data: path data pelatihan instruction- Dapat menentukan satu file
jsonl, direktorijsonl, atau beberapa sumber data dengan bobot
- Dapat menentukan satu file
data.data: path data pra-pelatihan tambahan opsionaldata.eval_instruct_data: path data instruction evaluasi opsionaleval_freq,no_eval,ckpt_freq: mengontrol frekuensi evaluasi, evaluasi antara, dan penyimpanan checkpointsave_adapters: menentukan apakah hanya menyimpan checkpoint LoRA atau menggabungkan LoRA ke model dasar dan menyimpannya sebagai model penuhsave_adapters=Falsememerlukan memori CPU dan GPU yang cukup untuk menyimpan seluruh model dalam satu proses, dan biasanya hanya memungkinkan pada model 7B
Inferensi dan Weights & Biases
- Untuk inferensi model yang telah dilatih, disarankan menggunakan mistral-inference
- Dapat dipasang dengan
pip install mistral_inference - Saat menjalankan
mistral-chat, bobot LoRA dapat digunakan dengan menentukan pathlora.safetensorsyang tersimpan pada--lora_path - Dukungan Weights and Biases disertakan untuk memantau metrik pelatihan dan eksperimen
- Dipasang dengan
pip install wandb - Disarankan menyediakan API key melalui environment variable
WANDB_API_KEY - Demi keamanan, API key tidak dibaca dari konfigurasi YAML
- Training loss, evaluation loss, learning rate, dan lainnya dicatat serta divisualisasikan pada dashboard proyek wandb
- Dipasang dengan
- Untuk penggunaan lebih detail, lihat Weights and Biases documentation
Ekstensi model dan FAQ
- Hanya model Mistral yang kompatibel dengan v3 tokenizer yang dapat di-fine-tune
- Model yang kompatibel harus memiliki ukuran kosakata 32768, bukan 32000
- Model lama dengan ukuran kosakata 32000 dapat diperluas hingga 32768 dengan
utils.extend_model_vocab - Fine-tuning model MoE menunjukkan variasi performa yang lebih besar
- Disarankan menjalankan fine-tuning MoE yang sama beberapa kali dengan seed berbeda dan memilih hasil dengan performa terbaik
- Variasi tinggi seperti ini tidak diamati pada dense model
- Jumlah token yang digunakan dalam pelatihan dapat diperiksa dengan memasukkan file YAML pelatihan ke utils.validate_data.py
- Jika terjadi error CUDA out-of-memory, ukuran batch per GPU dapat dikurangi
- Ukuran batch adalah
seq_len x batch_size - Disarankan menetapkan
batch_sizeke 1 dan mengurangiseq_len
- Ukuran batch adalah
- Pustaka ini tersedia dengan Apache 2.0 License
- Pustaka atau model ini tidak boleh digunakan dengan cara yang melanggar, menyalahgunakan, atau menyalahi hak pihak ketiga, termasuk hak kekayaan intelektual
1 komentar
Komentar di Hacker News
Dengan perkembangan model secepat ini, apakah fine-tuning masih bernilai? Saya penasaran dengan use case nyata
Misalnya, tahun lalu Bloomberg melatih LLM setara GPT-3.5 dengan data keuangan, tetapi tak lama kemudian GPT-4-8k mengunggulinya di hampir semua tugas keuangan
Pada akhirnya kami jadi berfokus pada data evaluasi berkualitas tinggi dan arsitektur yang memudahkan beralih ke model baru
LLM belum pernah melihat anotasi seperti ini, LLM non-Inggris juga bukan prioritas utama perusahaan, dan karena privasi data kami hanya bisa memakai model yang mengutamakan offline
Dalam situasi seperti ini, fine-tuning model bahasa umum sangat cocok
Jika di-fine-tune dengan pesan yang sudah terformat, model akan otomatis menghasilkan format tersebut, sehingga bisa menghemat banyak token untuk menjelaskan format output di setiap prompt
Namun fine-tuning cukup menutup celah di antara keduanya
Ini memang ranah yang sempit, tetapi sebagian besar pemrograman juga begitu. Jika tujuannya membuat LLM umum lebih condong ke data Anda sendiri, fine-tuning kemungkinan besar tidak terlalu relevan
Namun jika Anda mencoba memecahkan masalah yang sangat spesifik sekaligus ambigu, dan LLM hanya bisa menyelesaikan sebagian darinya, fine-tuning kemungkinan besar adalah pilihan terbaik
Jika aplikasi memiliki banyak fungsi kustom yang berinteraksi dengan tool, Anda mungkin lebih memilih fine-tuning daripada memakai token konteks
GPU apa yang diperlukan untuk melakukan ini? Saya punya 3060 Ti versi laptop, i9, RAM 16GB
Saya tidak punya kuota AWS atau GCP dan pernah mendengar tentang Paperspace, tetapi saya ingin segera mulai fine-tuning Mistral karena berencana memakai sebagian model Mistral untuk proyek klien yang sedang dikerjakan
GPU gaming bisa membuang panas 300W tanpa masalah, tetapi GPU laptop mungkin akan meleleh jika melakukan itu dan kemungkinan dibatasi sekitar 100W
Pembuangan panas berbanding langsung dengan kecepatan
Selain itu, desktop memungkinkan upgrade ke GPU yang lebih cepat atau memakai beberapa GPU
Namun, terutama konfigurasi multi-GPU itu berisik dan menghasilkan panas yang cukup untuk cepat menghangatkan satu ruangan
Jika selama beberapa tahun ke depan waktu menjalankan GPU pada beban penuh tidak akan melebihi 10%, cloud kemungkinan lebih murah
Situs itu merangkum kebutuhan hardware per model, dan Anda bisa memfilter model yang tersedia dengan memilih VRAM dan memori sistem
Perusahaan kami telah melakukan fine-tuning Mistral dan Llama 3 dengan RTX4000 di sana
Agak terbatas karena RAM-nya hanya 20GB, tetapi untuk jumlah token input yang lebih besar, menurunkan tingkat kuantisasi cukup membantu
Sekarang mereka juga menyediakan penyewaan per jam
Saat ini kami memakainya di perusahaan dan hasilnya cukup bagus
Sangat menarik melihat tool apa yang akan menjadi standar de facto untuk tiap use case LLM yang umum
Ekosistemnya terlalu terfragmentasi, sehingga rasanya sebagian besar tool bahkan belum pernah saya dengar
Beberapa hari lalu saya melihat Olive dari Microsoft, dan itu benar-benar tool yang baru pertama kali saya temui
Sekarang setelah banyak LLM open-source sudah mencapai tingkat “cukup layak dipakai”, yang penting adalah mempermudah pengembangan di sekitarnya
Khususnya, orang-orang yang merupakan pengguna sekaligus developer harus bisa memanfaatkan data privat, tepatnya data yang tidak ada dalam pra-pelatihan model
Repositorinya mengatakan ini dioptimalkan untuk model besar sehingga membutuhkan A100/H100, tetapi tetap saja saya merasa ini bisa lebih membantu model kecil dibanding model besar
“Jika kita membangunnya, orang-orang akan datang” bisa diperluas menjadi “jika kita menyediakan tool, orang-orang akan membuat”
Bagian bobot menarik
SFTTrainer dari HuggingFace memungkinkan pelatihan hanya pada bagian completion jika diinginkan, tetapi meski itu terlihat alami bagi manusia, LLM umumnya lebih baik dilatih untuk memprediksi seluruh input
Dengan cara ini, kita bisa mendapatkan keunggulan dari kedua pendekatan
Bisakah ini dioptimalkan agar bisa melatih varian model yang lebih besar dengan dua 3090 atau 4090?
Titik awal yang membahas beberapa opsi ada di sini: https://huggingface.co/blog/trl-peft
Bagaimana cara melatih model chat WhatsApp saya?
Apakah Anda ingin melatih model dengan pesan WhatsApp Anda sendiri? Tujuannya apa? Ini tergantung apakah Anda ingin model menulis seperti Anda, atau ingin tanya jawab berbasis RAG