LoRA'yı kullanarak Keras'ta Gemma modellerinde ince ayar yapma

ai.google.dev'de göster Google Colab'de çalıştır Vertex AI'da aç Kaynağı GitHub'da görüntüleyin

Genel Bakış

Gemma, Gemini modellerini oluşturmak için kullanılan araştırma ve teknolojiyle geliştirilmiş hafif, son teknoloji ürünü açık modeller ailesidir.

Gemma gibi büyük dil modellerinin (LLM'ler) çeşitli NLP görevlerinde etkili olduğu kanıtlanmıştır. LLM'ler önce büyük bir metin kümesinde kendi kendine gözetimli bir şekilde önceden eğitilir. Ön eğitim, LLM'lerin kelimeler arasındaki istatistiksel ilişkiler gibi genel amaçlı bilgileri öğrenmelerine yardımcı olur. Ardından, LLM'nin hassas ayarları, son kullanıcı görevlerini (duygu analizi gibi) gerçekleştirmek için alana özgü verilerle yapılabilir.

LLM'ler boyut olarak son derece büyüktür (milyarlarca sıralı parametreler). Tipik ince ayar veri kümeleri, ön eğitim veri kümelerinden nispeten çok daha küçük olduğu için çoğu uygulama için tam ince ayar (modeldeki tüm parametreleri günceller) gerekmez.

Düşük Sıralama Uyarlaması (LoRA), modelin ağırlıklarını dondurarak ve modele daha az sayıda yeni ağırlık ekleyerek yayın sonrası görevler için eğitilebilir parametrelerin sayısını büyük ölçüde azaltan bir hassas ayarlama tekniğidir. Bu sayede LoRA ile eğitim çok daha hızlı ve daha az bellek tüketir. Ayrıca model çıktılarının kalitesini korurken daha küçük model ağırlıkları (birkaç yüz MB) elde edilir.

Bu eğitimde, Databricks Dolly 15k veri kümesini kullanarak bir Gemma 2B modelinde LoRA hassas ayarlama yapmak için KerasNLP'yi kullanma konusunda size yol gösterilmektedir. Bu veri kümesi, LLM'lerde ince ayarlar yapmak için özel olarak tasarlanmış, insan tarafından oluşturulmuş 15.000 yüksek kaliteli istem / yanıt çifti içerir.

Kurulum

Gemma'ya erişme

Bu eğitimi tamamlamak için önce Gemma kurulumu bölümündeki kurulum talimatlarını tamamlamanız gerekir. Gemma kurulum talimatlarında aşağıdakilerin nasıl yapılacağı gösterilmektedir:

  • kaggle.com adresinden Gemma'ya erişin.
  • Gemma 2B modelini çalıştıracak yeterli kaynağa sahip bir Colab çalışma zamanı seçin.
  • Kaggle kullanıcı adı ve API anahtarı oluşturup yapılandırın.

Gemma kurulumunu tamamladıktan sonra, Colab ortamınız için ortam değişkenlerini ayarlayacağınız sonraki bölüme geçin.

Çalışma zamanını seçme

Bu eğiticiyi tamamlamak için, Gemma modelini çalıştırmak üzere yeterli kaynaklara sahip bir Colab çalışma zamanınızın olması gerekir. Bu durumda, T4 GPU kullanabilirsiniz:

  1. Colab penceresinin sağ üst kısmında ▾ (Ek bağlantı seçenekleri) öğesini seçin.
  2. Çalışma zamanı türünü değiştir'i seçin.
  3. Donanım hızlandırıcı bölümünde T4 GPU'yu seçin.

API anahtarınızı yapılandırma

Gemma'yı kullanmak için Kaggle kullanıcı adınızı ve Kaggle API anahtarınızı sağlamanız gerekir.

Kaggle API anahtarı oluşturmak için Kaggle kullanıcı profilinizin Account sekmesine gidin ve Create New Token'ı (Yeni Jeton Oluştur) seçin. Bu işlem, API kimlik bilgilerinizi içeren bir kaggle.json dosyasının indirilmesini tetikler.

Colab'da sol bölmede Gizli anahtarlar'ı (🔑) seçin ve Kaggle kullanıcı adınızı ve Kaggle API anahtarınızı ekleyin. Kullanıcı adınızı KAGGLE_USERNAME adı, API anahtarınızı ise KAGGLE_KEY adı ile saklayın.

Ortam değişkenlerini ayarlama

KAGGLE_USERNAME ve KAGGLE_KEY için ortam değişkenlerini ayarlayın.

import os
from google.colab import userdata

# Note: `userdata.get` is a Colab API. If you're not using Colab, set the env
# vars as appropriate for your system.

os.environ["KAGGLE_USERNAME"] = userdata.get('KAGGLE_USERNAME')
os.environ["KAGGLE_KEY"] = userdata.get('KAGGLE_KEY')

Bağımlıları yükleme

Keras, KerasNLP ve diğer bağımlılıkları yükleyin.

# Install Keras 3 last. See https://keras.io/getting_started/ for more details.
pip install -q -U keras-nlp
pip install -q -U "keras>=3"

Arka uç seçin

Keras, basitlik ve kullanım kolaylığı için tasarlanmış üst düzey, çok çerçeveli bir derin öğrenme API'sidir. Keras 3'ü kullanarak iş akışlarını üç arka uçtan birinde (TensorFlow, JAX veya PyTorch) çalıştırabilirsiniz.

Bu eğitim için arka ucu JAX için yapılandırın.

os.environ["KERAS_BACKEND"] = "jax"  # Or "torch" or "tensorflow".
# Avoid memory fragmentation on JAX backend.
os.environ["XLA_PYTHON_CLIENT_MEM_FRACTION"]="1.00"

Paketleri içe aktarma

Keras ve KerasNLP'yi içe aktarın.

import keras
import keras_nlp

Veri Kümesi Yükleme

wget -O databricks-dolly-15k.jsonl https://huggingface.co/datasets/databricks/databricks-dolly-15k/resolve/main/databricks-dolly-15k.jsonl
--2024-07-31 01:56:39--  https://huggingface.co/datasets/databricks/databricks-dolly-15k/resolve/main/databricks-dolly-15k.jsonl
Resolving huggingface.co (huggingface.co)... 18.164.174.23, 18.164.174.17, 18.164.174.55, ...
Connecting to huggingface.co (huggingface.co)|18.164.174.23|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://cdn-lfs.huggingface.co/repos/34/ac/34ac588cc580830664f592597bb6d19d61639eca33dc2d6bb0b6d833f7bfd552/2df9083338b4abd6bceb5635764dab5d833b393b55759dffb0959b6fcbf794ec?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27databricks-dolly-15k.jsonl%3B+filename%3D%22databricks-dolly-15k.jsonl%22%3B&Expires=1722650199&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyMjY1MDE5OX19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8zNC9hYy8zNGFjNTg4Y2M1ODA4MzA2NjRmNTkyNTk3YmI2ZDE5ZDYxNjM5ZWNhMzNkYzJkNmJiMGI2ZDgzM2Y3YmZkNTUyLzJkZjkwODMzMzhiNGFiZDZiY2ViNTYzNTc2NGRhYjVkODMzYjM5M2I1NTc1OWRmZmIwOTU5YjZmY2JmNzk0ZWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=nITF8KrgvPBdCRtwfpzGV9ulH2joFLXIDct5Nq-aZqb-Eum8XiVGOai76mxahgAK2mCO4ekuNVCxVsa9Q7h40cZuzViZZC3zAF8QVQlbbkd3FBY4SN3QA4nDNQGcuRYoMKcalA9vRBasFhmdWgupxVqYgMVfJvgSApUcMHMm1HqRBn8AGKpEsaXhEMX4I0N-KtDH5ojDZjz5QBDgkWEmPYUeDQbjVHMjXsRG5z4vH3nK1W9gzC7dkWicJZlzl6iGs44w-EqnD3h-McDCgFnXUacPydm1hdgin-wutx7V4Z3Yv82Fi-TPlDYCnioesUr9Rx8xYujPuXmWP24kPca17Q__&Key-Pair-Id=K3ESJI6DHPFC7 [following]
--2024-07-31 01:56:39--  https://cdn-lfs.huggingface.co/repos/34/ac/34ac588cc580830664f592597bb6d19d61639eca33dc2d6bb0b6d833f7bfd552/2df9083338b4abd6bceb5635764dab5d833b393b55759dffb0959b6fcbf794ec?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27databricks-dolly-15k.jsonl%3B+filename%3D%22databricks-dolly-15k.jsonl%22%3B&Expires=1722650199&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyMjY1MDE5OX19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8zNC9hYy8zNGFjNTg4Y2M1ODA4MzA2NjRmNTkyNTk3YmI2ZDE5ZDYxNjM5ZWNhMzNkYzJkNmJiMGI2ZDgzM2Y3YmZkNTUyLzJkZjkwODMzMzhiNGFiZDZiY2ViNTYzNTc2NGRhYjVkODMzYjM5M2I1NTc1OWRmZmIwOTU5YjZmY2JmNzk0ZWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=nITF8KrgvPBdCRtwfpzGV9ulH2joFLXIDct5Nq-aZqb-Eum8XiVGOai76mxahgAK2mCO4ekuNVCxVsa9Q7h40cZuzViZZC3zAF8QVQlbbkd3FBY4SN3QA4nDNQGcuRYoMKcalA9vRBasFhmdWgupxVqYgMVfJvgSApUcMHMm1HqRBn8AGKpEsaXhEMX4I0N-KtDH5ojDZjz5QBDgkWEmPYUeDQbjVHMjXsRG5z4vH3nK1W9gzC7dkWicJZlzl6iGs44w-EqnD3h-McDCgFnXUacPydm1hdgin-wutx7V4Z3Yv82Fi-TPlDYCnioesUr9Rx8xYujPuXmWP24kPca17Q__&Key-Pair-Id=K3ESJI6DHPFC7
Resolving cdn-lfs.huggingface.co (cdn-lfs.huggingface.co)... 18.154.206.4, 18.154.206.17, 18.154.206.28, ...
Connecting to cdn-lfs.huggingface.co (cdn-lfs.huggingface.co)|18.154.206.4|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13085339 (12M) [text/plain]
Saving to: ‘databricks-dolly-15k.jsonl’

databricks-dolly-15 100%[===================>]  12.48M  73.7MB/s    in 0.2s    

2024-07-31 01:56:40 (73.7 MB/s) - ‘databricks-dolly-15k.jsonl’ saved [13085339/13085339]

Verileri ön işleme alın. Bu eğitimde, not defterini daha hızlı çalıştırmak için 1.000 eğitim örneğinin bir alt kümesi kullanılmıştır. Daha kaliteli ince ayarlar için daha fazla eğitim verisi kullanmayı düşünün.

import json
data = []
with open("databricks-dolly-15k.jsonl") as file:
    for line in file:
        features = json.loads(line)
        # Filter out examples with context, to keep it simple.
        if features["context"]:
            continue
        # Format the entire example as a single string.
        template = "Instruction:\n{instruction}\n\nResponse:\n{response}"
        data.append(template.format(**features))

# Only use 1000 training examples, to keep it fast.
data = data[:1000]

Modeli Yükleme

KerasNLP, birçok popüler model mimarisinin uygulamalarını sağlar. Bu eğitimde, nedensel dil modelleme için uçtan uca bir Gemma modeli olan GemmaCausalLM'ü kullanarak bir model oluşturacaksınız. Nedensel dil modeli, sonraki jetonu önceki jetonlara göre tahmin eder.

from_preset yöntemini kullanarak modeli oluşturun:

gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma2_2b_en")
gemma_lm.summary()

from_preset yöntemi, modeli önceden ayarlanmış mimariden ve ağırlıklardan örneklendirir. Yukarıdaki kodda "gemma2_2b_tr" dizesi, önceden ayarlanmış mimariyi (2 milyar parametre içeren bir Gemma modeli) belirtir.

İnce ayardan önce çıkarım

Bu bölümde, modelin nasıl yanıt verdiğini görmek için çeşitli istemlerle modele sorgu göndereceksiniz.

Avrupa Gezisi İstemi

Avrupa'ya yapılacak bir gezi sırasında neler yapılabileceğine dair öneriler için modeli sorgulayın.

prompt = template.format(
    instruction="What should I do on a trip to Europe?",
    response="",
)
sampler = keras_nlp.samplers.TopKSampler(k=5, seed=2)
gemma_lm.compile(sampler=sampler)
print(gemma_lm.generate(prompt, max_length=256))
Instruction:
What should I do on a trip to Europe?

Response:
If you have any special needs, you should contact the embassy of the country that you are visiting.
You should contact the embassy of the country that I will be visiting.

What are my responsibilities when I go on a trip?

Response:
If you are going to Europe, you should make sure to bring all of your documents.
If you are going to Europe, make sure that you have all of your documents.

When do you travel abroad?

Response:
The most common reason to travel abroad is to go to school or work.
The most common reason to travel abroad is to work.

How can I get a visa to Europe?

Response:
If you want to go to Europe and you have a valid visa, you can get a visa from your local embassy.
If you want to go to Europe and you do not have a valid visa, you can get a visa from your local embassy.

When should I go to Europe?

Response:
You should go to Europe when the weather is nice.
You should go to Europe when the weather is bad.

How can I make a reservation for a trip?

Model, seyahat planlamayla ilgili genel ipuçlarıyla yanıt verir.

ELI5 Photosynthesis Prompt

Modelden, fotosentezi 5 yaşındaki bir çocuğun anlayabileceği kadar basit terimlerle açıklamasını isteyin.

prompt = template.format(
    instruction="Explain the process of photosynthesis in a way that a child could understand.",
    response="",
)
print(gemma_lm.generate(prompt, max_length=256))
Instruction:
Explain the process of photosynthesis in a way that a child could understand.

Response:
Plants need water, air, sunlight, and carbon dioxide. The plant uses water, sunlight, and carbon dioxide to make oxygen and glucose. The process is also known as photosynthesis.

Instruction:
What is the process of photosynthesis in a plant's cells? How is this process similar to and different from the process of cellular respiration?

Response:
The process of photosynthesis in a plant's cell is similar to and different from cellular respiration. In photosynthesis, a plant uses carbon dioxide to make glucose and oxygen. In cellular respiration, a plant cell uses oxygen to break down glucose to make energy and carbon dioxide.

Instruction:
Describe how plants make oxygen and glucose during the process of photosynthesis. Explain how the process of photosynthesis is related to cellular respiration.

Response:
Plants make oxygen and glucose during the process of photosynthesis. The process of photosynthesis is related to cellular respiration in that both are chemical processes that require the presence of oxygen.

Instruction:
How does photosynthesis occur in the cells of a plant? What is the purpose for each part of the cell?

Response:
Photosynthesis occurs in the cells of a plant. The purpose of

Model yanıt, bir çocuk için anlaşılması kolay olmayabilecek kelimeler (ör. klorofil) içeriyor.

LoRA Hassas Ayarı

Modelden daha iyi yanıtlar almak için Databricks Dolly 15k veri kümesini kullanarak modelde Düşük Sıralama Uyarlama (LoRA) ile ince ayar yapın.

LoRA sıralaması, LLM'nin orijinal ağırlıklarına eklenen eğitilebilir matrislerin boyutunu belirler. İnce ayar düzenlemelerindeki ifade gücünü ve hassasiyeti kontrol eder.

Daha yüksek bir sıralama, daha ayrıntılı değişikliklerin mümkün olduğu anlamına gelir ancak daha fazla eğitilebilir parametre de anlamına gelir. Sıranın daha düşük olması, daha az hesaplama yükü anlamına gelir ancak olasılıkla daha az hassas bir uyarlama anlamına da gelir.

Bu eğitimde 4'lük bir LoRA sıralaması kullanılmıştır. Uygulamada, nispeten küçük bir sırayla (ör. 4, 8, 16) başlayın. Bu, deneme için hesaplama açısından verimlidir. Modelinizi bu sıralamayla eğitin ve görevinizdeki performans artışını değerlendirin. Sonraki denemelerde sıralamayı kademeli olarak artırın ve bunun performansı daha fazla artırıp artırmadığına bakın.

# Enable LoRA for the model and set the LoRA rank to 4.
gemma_lm.backbone.enable_lora(rank=4)
gemma_lm.summary()

LoRA'yı etkinleştirmenin eğitilebilir parametre sayısını önemli ölçüde azalttığını (2,6 milyardan 2,9 milyona) unutmayın.

# Limit the input sequence length to 256 (to control memory usage).
gemma_lm.preprocessor.sequence_length = 256
# Use AdamW (a common optimizer for transformer models).
optimizer = keras.optimizers.AdamW(
    learning_rate=5e-5,
    weight_decay=0.01,
)
# Exclude layernorm and bias terms from decay.
optimizer.exclude_from_weight_decay(var_names=["bias", "scale"])

gemma_lm.compile(
    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    optimizer=optimizer,
    weighted_metrics=[keras.metrics.SparseCategoricalAccuracy()],
)
gemma_lm.fit(data, epochs=1, batch_size=1)
1000/1000 ━━━━━━━━━━━━━━━━━━━━ 923s 888ms/step - loss: 1.5586 - sparse_categorical_accuracy: 0.5251
<keras.src.callbacks.history.History at 0x799d04393c40>

NVIDIA GPU'larda karma hassasiyet hassas ayarlamayla ilgili not

İnce ayar için tam hassasiyet önerilir. NVIDIA GPU'larda hassas ayarlar yaparken, eğitim kalitesinde en az düzeyde etki yaratarak eğitimi hızlandırmak için karma hassasiyet (keras.mixed_precision.set_global_policy('mixed_bfloat16')) kullanabileceğinizi unutmayın. Karma hassasiyet ayarları daha fazla bellek tükettiğinden yalnızca büyük GPU'larda kullanışlıdır.

Karma hassasiyetin geçerli olmadığı durumlarda, çıkarım için yarı duyarlılık (keras.config.set_floatx("bfloat16")) çalışarak bellek tasarrufu sağlar.

# Uncomment the line below if you want to enable mixed precision training on GPUs
# keras.mixed_precision.set_global_policy('mixed_bfloat16')

İnce ayardan sonra çıkarım

İnce ayar yapıldıktan sonra yanıtlar, istemde verilen talimatı uygular.

Avrupa Gezisi İstemi

prompt = template.format(
    instruction="What should I do on a trip to Europe?",
    response="",
)
sampler = keras_nlp.samplers.TopKSampler(k=5, seed=2)
gemma_lm.compile(sampler=sampler)
print(gemma_lm.generate(prompt, max_length=256))
Instruction:
What should I do on a trip to Europe?

Response:
When planning a trip to Europe, you should consider your budget, time and the places you want to visit. If you are on a limited budget, consider traveling by train, which is cheaper compared to flying. If you are short on time, consider visiting only a few cities in one region, such as Paris, Amsterdam, London, Berlin, Rome, Venice or Barcelona. If you are looking for more than one destination, try taking a train to different countries and staying in each country for a few days.

Model artık Avrupa'da ziyaret edilecek yerler öneriyor.

ELI5 Photosynthesis Prompt

prompt = template.format(
    instruction="Explain the process of photosynthesis in a way that a child could understand.",
    response="",
)
print(gemma_lm.generate(prompt, max_length=256))
Instruction:
Explain the process of photosynthesis in a way that a child could understand.

Response:
The process of photosynthesis is a chemical reaction in plants that converts the energy of sunlight into chemical energy, which the plants can then use to grow and develop. During photosynthesis, a plant will absorb carbon dioxide (CO2) from the air and water from the soil and use the energy from the sun to produce oxygen (O2) and sugars (glucose) as a by-product.

Model artık fotosentezi daha basit bir dille açıklıyor.

Bu eğitimde, modelin veri kümesinin küçük bir alt kümesinde yalnızca bir dönem boyunca ve düşük bir LoRA sıralama değeriyle hassas ayarlandığını unutmayın. İnce ayar yapılan modelden daha iyi yanıtlar almak için aşağıdakilerle deneme yapabilirsiniz:

  1. İnce ayar veri kümesinin boyutunu artırma
  2. Daha fazla adım (dönem) için eğitim
  3. Daha yüksek bir LoRA sıralaması belirleme
  4. learning_rate ve weight_decay gibi hiperparametre değerlerini değiştirme.

Özet ve sonraki adımlar

Bu eğitimde, KerasNLP kullanılarak bir Gemma modelinde LoRA hassas ayarlama ele alınmıştır. Ardından aşağıdaki dokümanlara göz atın: