1 puan yazan GN⁺ 2024-05-27 | 1 yorum | WhatsApp'ta paylaş
  • 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 jsonl biçiminde ve katı bir şemaya uygun olmalıdır; eğitimden önce utils.validate_data ile biçim doğrulaması ve eğitim süresi tahmini yapılması önemli bir adımdır

Proje durumu ve amacı

  • mistral-finetune deposu 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-finetune ile uyumludur
    • 123B Instruct checkpoint’i indirilip model_id_or_path bu 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_len değ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-6 değerinin iyi çalışacağı belirtilir
  • 19 Temmuz 2024 itibarıyla Mistral Nemo, mistral-finetune ile uyumludur
    • 12B Base veya Instruct modeli indirilip model_id_or_path checkpoint dizinine ayarlanmalıdır
    • Tekkenizer desteği olan bir mistral-common sürümü gerekir; pip install --upgrade mistral-common ile >=1.3.1 sü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_len değeri 16384 veya altında olmalıdır
    • 7B v3 ile aynı hiperparametrelerin kullanılması önerilir

Kurulum ve model indirme

  • Başlangıç adımları, deponun klonlanması ve bağımlılıkların kurulmasından oluşur
  • Resmî Mistral modelleriyle fine-tune önerilir ve README aşağıdaki model indirme bağlantılarını ve checksum değerlerini sağlar
  • 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_path alanı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": 0 verilerek o mesaj eğitim dışında bırakılabilir
  • 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

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
    • jsonl olarak kaydedilir
    • Yollar example/7B.yaml içindeki data.instruct_data ve data.eval_instruct_data alanlarına yazılır
  • Doğrulama sırasında bazı konuşmaların user rolüyle bittiği fark edilebilir
    • Yalnızca assistant mesajları eğitildiği için son user mesajı gereksiz işleme neden olur
    • Veri utils.reformat_data.py ile düzeltilebilir
  • 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 jsonl biç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_corrected kullanılarak kalan hatalar giderilebilir ve .corrected veri 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_steps değerinin 300 olarak ayarlanması önerilir
  • run_dir, deney klasörü olarak ayarlanmalıdır; isteğe bağlı olarak wandb.project belirtilerek Weights & Biases loglama kullanılabilir
  • Eğitim torchrun ile çalıştırılır ve --nproc-per-node kullanı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 yolu
  • run_dir: checkpoint ve metriklerin kaydedileceği dizin
  • seq_len: eğitim dizi uzunluğu; örnekler verimlilik için seq_len uzunluğuna göre paketlenir
  • batch_size: GPU başına eğitim örneği sayısı
    • Toplam etkin token batch boyutu num_gpus x batch_size x seq_len şeklindedir
  • 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
  • optim.lr: optimizer başlangıç öğrenme oranı
  • optim.weight_decay: ağırlık çürümesi; README bunun 0.1 olarak korunmasını önerir
  • optim.pct_start: PyTorch OneCycleLR için warm-up aşamasının oranı
  • lora.rank: LoRA adaptör boyutu; 64 veya altı önerilir
  • seed: başlatma ile veri karıştırma/örnekleme süreçlerinde yeniden üretilebilirlik için rastgelelik tohumu
  • data.instruct_data: instruction eğitim verisinin yolu
    • Tek bir jsonl dosyası, jsonl dizini veya ağırlıklı birden çok veri kaynağı belirtilebilir
  • data.data: isteğe bağlı ek ön eğitim verisi yolu
  • data.eval_instruct_data: isteğe bağlı değerlendirme instruction verisi yolu
  • eval_freq, no_eval, ckpt_freq: değerlendirme, ara değerlendirme ve checkpoint kaydetme sıklığını kontrol eder
  • save_adapters: yalnızca LoRA checkpoint’lerinin mi kaydedileceğini, yoksa LoRA’nın temel modelle birleştirilip tam model olarak mı saklanacağını belirler
    • save_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_inference ile kurulabilir
  • mistral-chat çalıştırılırken kaydedilmiş lora.safetensors dosyasının yolu --lora_path ile verilerek LoRA ağırlıkları kullanılabilir
  • Weights and Biases desteği, eğitim metriklerini ve deneyleri izlemek için dahildir
    • pip install wandb ile kurulur
    • API anahtarı için WANDB_API_KEY ortam 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_vocab ile 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_size değerini 1 yapıp seq_len değerini düşürmek önerilir
  • 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

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

    • Evet. İngilizce olmayan insan verilerimiz var ve belirli sağlık araştırmaları için tasarlanmış bir formatta etiketlenmiş durumda.
      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.
    • Belirli bir formatta büyük miktarda çıktı üretmeniz gerekiyorsa ince ayar faydalı olabilir.
      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.
    • Peki ya GPT-4’ün hiç görmediği şirket içi kurumsal veriler?
    • Geleneksel doğal dil işleme görevlerinde LLM’ler, sözcük türü etiketleme veya özellik etiketleme gibi özel doğal dil işleme pipeline’larının epey gerisinde.
      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.
    • Fonksiyon çağırma da bir gerekçe olabilir.
      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.

    • Bütçeniz tamamen sıfır değilse oyun masaüstü almanızı güçlü biçimde öneririm.
      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.
    • Şu siteye bakabilirsiniz: https://www.hardware-corner.net/llm-database/Mistral/
      Model bazında donanım gereksinimlerini derlemişler; VRAM ve sistem belleğini seçerek kullanılabilir modelleri filtreleyebiliyorsunuz.
    • Hetzner’da aylık 184 avroluk bir GPU sunucusu kullanabilirsiniz.
      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.
    • openpipe’ı denemeniz iyi olabilir.
      Ş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.

    • “Araçları sağlarsan insanlar üretir” ancak o teknolojiyi öğrenme teşviki gelecekteki kazanç beklentisi yarattığında geçerlidir.
  • 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?

  • Kendi WhatsApp sohbet modelimi nasıl eğitebilirim?

    • Ne demek istediğiniz daha net olmalı.
      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.