1 poin oleh GN⁺ 2024-05-27 | 1 komentar | Bagikan ke WhatsApp
  • mistral-finetune adalah 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 jsonl dan skema yang ketat; sebelum pelatihan, penting menjalankan validasi format dan estimasi waktu pelatihan dengan utils.validate_data

Status dan tujuan proyek

  • Repositori mistral-finetune berstatus 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-finetune berbasis 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_path ke direktori checkpoint tersebut
    • Karena ukuran modelnya besar, fine-tuning membutuhkan memori jauh lebih besar
    • Saat ini seq_len harus diatur ke 8192 atau kurang
    • Learning rate yang lebih rendah dibanding model lain disarankan; dalam sebagian besar kasus, lr=1e-6 disebut kemungkinan bekerja dengan baik
  • Sejak 19 Juli 2024, Mistral Nemo kompatibel dengan mistral-finetune
    • Anda harus mengunduh model 12B Base atau Instruct dan mengatur model_id_or_path ke direktori checkpoint
    • Diperlukan versi mistral-common yang mendukung Tekkenizer; pasang versi >=1.3.1 dengan pip 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_len harus diatur ke 16384 atau kurang
    • Disarankan menggunakan hyperparameter yang sama seperti 7B v3

Instalasi dan pengunduhan model

  • Prosedur awal terdiri dari clone repositori dan instalasi dependensi
  • Fine-tuning model resmi Mistral disarankan, dan README menyediakan tautan unduhan model serta checksum berikut
  • 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_path di 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": 0 pada pesan tersebut
  • 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

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_data dan data.eval_instruct_data di example/7B.yaml
  • Saat proses validasi, dapat ditemukan masalah bahwa sebagian percakapan berakhir dengan role user
    • Karena hanya pesan assistant yang dilatih, pesan user terakhir menjadi item yang tidak perlu diproses
    • Data dapat diperbaiki dengan utils.reformat_data.py
  • 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=500 mengiterasi dataset sekitar 5 kali dan memerlukan sekitar 30 menit pada klaster 8xH100; konfigurasi max_steps=300 disarankan

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 .corrected dapat dibuat

Eksekusi pelatihan dan contoh hasil

  • Setelah validasi data, pelatihan dapat dimulai
  • Untuk pelatihan yang lebih cepat, konfigurasi yang menetapkan max_steps ke 300 disarankan
  • run_dir harus diatur sebagai folder eksperimen, dan secara opsional wandb.project dapat ditentukan untuk menggunakan logging Weights & Biases
  • Pelatihan dijalankan menggunakan torchrun, dan --nproc-per-node harus 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 pelatihan
  • run_dir: direktori untuk menyimpan checkpoint dan metrik
  • seq_len: panjang sekuens pelatihan; sampel dipacking agar sesuai dengan panjang seq_len demi efisiensi
  • batch_size: jumlah contoh pelatihan per GPU
    • Ukuran batch token efektif keseluruhan adalah num_gpus x batch_size x seq_len
  • max_steps: jumlah total iterasi pelatihan
    • Total token yang dilihat selama pelatihan adalah max_steps x num_gpus x batch_size x seq_len
  • optim.lr: learning rate awal optimizer
  • optim.weight_decay: weight decay; README menyarankan tetap 0.1
  • optim.pct_start: rasio tahap warm-up pada PyTorch OneCycleLR
  • lora.rank: ukuran adapter LoRA; disarankan 64 atau kurang
  • seed: seed acak untuk reproducibility inisialisasi serta pengacakan dan sampling data
  • data.instruct_data: path data pelatihan instruction
    • Dapat menentukan satu file jsonl, direktori jsonl, atau beberapa sumber data dengan bobot
  • data.data: path data pra-pelatihan tambahan opsional
  • data.eval_instruct_data: path data instruction evaluasi opsional
  • eval_freq, no_eval, ckpt_freq: mengontrol frekuensi evaluasi, evaluasi antara, dan penyimpanan checkpoint
  • save_adapters: menentukan apakah hanya menyimpan checkpoint LoRA atau menggabungkan LoRA ke model dasar dan menyimpannya sebagai model penuh
    • save_adapters=False memerlukan 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 path lora.safetensors yang 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
  • 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_size ke 1 dan mengurangi seq_len
  • 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

 
GN⁺ 2024-05-27
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

    • Ya. Ada data manusia non-Inggris, dan dianotasi dalam format yang dirancang untuk riset tertentu terkait kesehatan
      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 perlu menghasilkan output dalam format tertentu dalam jumlah besar, fine-tuning bisa berguna
      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
    • Bagaimana kalau itu data internal perusahaan yang belum pernah dilihat GPT-4?
    • Dalam tugas pemrosesan bahasa alami tradisional, LLM masih jauh di bawah pipeline NLP khusus seperti penandaan kelas kata atau penandaan fitur
      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
    • Function calling juga bisa menjadi alasan
      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

    • Jika anggarannya tidak benar-benar nol, saya sangat menyarankan memakai desktop gaming
      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
    • Coba cek situs ini: https://www.hardware-corner.net/llm-database/Mistral/
      Situs itu merangkum kebutuhan hardware per model, dan Anda bisa memfilter model yang tersedia dengan memilih VRAM dan memori sistem
    • Anda bisa memakai server GPU di Hetzner seharga 184 euro per bulan
      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
    • Coba gunakan openpipe
      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

    • “Jika kita menyediakan tool, orang-orang akan membuat” hanya berlaku ketika insentif untuk mempelajari teknologi tersebut membuat orang mengharapkan keuntungan di masa depan
  • 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?

  • Bagaimana cara melatih model chat WhatsApp saya?

    • Perlu lebih jelas maksudnya
      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