Mistral-finetune - Mistral modelini fine-tune etmek
(github.com/mistralai)mistral-finetune, Mistral modellerini bellek verimli ve yüksek performanslı şekilde fine-tune etmek için hazırlanmış hafif bir kod tabanıdır; depo şu anda arşivlenmiştir ve artık aktif olarak bakım yapılmamaktadır- Eğitim yaklaşımı, ağırlıkların çoğunu sabitleyip düşük dereceli matris pertürbasyonları biçimindeki ek ağırlıkların yalnızca %1~2’sini eğiten LoRA’ya dayanır
- En yüksek verim için A100 veya H100 GPU kullanılması önerilir; kod çoklu GPU tek düğüm eğitimine optimize edilmiştir, ancak 7B gibi küçük modeller tek GPU ile de mümkündür
- Desteklenen modeller arasında 7B, Mixtral 8x7B, Mixtral 8x22B, Mistral-Nemo 12B ve Mistral Large v2 123B Instruct bulunur; Mistral-Nemo ve Large v2 için sırasıyla dizi uzunluğu ve öğrenme oranı ile ilgili kısıtlar vardır
- Veriler
jsonlbiçiminde ve katı bir şemaya uygun olmalıdır; eğitimden önceutils.validate_dataile biçim doğrulaması ve eğitim süresi tahmini yapılması önemli bir adımdır
Proje durumu ve amacı
mistral-finetunedeposu Archived durumundadır ve artık aktif olarak bakım yapılmamaktadır- Topluluktan talep gelirse veya fine-tune ekosistemine değer katacağı düşünülürse, gelecekte yeni bir kütüphane ya da büyük bir güncelleme çıkabilir
- Amaç, Mistral modellerini fine-tune etmek için basit ve yönlendirmeli bir giriş noktası sağlamaktır
- Bu kod tabanı özellikle veri biçimi konusunda oldukça net tercihlere sahiptir ve çok sayıda model mimarisi ya da donanım türünü kapsayan genel amaçlı bir araç olmayı hedeflemez
- Daha genel bir yaklaşım için torchtune gibi projelere bakılabilir
Fine-tune yöntemi ve donanım önerileri
mistral-finetune, LoRA tabanlıdır- Model ağırlıklarının çoğu sabit tutulur
- Düşük dereceli matris pertürbasyonları biçimindeki ek ağırlıkların yalnızca %1~2’si eğitilir
- En yüksek verim için A100 veya H100 GPU kullanılması önerilir
- Kod, çoklu GPU tek düğüm eğitim ortamı için optimize edilmiştir
- 7B gibi küçük modeller tek GPU ile de yeterlidir
Son uyumlu model güncellemeleri
- 13 Ağustos 2024 itibarıyla Mistral Large v2,
mistral-finetuneile uyumludur- 123B Instruct checkpoint’i indirilip
model_id_or_pathbu checkpoint dizinine ayarlanmalıdır - Model büyük olduğu için fine-tune sırasında çok daha fazla bellek gerekir
- Şu anda
seq_lendeğeri 8192 veya altında olmalıdır - Diğer modellere kıyasla daha düşük bir öğrenme oranı önerilir ve çoğu durumda
lr=1e-6değerinin iyi çalışacağı belirtilir
- 123B Instruct checkpoint’i indirilip
- 19 Temmuz 2024 itibarıyla Mistral Nemo,
mistral-finetuneile uyumludur- 12B Base veya Instruct modeli indirilip
model_id_or_pathcheckpoint dizinine ayarlanmalıdır - Tekkenizer desteği olan bir
mistral-commonsürümü gerekir;pip install --upgrade mistral-commonile>=1.3.1sürümü kurulmalıdır - Büyük sözlük boyutu nedeniyle CE loss için tepe bellek gereksinimi artar ve şu anda daha fazla bellek gerekir
- Şu anda
seq_lendeğeri 16384 veya altında olmalıdır - 7B v3 ile aynı hiperparametrelerin kullanılması önerilir
- 12B Base veya Instruct modeli indirilip
Kurulum ve model indirme
- Başlangıç adımları, deponun klonlanması ve bağımlılıkların kurulmasından oluşur
git clone https://github.com/mistralai/mistral-finetune.gitpip install -r requirements.txt
- Resmî Mistral modelleriyle fine-tune önerilir ve README aşağıdaki model indirme bağlantılarını ve checksum değerlerini sağlar
- 7B Base:
0663b293810d7571dad25dae2f2a5806 - 7B Instruct v3:
80b71fcb6416085bcb4efad86dfb4d52 - 8x7B Base: Hugging Face bağlantısı
- 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 ve 8x7B Instruct V1, fine-tune öncesinde v3 tokenizer kullanmalı ve sözlük boyutu 32768’e genişletilmelidir
- İndirilen model klasörünün yolu, eğitim YAML dosyasındaki
model_id_or_pathalanına mutlak yol olarak girilmelidir
Veri biçimi gereksinimleri
- Tüm veri dosyaları jsonl biçiminde olmalıdır
- Ön eğitim verisi, düz metni
"text"anahtarında saklar - Instruction verisi, konuşma listesini
"messages"anahtarında saklar- Her öğe
"content"ve"role"anahtarlarını içerir "role","user","assistant"veya"system"değerlerinden biri olmalıdır- Kayıp yalnızca
"role" == "assistant"olduğunda hesaplanır - Bir assistant mesajına
"weight": 0verilerek o mesaj eğitim dışında bırakılabilir
- Her öğe
- Function calling verisi de konuşma listesini
"messages"anahtarında saklar- Her öğe
"role"ile birlikte"content"veya"tool_calls"anahtarını içerir "role","user","assistant","system"veya"tool"değerlerinden biri olmalıdır- Kayıp yalnızca
"role" == "assistant"olduğunda hesaplanır "tool_calls"içindeki"id"ve"tool_call_id", tam olarak 9 karakter uzunluğunda rastgele dizeler olmalıdır- README, bunların veri hazırlama betiğinde otomatik üretilmesini önerir
- Her öğe
Veri doğrulama ve örnek iş akışı
- Eğitime başlamadan önce utils.validate_data ile veri biçimi doğrulanmalı ve eğitim süresi tahmin edilmelidir
- Instruction örneğinde Ultachat_200k veri kümesinin bir kısmı kullanılır
- Parquet verisi Pandas ile yüklenir
- Eğitim %95, değerlendirme %5 olacak şekilde ayrılır
jsonlolarak kaydedilir- Yollar
example/7B.yamliçindekidata.instruct_datavedata.eval_instruct_dataalanlarına yazılır
- Doğrulama sırasında bazı konuşmaların
userrolüyle bittiği fark edilebilir- Yalnızca assistant mesajları eğitildiği için son
usermesajı gereksiz işleme neden olur - Veri utils.reformat_data.py ile düzeltilebilir
- Yalnızca assistant mesajları eğitildiği için son
- Düzeltmeden sonra yeniden doğrulama yapıldığında veri token sayısı, eğitim token sayısı, epoch sayısı,
max_steps, tahmini süre gibi özetler çıktı olarak verilir - README örneğinde
max_steps=500, veri kümesini yaklaşık 5 kez dolaşan ve 8xH100 kümesinde yaklaşık 30 dakika süren bir ayardır;max_steps=300önerilir
Function calling fine-tune örneği
- Function calling örneğinde Glaive function calling dataset kullanılır
- Veri Pandas ile yüklenir, ardından eğitim %95 ve değerlendirme %5 olarak ayrılıp
jsonlbiçiminde kaydedilir - Kaynak veri kümesi gerekli function calling biçimine uymadığından yeniden biçimlendirme gerekir
"from","user"olarak değiştirilmelidir- Gereksiz
"\n"karakterleri kaldırılmalıdır
- utils.reformat_data_glaive.py kullanıldığında örneklerin çoğu doğru biçime getirilebilir
- Her tür veri kümesine uyan bir yeniden biçimlendirme betiği yazmak mümkün olmadığından, gerekli biçime uymayan veri kümeleri için ayrı bir betik gerekebilir
utils.validate_data --create_correctedkullanılarak kalan hatalar giderilebilir ve.correctedveri kümesi oluşturulabilir
Eğitimi çalıştırma ve sonuç örnekleri
- Veri doğrulamasından sonra eğitim başlatılabilir
- Daha hızlı eğitim için
max_stepsdeğerinin 300 olarak ayarlanması önerilir run_dir, deney klasörü olarak ayarlanmalıdır; isteğe bağlı olarakwandb.projectbelirtilerek Weights & Biases loglama kullanılabilir- Eğitim
torchrunile çalıştırılır ve--nproc-per-nodekullanılabilir GPU sayısına ayarlanmalıdır - UltraChat eğitimi 8xH100 düğümünde yaklaşık 30 dakika sürer ve ortaya çıkan ağırlıklar yaklaşık 6.3 MT Bench puanı verebilir
- Glaive eğitimi 8xH100 düğümünde yaklaşık 1 saat sürer ve ortaya çıkan ağırlıkların function calling için iyi çalıştığı belirtilir
Eğitim yapılandırmasındaki başlıca alanlar
model_id_or_path: eğitime başlanacak ön eğitimli model veya yerel model dizini yolurun_dir: checkpoint ve metriklerin kaydedileceği dizinseq_len: eğitim dizi uzunluğu; örnekler verimlilik içinseq_lenuzunluğuna göre paketlenirbatch_size: GPU başına eğitim örneği sayısı- Toplam etkin token batch boyutu
num_gpus x batch_size x seq_lenşeklindedir
- Toplam etkin token batch boyutu
max_steps: toplam eğitim iterasyonu sayısı- Eğitim boyunca görülen toplam token sayısı
max_steps x num_gpus x batch_size x seq_lenşeklindedir
- Eğitim boyunca görülen toplam token sayısı
optim.lr: optimizer başlangıç öğrenme oranıoptim.weight_decay: ağırlık çürümesi; README bunun 0.1 olarak korunmasını öneriroptim.pct_start: PyTorchOneCycleLRiçin warm-up aşamasının oranılora.rank: LoRA adaptör boyutu; 64 veya altı önerilirseed: başlatma ile veri karıştırma/örnekleme süreçlerinde yeniden üretilebilirlik için rastgelelik tohumudata.instruct_data: instruction eğitim verisinin yolu- Tek bir
jsonldosyası,jsonldizini veya ağırlıklı birden çok veri kaynağı belirtilebilir
- Tek bir
data.data: isteğe bağlı ek ön eğitim verisi yoludata.eval_instruct_data: isteğe bağlı değerlendirme instruction verisi yolueval_freq,no_eval,ckpt_freq: değerlendirme, ara değerlendirme ve checkpoint kaydetme sıklığını kontrol edersave_adapters: yalnızca LoRA checkpoint’lerinin mi kaydedileceğini, yoksa LoRA’nın temel modelle birleştirilip tam model olarak mı saklanacağını belirlersave_adapters=False, tam modeli tek süreçte kaydetmek için yeterli CPU ve GPU belleği gerektirir ve genellikle yalnızca 7B modelde mümkündür
Çıkarım ve Weights & Biases
- Eğitilmiş model için çıkarımda mistral-inference kullanılması önerilir
pip install mistral_inferenceile kurulabilirmistral-chatçalıştırılırken kaydedilmişlora.safetensorsdosyasının yolu--lora_pathile verilerek LoRA ağırlıkları kullanılabilir- Weights and Biases desteği, eğitim metriklerini ve deneyleri izlemek için dahildir
pip install wandbile kurulur- API anahtarı için
WANDB_API_KEYortam değişkeninin kullanılması önerilir - Güvenlik nedeniyle API anahtarı YAML yapılandırmasından okunmaz
- Eğitim kaybı, değerlendirme kaybı, öğrenme oranı gibi bilgiler wandb proje paneline kaydedilir ve görselleştirilir
- Ayrıntılı kullanım için Weights and Biases documentation incelenebilir
Model genişletme ve SSS
- Yalnızca v3 tokenizer ile uyumlu Mistral modelleri fine-tune edilebilir
- Uyumlu modellerin sözlük boyutu 32768 olmalıdır, 32000 değil
- Sözlük boyutu 32000 olan eski modeller
utils.extend_model_vocabile 32768’e genişletilebilir - MoE modellerinin fine-tune sürecinde performans varyansı daha yüksektir
- Aynı MoE fine-tune işlemini farklı seed değerleriyle birkaç kez çalıştırıp en iyi sonucu seçme yaklaşımı önerilir
- Dense modellerde bu kadar yüksek varyans gözlenmemiştir
- Eğitimde kullanılan token sayısı, YAML eğitim dosyası utils.validate_data.py içine verilerek görülebilir
- CUDA out-of-memory hatası alınırsa GPU başına batch boyutu küçültülebilir
- Batch boyutu
seq_len x batch_sizeşeklindedir batch_sizedeğerini 1 yapıpseq_lendeğerini düşürmek önerilir
- Batch boyutu
- Kütüphane Apache 2.0 License ile sunulmaktadır
- Bu kütüphane veya model, üçüncü tarafların fikri mülkiyet hakları da dahil olmak üzere haklarını ihlal eden, kötüye kullanan ya da çiğneyen şekillerde kullanılmamalıdır
1 yorum
Hacker News yorumları
Modeller bu kadar hızlı gelişirken ince ayar hâlâ değerli mi? Gerçek kullanım örneklerini merak ediyorum.
Örneğin Bloomberg geçen yıl finansal verilerle GPT-3.5 düzeyinde bir LLM eğitti, ancak çok geçmeden GPT-4-8k neredeyse tüm finans görevlerinde onu geçti.
Sonunda biz de yüksek kaliteli değerlendirme verilerine ve yeni modellere kolayca geçebilen bir mimariye odaklanır olduk.
LLM bu tür etiketleri hiç görmedi; İngilizce dışındaki LLM’ler şirketlerin en büyük önceliği de değil, ayrıca veri gizliliği nedeniyle yalnızca çevrimdışı öncelikli modeller kullanabiliyoruz.
Bu koşullarda genel amaçlı bir dil modeline ince ayar yapmak çok iyi uyuyor.
Biçimlendirilmiş mesajlarla ince ayar yaparsanız model bu formatı otomatik olarak üretir; böylece her prompt’ta çıktı formatını açıklamak için harcanan birçok tokendan tasarruf edebilirsiniz.
Ancak ince ayar ikisi arasındaki farkı oldukça kapatıyor.
Dar bir alan olsa da programlamanın çoğu için de durum böyle. Amacınız genel amaçlı bir LLM’i kendi verilerinize doğru daha fazla eğmekse ince ayarın pek ilgili olmama ihtimali yüksek.
Ama çok spesifik ve aynı zamanda muğlak bir problemi çözmeye çalışıyorsanız ve LLM bunun yalnızca bir kısmını çözebiliyorsa, ince ayar büyük olasılıkla en iyi seçenektir.
Uygulamanızda araçlarla etkileşen çok sayıda özel fonksiyon varsa, bağlam tokenları kullanmak yerine ince ayarı tercih edebilirsiniz.
Bunu yapmak için nasıl bir GPU gerekir? 3060 Ti dizüstü sürümü, i9 ve 16 GB RAM’im var.
AWS veya GCP kotam yok; Paperspace’i duydum ama üzerinde çalıştığım müşteri projesinde bazı Mistral modellerini kullanmayı planladığım için Mistral ince ayarına hızlıca başlamak istiyorum.
Oyun GPU’ları 300 W ısıyı sorunsuzca dışarı atabilir; dizüstü GPU’su bunu yaparsa eriyip gider ve muhtemelen yaklaşık 100 W ile sınırlanır.
Isı atımı hızla doğrudan orantılıdır.
Üstelik masaüstünde daha hızlı bir GPU’ya yükseltme yapmak veya birden fazla GPU kullanmak da mümkündür.
Ancak özellikle çoklu GPU kurulumları gürültülüdür ve bir odayı kısa sürede ısıtacak kadar çok ısı üretir.
Önümüzdeki birkaç yıl boyunca GPU’yu tam yükte çalıştırma süreniz %10’u geçmeyecekse bulut muhtemelen daha ucuz olur.
Model bazında donanım gereksinimlerini derlemişler; VRAM ve sistem belleğini seçerek kullanılabilir modelleri filtreleyebiliyorsunuz.
Bizim şirket oradaki RTX4000 ile Mistral ve Llama 3’e ince ayar yapıyordu.
RAM’i yalnızca 20 GB olduğu için biraz sınırlayıcı, ancak daha büyük giriş token sayıları için kuantizasyon düzeyini düşürmek işe yaradı.
Artık saatlik kiralama da sunuyorlar.
Şu anda şirkette kullanıyoruz ve oldukça iyi sonuçlar gördük.
Yaygın LLM kullanım senaryolarının her biri için hangi aracın fiilî standart hâline geleceği çok ilginç.
Ekosistem o kadar parçalanmış ki çoğu aracı hiç duymamışım gibi geliyor.
Birkaç gün önce Microsoft’un Olive’ını gördüm; tamamen ilk kez karşılaştığım bir araçtı.
Pek çok açık kaynak LLM’in artık “kullanılabilir” seviyeye geldiği bu dönemde, bunların etrafında geliştirme yapmayı kolaylaştırmak önemli.
Özellikle hem kullanıcı hem geliştirici olan kişilerin kapalı verilerden, daha doğrusu modelin ön eğitiminde yer almayan verilerden yararlanabilmesi gerekiyor.
Depoda büyük modellere göre optimize edildiği ve A100/H100 gerektiği yazıyor, ama yine de bunun büyük modellerden çok küçük modellere daha fazla fayda sağlayabileceğini düşünüyorum.
“Yaparsan gelirler” sözünü “araçları sağlarsan insanlar üretir” şeklinde genişletebiliriz.
Ağırlıklar kısmı ilginç.
HuggingFace’in SFTTrainer’ı isterseniz yalnızca tamamlama kısmını eğitmenize izin veriyor; bu insanlara doğal görünse de LLM’ler genellikle tüm girdiyi tahmin edecek şekilde eğitildiğinde daha iyi oluyor.
Bu yaklaşımla iki tarafın da avantajını elde edebilirsiniz.
Daha büyük varyant modelleri iki adet 3090 veya 4090 ile eğitebilecek şekilde optimize edilebilir mi?
Bazı seçenekleri ele alan başlangıç noktası burada: https://huggingface.co/blog/trl-peft
Kendi WhatsApp sohbet modelimi nasıl eğitebilirim?
Kendi WhatsApp mesajlarınızla bir modeli eğitmek mi istiyorsunuz? Amaç nedir? Sizin gibi yazmasını mı istiyorsunuz, yoksa RAG tabanlı soru-cevap mı yapmak istiyorsunuz; buna göre değişir.