لقد أعلنا مؤخرًا أن Gemma، نموذج لغة الأوزان المفتوحة من Google Deepmind، متاح لمجتمع المصادر المفتوحة الأوسع عبر Hugging Face. إنه متوفر في 2 مليار و7 مليار من أحجام المعلمات مع نكهات مدربة مسبقًا ومضبوطة حسب التعليمات. إنه متوفر على Hugging Face، مدعوم في TGI، ويمكن الوصول إليه بسهولة للنشر والضبط الدقيق في Vertex Model Garden وGoogle Kubernetes Engine.

تصادف أيضًا أن عائلة نماذج Gemma مناسبة تمامًا للنماذج الأولية والتجريب باستخدام مورد GPU المجاني المتاح عبر Colab. في هذا المنشور، سنراجع بإيجاز كيف يمكنك إجراء Parameter Efficient FineTuning (PEFT) لنماذج Gemma، باستخدام Hugging Face Transformers ومكتبات PEFT على وحدات معالجة الرسومات وCloud TPU لأي شخص يريد ضبط نماذج Gemma على مجموعة البيانات الخاصة به.

لماذا بيفت؟

التدريب الافتراضي (الوزن الكامل) لنماذج اللغة، حتى بالنسبة للأحجام المتواضعة، يميل إلى أن يكون كثيف الذاكرة والحوسبة. فمن ناحية، يمكن أن يكون ذلك محظورًا بالنسبة للمستخدمين الذين يعتمدون على منصات الحوسبة المتاحة بشكل مفتوح للتعلم والتجريب، مثل Colab أو Kaggle. من ناحية أخرى، وحتى بالنسبة لمستخدمي المؤسسات، فإن تكلفة تكييف هذه النماذج لمجالات مختلفة تعد مقياسًا مهمًا لتحسينه. يعد PEFT، أو الضبط الدقيق ذو كفاءة المعلمة، أسلوبًا شائعًا لإنجاز ذلك بتكلفة منخفضة.

PyTorch على GPU وTPU

نماذج جيما في معانقة الوجه transformers تم تحسينها لكل من PyTorch وPyTorch/XLA. يتيح ذلك لمستخدمي TPU وGPU الوصول إلى نماذج Gemma وتجربتها حسب الحاجة. جنبًا إلى جنب مع إصدار Gemma، قمنا أيضًا بتحسين تجربة FSDP لـ PyTorch/XLA في Hugging Face. يتيح تكامل FSDP عبر SPMD أيضًا لنماذج Hugging Face الأخرى الاستفادة من تسريع TPU عبر PyTorch/XLA. في هذا المنشور، سنركز على PEFT، وبشكل أكثر تحديدًا على التكيف منخفض الرتبة (LoRA)، لنماذج Gemma. للحصول على مجموعة أكثر شمولاً من تقنيات LoRA، نشجع القراء على مراجعة Scaling Down to Scale Up، من Lialin et al. وهذه المشاركة الممتازة التي كتبها Belkada et al.

التكيف منخفض الرتبة لنماذج اللغات الكبيرة

يعد التكيف ذو الرتبة المنخفضة (LoRA) أحد تقنيات الضبط الدقيق ذات الكفاءة المعلمية لنماذج اللغات الكبيرة (LLMs). فهو يعالج جزءًا فقط من العدد الإجمالي لمعلمات النموذج التي سيتم ضبطها بدقة، عن طريق تجميد النموذج الأصلي وتدريب طبقات المحول فقط التي تتحلل إلى مصفوفات ذات رتبة منخفضة. توفر مكتبة PEFT تجريدًا سهلاً يتيح للمستخدمين تحديد طبقات النموذج حيث يجب تطبيق أوزان المحول.

from peft import LoraConfig

lora_config = LoraConfig(
    r=8,
    target_modules=["q_proj", "o_proj", "k_proj", "v_proj", "gate_proj", "up_proj", "down_proj"],
    task_type="CAUSAL_LM",
)

وفي هذا المقتطف نشير إلى الجميع nn.Linear الطبقات كطبقات الهدف المراد تكييفها.

في المثال التالي، سنستفيد من QLoRA، من Dettmers et al.، من أجل تحديد حجم النموذج الأساسي بدقة 4 بت من أجل بروتوكول ضبط دقيق أكثر كفاءة في الذاكرة. يمكن تحميل النموذج بـ QLoRA عن طريق تثبيت ملف bitsandbytes مكتبة على البيئة الخاصة بك، ومن ثم تمرير ملف BitsAndBytesConfig يعترض على from_pretrained عند تحميل النموذج

قبل أن نبدأ

من أجل الوصول إلى منتجات نموذج جيما، يتعين على المستخدمين قبول نموذج الموافقة. والآن لنبدأ بالتنفيذ.

تعلم الاقتباس

بافتراض أنك قدمت نموذج الموافقة، يمكنك الوصول إلى العناصر النموذجية من Hugging Face Hub.

نبدأ بتنزيل النموذج والرمز المميز. نحن ندرج أيضا أ BitsAndBytesConfig للوزن الكمي فقط.

import torch
import os
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

model_id = "google/gemma-2b"
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)

tokenizer = AutoTokenizer.from_pretrained(model_id, token=os.environ['HF_TOKEN'])
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config, device_map={"":0}, token=os.environ['HF_TOKEN'])

الآن نقوم باختبار النموذج قبل البدء في الضبط باستخدام مقولة مشهورة:

text = "Quote: Imagination is more"
device = "cuda:0"
inputs = tokenizer(text, return_tensors="pt").to(device)

outputs = model.generate(**inputs, max_new_tokens=20)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

يقوم النموذج بإكمال معقول مع بعض الرموز الإضافية:

Quote: Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world.

-Albert Einstein

I

لكن هذه ليست بالضبط الصيغة التي نود أن تكون عليها الإجابة. دعونا نرى ما إذا كان بإمكاننا استخدام الضبط الدقيق لتعليم النموذج لتوليد الإجابة بالتنسيق التالي.

Quote: Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world.

Author: Albert Einstein

للبدء، دعونا نختار مجموعة بيانات علامات الاقتباس الإنجليزية Abirate/english_quotes.

from datasets import load_dataset

data = load_dataset("Abirate/english_quotes")
data = data.map(lambda samples: tokenizer(samples["quote"]), batched=True)

الآن دعونا نضبط هذا النموذج باستخدام تكوين LoRA المذكور أعلاه:

import transformers
from trl import SFTTrainer

def formatting_func(example):
    text = f"Quote: {example['quote'][0]}\nAuthor: {example['author'][0]}<eos>"
    return [text]

trainer = SFTTrainer(
    model=model,
    train_dataset=data["train"],
    args=transformers.TrainingArguments(
        per_device_train_batch_size=1,
        gradient_accumulation_steps=4,
        warmup_steps=2,
        max_steps=10,
        learning_rate=2e-4,
        fp16=True,
        logging_steps=1,
        output_dir="outputs",
        optim="paged_adamw_8bit"
    ),
    peft_config=lora_config,
    formatting_func=formatting_func,
)
trainer.train()

أخيرًا، نحن جاهزون لاختبار النموذج مرة أخرى باستخدام نفس الموجه الذي استخدمناه سابقًا:

text = "Quote: Imagination is"
device = "cuda:0"
inputs = tokenizer(text, return_tensors="pt").to(device)

outputs = model.generate(**inputs, max_new_tokens=20)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

هذه المرة نحصل على الرد بالصيغة التي نحبها:

Quote: Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world.
Author: Albert Einstein

قم بالتسريع باستخدام FSDP عبر SPMD على TPU

كما ذكرنا سابقًا، معانقة الوجه transformers يدعم الآن أحدث تطبيق FSDP لـ PyTorch/XLA. هذا يمكن أن يسرع بشكل كبير من سرعة الضبط الدقيق. لتمكين ذلك، يحتاج المرء فقط إلى إضافة تكوين FSDP إلى ملف transformers.Trainer:

from transformers import DataCollatorForLanguageModeling, Trainer, TrainingArguments


fsdp_config = {
    "fsdp_transformer_layer_cls_to_wrap": ["GemmaDecoderLayer"],
    "xla": True,
    "xla_fsdp_v2": True,
    "xla_fsdp_grad_ckpt": True
}


trainer = Trainer(
    model=model,
    train_dataset=data,
    args=TrainingArguments(
        per_device_train_batch_size=64,  
        num_train_epochs=100,
        max_steps=-1,
        output_dir="./output",
        optim="adafactor",
        logging_steps=1,
        dataloader_drop_last = True,  
        fsdp="full_shard",
        fsdp_config=fsdp_config,
    ),
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
trainer.train()

الخطوات التالية

لقد مررنا بهذا المثال البسيط المقتبس من دفتر الملاحظات المصدر لتوضيح طريقة الضبط الدقيق لـ LoRA المطبقة على نماذج Gemma. يمكن العثور على البرنامج النصي الكامل لـ GPU هنا، ويمكن العثور على البرنامج النصي الكامل لـ TPU هنا. نحن متحمسون بشأن الإمكانيات التي لا نهاية لها للبحث والتعلم بفضل هذه الإضافة الأخيرة إلى نظامنا البيئي مفتوح المصدر. نحن نشجع المستخدمين أيضًا على زيارة وثائق Gemma، بالإضافة إلى مدونة الإطلاق الخاصة بنا للحصول على المزيد من الأمثلة لتدريب نماذج Gemma وصقلها ونشرها.

شاركها.
اترك تعليقاً