LLaMA, OpenLaMA ve XGen son teknoloji üretken yapay zeka modelleridir. Bu modeller, kendi verileriniz üzerinde ince ayar yapıldığında çok daha iyi sonuçlar verir. Bu makalede, JAX ve EasyLM kütüphanesini kullanarak bu modellere hem GPU hem de TPU üzerinde nasıl ince ayar yapılacağını görelim.
LLaMA modeli Meta tarafından Şubat 2023'te yayınlanmıştır. Bu üretken yapay zeka modeli, çeşitli boyutlarda önerilen açık kaynaklı bir modeldir: 7B parametre, 13B parametre, 33B parametre ve 65B parametre.
Haziran 2021'de GPT-J piyasaya sürüldüğünde, dünya açık kaynaklı üretken yapay zeka modellerinin OpenAI GPT-3 ile ciddi şekilde rekabet edebileceğini fark etmeye başladı. Şimdi LLaMA ile çıta açıkça tekrar yükseltildi ve bu model OpenAI ChatGPT ve GPT-4'e çok iyi bir açık kaynak alternatifi gibi görünüyor.
LLaMA'nın lisansı iş dostu değil: bu model ticari amaçlarla kullanılamaz... Ancak iyi haber şu ki, artık başka modeller de mevcut.
Haziran 2023'te piyasaya sürülen OpenLLaMA, Berkeley AI Research ekibi tarafından geliştirilen, çok iyi sonuçlar veren ve iş için kullanılabilen alternatif bir LLaMA sürümüdür. Bu yazı itibariyle 2 versiyonu mevcuttur: 7B parametre ve 13B parametre.
Salesforce tarafından Haziran 2023'te piyasaya sürülen XGen, ticari uygulamalarda kullanılabilecek çok güçlü bir başka temel modeldir. Bu yazı itibariyle yalnızca 7B parametreli bir sürümü mevcuttur. Bu modelin 8k token içeriğini desteklediğini, LLaMA ve OpenLaMA'nın ise yalnızca 2k token içeriğini desteklediğini belirtmek gerekir.
Yukarıdaki modeller temel modellerdir, yani geniş bir metin külliyatı üzerinde denetimsiz bir şekilde eğitilmişlerdir.
Bu temel yapay zeka modelleri genellikle iyi bir temel oluşturur, ancak ne istediğinizi doğru bir şekilde anlamak ve iyi sonuçlar döndürmek için ayarlanmaları gerekir. Bunu başarmanın en kolay yolu az sayıda öğrenme ("hızlı mühendislik" olarak da bilinir) kullanmaktır. Özel birkaç atışlık öğrenme kılavuzumuzu buradan okumaktan çekinmeyin.
Birkaç vuruşluk öğrenme, üretici yapay zeka modelinin yeni bir versiyonunu oluşturmak zorunda kalmadan anında gerçekleştirilebildiği için kullanışlıdır, ancak bazen yeterli değildir.
Son teknoloji ürünü sonuçlar elde etmek için, kendi kullanım durumunuz için bir yapay zeka modeline ince ayar yapmak isteyeceksiniz. İnce ayar, modeldeki bazı parametreleri kendi verilerinize göre değiştireceğiniz ve ardından modelin kendi sürümünü elde edeceğiniz anlamına gelir.
İnce ayar, sıfırdan üretken bir yapay zeka modelini eğitmekten çok daha ucuzdur, ancak yine de hesaplama gücü gerektirir, bu nedenle kendi modelinize ince ayar yapmak için gelişmiş donanıma ihtiyacınız vardır. Bazı yeni alternatif ince ayar teknikleri daha az hesaplama gücü gerektirir (bkz. p-tuning, prompt tuning, soft tuning, parameter efficient fine-tuning, adaptörler, LoRA, QLoRA...) ancak şu ana kadar bu tekniklerle aynı kaliteyi elde etmeyi başaramadık, bu nedenle bu eğitimde onlardan bahsetmeyeceğiz.
Bu eğitimde Berkeley AI Research ekibi tarafından yayınlanan EasyLM kütüphanesi ile LLaMA'ya ince ayar yapmaya odaklanıyoruz: https://github.com/young-geng/EasyLM. This library is based on JAX which makes the fine-tuning process fast and compatible with both GPUs and Google TPUs.
Aynı tekniği kullanarak OpenLLaMA veya XGen'e de ince ayar yapabilirsiniz.
Burada bir Google TPU V3-8 üzerinde LLaMA 7B'ye ince ayar yapıyoruz, ancak aynı şeyi bir A100 GPU üzerinde de yapabilirsiniz (EasyLM belgelerindeki biraz farklı olan "Kurulum" bölümünü dikkatlice okumanız yeterlidir). Elbette LLaMA'nın daha büyük sürümlerine de ince ayar yapabilirsiniz (13B, 33B, 65B...) ancak bir TPU V3-8 veya tek bir A100 GPU'dan çok daha fazlasına ihtiyacınız olacak.
İşte başlıyoruz!
Öncelikle, kullanım durumunuz için JSONL biçiminde, her örnek için anahtar olarak "text" kullanarak bir metin oluşturma veri kümesi oluşturun. İşte basit bir duygu analizi veri kümesi:
{"text":"[Content]: I love NLP Cloud, this company is awesome!\n[Sentiment]: Positive"}
{"text":"[Content]: Training LLMs is a complex but rewarding process.\n[Sentiment]: Neutral"}
{"text":"[Content]: My fine-tuning keeps crashing because of an OOM error! It just does not work at all!\n[Sentiment]: Negative"}
Lütfen birkaç önemli noktaya dikkat edin. İlk olarak, bu veri seti basitlik adına sadece 3 örnek içermektedir, ancak gerçek hayatta çok daha fazla örneğe ihtiyacınız olacaktır. 300 örnek genellikle iyi bir başlangıçtır. İkinci olarak, ince ayarlanmış modelinizi çıkarım için kullanacağınız zaman, "[Content]:" ve "[Sentiment]:" öneklerini kullanarak aynı biçimlendirmeyi kesinlikle takip etmeniz gerekecektir. Son olarak, "</s>" belirteci önemlidir çünkü modelin burada üretmeyi durdurması gerektiği anlamına gelir. NLP Cloud dokümantasyonunda daha fazla veri kümesi örneği bulabilirsiniz: buradan daha fazla bilgi edinin.
V2 Alpha yazılım sürümü ile Google Cloud üzerinde bir TPU V3-8 VM oluşturun:
Sanal makineye SSH ile bağlanın ve EasyLM'yi kurun:
git clone https://github.com/young-geng/EasyLM
cd EasyLM
bash ./scripts/tpu_vm_setup.sh
Artık LLaMA ağırlıklarını indirebilir ve dönüştürebilirsiniz. İlk seçenek Meta'dan resmi ağırlıkları istemektir: https://ai.facebook.com/blog/large-language-model-llama-meta-ai/. Ardından bu komut dosyasıyla ağırlıkları EasyLM'ye dönüştürün: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_torch_to_easylm.py. İkinci seçenek ise HuggingFace üzerinde LLaMA ağırlıklarını kullanmaktır: https://huggingface.co/decapoda-research/llama-7b-hf. Ardından bu komut dosyasıyla ağırlıkları EasyLM'ye dönüştürün: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_hf_to_easylm.py.
Veri setinizi VM'ye yükleyin, HF LLaMA tokenizer'ı kullanarak kaç token içerdiğini sayın:
pip install -U transformers
python -c "from transformers import LlamaTokenizer; tokenizer = LlamaTokenizer.from_pretrained('decapoda-research/llama-7b-hf'); f = open('/path/to/your/dataset', 'r'); print(len(tokenizer.encode(f.read())))"
Modelinizi 1024 belirteçli bir bağlam için eğitiyorsanız, döndürülen belirteç sayısını 1024'e bölmeniz gerekecektir.
Modelinizi 2048 belirteç bağlamı için eğitiyorsanız, döndürülen belirteç sayısını 2048'e bölmeniz gerekecektir.
Bu sayı epok başına adım sayısı olacaktır. Örneğin, 5 epok için eğitim yapmak istiyorsanız (ki bu genellikle iyi bir ayardır) bu sayıyı 5 ile çarpmanız ve elde edilen değeri aşağıdaki --total_steps'e koymanız gerekecektir.
İşte somut bir örnek: veri kümeniz 100.000 belirteç içeriyorsa ve 1024 belirteç bağlamı ve 5 epok istiyorsanız, toplam adım sayınız (100.000/1024)*5 = 488 olacaktır.
Bağlam uzunluğunuza bağlı olarak --train_dataset.json_dataset.seq_length değerini aşağıda 1024 veya 2048 olarak ayarlayın. Bir modelin 2048 belirteç bağlamı için ince ayarının yapılmasının daha fazla bellek gerektirdiğini unutmayın, bu nedenle bu kesinlikle gerekli değilse 1024 belirteç bağlamına bağlı kalmanızı öneririz.
Artık ince ayar işlemini başlatabilirsiniz:
nohup python -u EasyLM/EasyLM/models/llama/llama_train.py \
--total_steps=your number of steps \
--save_model_freq=usually same as your number of steps \
--optimizer.adamw_optimizer.lr_warmup_steps=usually 10% of total steps \
--train_dataset.json_dataset.path='/path/to/your/dataset' \
--train_dataset.json_dataset.seq_length=1024 or 2048 \
--load_checkpoint='params::/path/to/converted/model' \
--tokenizer.vocab_file='/path/to/tokenizer' \
--logger.output_dir=/path/to/output \
--mesh_dim='1,4,2' \
--load_llama_config='7b' \
--train_dataset.type='json' \
--train_dataset.text_processor.fields='text' \
--optimizer.type='adamw' \
--optimizer.accumulate_gradient_steps=1 \
--optimizer.adamw_optimizer.lr=0.002 \
--optimizer.adamw_optimizer.end_lr=0.002 \
--optimizer.adamw_optimizer.lr_decay_steps=100000000 \
--optimizer.adamw_optimizer.weight_decay=0.001 \
--optimizer.adamw_optimizer.multiply_by_parameter_scale=True \
--optimizer.adamw_optimizer.bf16_momentum=True &
Bazı açıklamalar:
--save_model_freq: işlem sırasında modelinizi ne sıklıkta kaydetmek istediğiniz. Yalnızca küçük bir veri kümesi üzerinde ince ayar yapıyorsanız, yalnızca işlemin sonunda kaydedebilirsiniz ve bu durumda bu değer --total_steps değerine eşit olacaktır.
--optimizer.adamw_optimizer.lr_warmup_steps: Toplam adımların %10'u genellikle iyi bir değerdir.
--tokenizer.vocab_file: tokenizer.model dosyasının yolu. Örneğin, HuggingFace üzerinde decapoda deposunu kullanıyorsanız, tokenizer'ın bağlantısı şöyledir: https://huggingface.co/decapoda-research/llama-7b-hf/resolve/main/tokenizer.model
--logger.output_dir: nihai modelin ve günlüklerin yolu
Diğer parametrelere dokunulmayabilir.
İnce ayar işlemi tamamlandığında, modelinizi --logger.output_dir'de belirttiğiniz yoldan alabilirsiniz.
Artık kendi ince ayarlı modelinize sahipsiniz ve elbette onu kullanmak istiyorsunuz!
İlk strateji çıkarım için EasyLM kütüphanesini kullanmaktır. Bu durumda çıkarım sunucusunu şu şekilde başlatabilirsiniz:
python EasyLM/EasyLM/models/llama/llama_serve.py \
--mesh_dim='1,1,-1' \
--load_llama_config='7b' \
--load_checkpoint='params::/path/to/your/model' \
--tokenizer.vocab_file='/path/to/tokenizer'
Daha sonra isteklerinizi cURL ile şu şekilde gönderin:
curl "http://0.0.0.0:5007/generate" \
-H "Content-Type: application/json" \
-X POST -d '{"prefix_text":["[Content]: EasyLM works really well!\n[Sentiment]:"]}'
İkinci bir strateji, başka bir çerçeveyle çıkarım yapmak için modelinizi HuggingFace formatına aktarmaktır. İşte nasıl dışa aktarabileceğiniz:
python EasyLM/EasyLM/models/llama/convert_easylm_to_hf.py \
--load_checkpoint='params::/path/to/output/model/streaming_params' \
--tokenizer_path='/path/to/tokenizer' \
--model_size='7b' \
--output_dir='/path/to/converted/model'
2023, açık kaynaklı üretken yapay zeka modelleri için büyük bir dönüm noktası oldu. Bu yazı itibariyle herkes LLaMA, OpenLaMA, XGen, Orca, Falcon gibi harika modelleri kullanabilir...
Bu modellere ince ayar yapmak, ChatGPT (GPT-3.5), GPT-4, Claude gibi en iyi tescilli yapay zeka modellerinden önemli ölçüde daha iyi performans gösterebilen, kendi kullanım durumunuza göre uyarlanmış son teknoloji sonuçlar elde etmenin en iyi yoludur.
Bu kılavuzda size LLaMA, OpenLaMA ve XGen'e nasıl ince ayar yapacağınızı gösterdim. Sorularınız varsa ve gelişmiş üretken yapay zeka modellerini herhangi bir teknik karmaşıklık olmadan kolayca ince ayar yapmak ve dağıtmak istiyorsanız lütfen bana ulaşmaktan çekinmeyin, have a look at the NLP Cloud dedicated documentation!
Mark
NLP Cloud'da makine öğrenimi mühendisi