تم التحديث بتاريخ 23-05-2024: لقد أدخلنا بعض التغييرات على تنفيذ المحولات PaliGemma حول الضبط الدقيق، والتي يمكنك العثور عليها في هذا الكمبيوتر الدفتري.

PaliGemma هي عائلة جديدة من نماذج لغة الرؤية من Google. يمكن لـ PaliGemma التقاط صورة ونص وإخراج النص.

أصدر فريق Google ثلاثة أنواع من النماذج: النماذج المُدربة مسبقًا (pt)، والنماذج المختلطة، والنماذج المضبوطة بدقة (ft)، ولكل منها دقة مختلفة ومتوفرة بدقة متعددة من أجل الراحة.

يتم إصدار جميع النماذج في مستودعات نماذج Hugging Face Hub مع بطاقات النماذج والتراخيص الخاصة بها ولها تكامل المحولات.

ما هو باليجيما؟

PaliGemma (Github) هي عائلة من نماذج لغة الرؤية ذات بنية تتكون من SigLIP-So400m كمشفر للصور وGemma-2B كمفكك ترميز النص. SigLIP هو نموذج متطور يمكنه فهم كل من الصور والنصوص. مثل CLIP، فهو يتكون من برنامج تشفير للصور والنصوص تم تدريبهما معًا. على غرار PaLI-3، تم تدريب نموذج PaliGemma المدمج مسبقًا على بيانات نص الصورة ويمكن بعد ذلك ضبطه بسهولة على المهام النهائية، مثل التسميات التوضيحية أو تجزئة الإحالة. Gemma هو نموذج لوحدة فك التشفير فقط لإنشاء النص. إن الجمع بين برنامج تشفير الصور الخاص بـ SigLIP وGemma باستخدام محول خطي يجعل من PaliGemma نموذجًا قويًا للغة الرؤية.

يأتي إصدار PaliGemma مع ثلاثة أنواع من النماذج:

  • نقاط تفتيش PT: نماذج مدربة مسبقًا يمكن ضبطها بدقة للمهام النهائية.
  • نقاط التفتيش المختلطة: نماذج PT تم ضبطها بدقة على مزيج من المهام. وهي مناسبة للاستدلال للأغراض العامة مع مطالبات النص الحر، ويمكن استخدامها لأغراض البحث فقط.
  • نقاط تفتيش FT: مجموعة من النماذج المضبوطة بدقة، كل منها متخصص في معيار أكاديمي مختلف. وهي متوفرة بقرارات مختلفة وهي مخصصة لأغراض البحث فقط.

تأتي النماذج بثلاثة دقة مختلفة (224x224, 448x448, 896x896) وثلاث دقة مختلفة (bfloat16, float16، و float32). يحتوي كل مستودع على نقاط التحقق الخاصة بقرار ومهمة معينة، مع ثلاث مراجعات لكل من الدقة المتاحة. ال main يحتوي فرع كل مستودع float32 نقاط التفتيش، في حين bfloat16 و float16 تحتوي المراجعات على الدقة المقابلة. توجد مستودعات منفصلة للنماذج المتوافقة مع 🤗 المحولات ومع تطبيق JAX الأصلي.

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

يمكنك العثور على جميع النماذج والمساحات في هذه المجموعة.

قدرات النموذج

PaliGemma هو نموذج لغة رؤية أحادي الاتجاه غير مخصص للاستخدام التحادثي، ويعمل بشكل أفضل عند الضبط الدقيق لحالة استخدام محددة.

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

تستخدم الأمثلة أدناه نقاط التحقق المختلطة لتوضيح بعض الإمكانات.

تعليق الصورة

يمكن لـ PaliGemma التعليق على الصور عند مطالبتك بذلك. يمكنك تجربة مطالبات التسميات التوضيحية المختلفة باستخدام نقاط التحقق المختلطة لمعرفة كيفية استجابتها.

التسمية التوضيحية

الإجابة على الأسئلة البصرية

يمكن لـ PaliGemma الإجابة على الأسئلة المتعلقة بالصورة، ما عليك سوى تمرير سؤالك مع الصورة للقيام بذلك.

VQA

كشف

يمكن لـ PaliGemma اكتشاف الكيانات في الصورة باستخدام detect [entity] اِسْتَدْعَى. سيتم إخراج موقع إحداثيات المربع المحيط في شكل خاص <loc[value]> الرموز، حيث value هو رقم يمثل إحداثيات طبيعية. يتم تمثيل كل اكتشاف بأربعة إحداثيات للموقع بالترتيب y_min، x_min، y_max، x_max، متبوعة بالتصنيف الذي تم اكتشافه في هذا المربع. لتحويل القيم إلى إحداثيات، عليك أولاً قسمة الأرقام على 1024، ثم الضرب y من خلال ارتفاع الصورة و x من خلال عرضه. سيعطيك هذا إحداثيات المربعات المحيطة بالنسبة لحجم الصورة الأصلي.

كشف

في اشارة الى تجزئة التعبير

يمكن لنقاط تفتيش مزيج PaliGemma أيضًا تقسيم الكيانات في الصورة عند منحها segment [entity] اِسْتَدْعَى. وهذا ما يسمى تجزئة التعبير المرجعي، لأننا نشير إلى الكيانات محل الاهتمام باستخدام أوصاف اللغة الطبيعية. الإخراج عبارة عن سلسلة من الرموز المميزة للموقع والتجزئة. تمثل الرموز المميزة للموقع مربعًا محيطًا كما هو موضح أعلاه. يمكن معالجة رموز التجزئة بشكل أكبر لإنشاء أقنعة التجزئة.

التقسيم

فهم الوثيقة

تتمتع نقاط التفتيش المختلطة PaliGemma بقدرات رائعة على فهم المستندات واستدلالها.

com.ocrqa

مزيج المعايير

يمكنك العثور أدناه على نتائج نقاط التفتيش المختلطة.

نموذج دقة MMVP دقة البابا (عشوائية/شعبية/عدائية)
مزيج-224 46.00 88.00 86.63 85.67
مزيج-448 45.33 89.37 88.40 87.47

نقاط تفتيش دقيقة

بالإضافة إلى النماذج المُدربة مسبقًا والمختلطة، أصدرت Google نماذج تم نقلها بالفعل إلى مهام مختلفة. وهي تتوافق مع المعايير الأكاديمية التي يمكن أن يستخدمها مجتمع البحث لمقارنة أداءهم. أدناه، يمكنك العثور على عدد قليل مختارة. تأتي هذه النماذج أيضًا بدقة مختلفة. يمكنك التحقق من بطاقة النموذج لأي نموذج لجميع المقاييس.

تجريبي

كجزء من هذا الإصدار، لدينا عرض توضيحي يتضمن التنفيذ المرجعي في مستودع big_vision ويوفر طريقة سهلة للتلاعب بالنماذج المختلطة.

لدينا أيضًا نسخة تجريبية متوافقة مع Transformers، لإظهار كيفية استخدام واجهة برمجة تطبيقات PaliGemma Transformers.

كيفية تشغيل الاستدلال

للحصول على حق الوصول إلى نماذج PaliGemma، يتعين عليك قبول شروط وأحكام ترخيص Gemma. إذا كان لديك بالفعل إمكانية الوصول إلى عارضات Gemma الأخرى في Hugging Face، فأنت على ما يرام. بخلاف ذلك، يرجى زيارة أي من نماذج PaliGemma، وقبول الترخيص إذا كنت توافق عليه. بمجرد حصولك على حق الوصول، ستحتاج إلى المصادقة إما من خلال تسجيل الدخول إلى Notebook_login أو تسجيل الدخول إلى Huggingface-cli. بعد تسجيل الدخول، سيكون بإمكانك البدء!

يمكنك أيضًا تجربة الاستدلال في دفتر الملاحظات هذا على الفور.

استخدام المحولات

يمكنك استخدام PaliGemmaForConditionalGeneration فئة للاستدلال على أي من النماذج التي تم إصدارها. ما عليك سوى معالجة الموجه والصورة مسبقًا باستخدام المعالج المدمج، ثم تمرير المدخلات المعالجة مسبقًا للإنشاء.

from transformers import AutoProcessor, PaliGemmaForConditionalGeneration

model_id = "google/paligemma-3b-mix-224"
model = PaliGemmaForConditionalGeneration.from_pretrained(model_id)
processor = AutoProcessor.from_pretrained(model_id)

prompt = "What is on the flower?"
image_file = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg?download=true"
raw_image = Image.open(requests.get(image_file, stream=True).raw)
inputs = processor(prompt, raw_image, return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=20)

print(processor.decode(output[0], skip_special_tokens=True)[len(prompt):])

يمكنك أيضًا تحميل النموذج بتنسيق 4 بت كما يلي.

from transformers import BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)
model = PaliGemmaForConditionalGeneration.from_pretrained(
    model_id,
    quantization_config=bnb_config,
    device_map={"":0}
)

بالإضافة إلى تحميل 4 بت (أو 8 بت)، يتيح لك تكامل المحولات الاستفادة من الأدوات الأخرى في نظام Hugging Face البيئي، مثل:

عملية الاستدلال التفصيلية

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

يتم ترميز نص الإدخال بشكل طبيعي. أ <bos> تتم إضافة الرمز المميز في البداية، ورمز مميز إضافي للسطر الجديد (\n) تم إلحاقه. يعد رمز السطر الجديد هذا جزءًا أساسيًا من موجه الإدخال الذي تم تدريب النموذج عليه، لذا فإن إضافته صراحةً تضمن وجوده دائمًا. يُسبق النص المميز أيضًا بعدد ثابت من <image> الرموز. كم عدد؟ يعتمد ذلك على دقة صورة الإدخال وحجم التصحيح الذي يستخدمه نموذج SigLIP. يتم تدريب نماذج PaliGemma مسبقًا على أحد أحجام المربعات الثلاثة (224 × 224، أو 448 × 448، أو 896 × 896)، وتستخدم دائمًا حجم التصحيح 14. وبالتالي، فإن عدد <image> الرموز المميزة للإرفاق هي 256 للنماذج 224 (224/14 * 224/14)، 1024 لموديلات 448، و4096 لموديلات 896.

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

يمر هذا “المطالبة” الكاملة عبر طبقة تضمينات النص في نموذج اللغة ويقوم بإنشاء تضمينات رمزية ذات 2048 بُعدًا لكل رمز مميز.

بالتوازي مع هذا، يتم تغيير حجم الصورة المدخلة، باستخدام إعادة التشكيل المكعبة، إلى حجم الإدخال المطلوب (224 × 224 للنماذج ذات الدقة الأصغر). ثم يمر عبر SigLIP Image Encoder لإنشاء تضمينات للصور بأبعاد 1152 لكل رقعة. هذا هو المكان الذي يلعب فيه جهاز العرض الخطي: يتم عرض تضمينات الصورة للحصول على تمثيلات ذات 2048 بُعدًا لكل رقعة، مثل تلك التي تم الحصول عليها من الرموز النصية. يتم بعد ذلك دمج تضمينات الصورة النهائية مع ملف <image> تضمينات النص، وهذا هو الإدخال النهائي الذي يتم استخدامه لإنشاء نص الانحدار التلقائي. يعمل الجيل بشكل طبيعي في وضع الانحدار الذاتي. يستخدم الانتباه الكامل للإدخال الكامل (image + bos + prompt + \n)، وقناع الانتباه السببي للنص الذي تم إنشاؤه.

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

الكون المثالى

باستخدام big_vision

تم تدريب PaliGemma على قاعدة بيانات Big_vision. تم استخدام نفس قاعدة التعليمات البرمجية بالفعل لتطوير نماذج مثل BiT، وViT الأصلي، وLiT، وCapPa، وSigLIP، وغيرها الكثير.

يحتوي مجلد تكوين المشروع configs/proj/paligemma/ على ملف README.md. يمكن نقل النموذج المُدرب مسبقًا عن طريق تشغيل ملفات التكوين في عمليات النقل/المجلد الفرعي، ويتم الحصول على جميع نتائج النقل الخاصة بنا عن طريق تشغيل التكوينات المتوفرة فيه. إذا كنت تريد نقل النموذج الخاص بك، فافصل عن المثال config Transfers/forkme.py واتبع الإرشادات الموجودة في التعليقات لتكييفه مع حالة الاستخدام الخاصة بك.

يوجد أيضًا كولاب finetune_paligemma.ipynb الذي يدير أ ضبط مبسط الذي يعمل على وقت تشغيل T4 GPU مجاني. للتناسب مع المضيف المحدود وذاكرة وحدة معالجة الرسومات، يقوم الكود الموجود في Colab فقط بتحديث الأوزان في طبقات الانتباه (170 مليون معلمة) ويستخدم SGD (بدلاً من Adam).

باستخدام المحولات

يعد ضبط PaliGemma أمرًا سهلاً للغاية بفضل المحولات. يمكن للمرء أيضًا إجراء ضبط دقيق لـ QLoRA أو LoRA. في هذا المثال، سنقوم بضبط وحدة فك التشفير بشكل موجز، ثم نعرض كيفية التبديل إلى ضبط QLoRA الدقيق. سنقوم بتثبيت أحدث إصدار من مكتبة المحولات.

pip install transformers

تمامًا كما هو الحال في قسم الاستدلال، سنقوم بالمصادقة للوصول إلى النموذج باستخدام notebook_login().

from huggingface_hub import notebook_login
notebook_login()

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

from datasets import load_dataset 
ds = load_dataset('HuggingFaceM4/VQAv2', split="train") 
cols_remove = ["question_type", "answers", "answer_type", "image_id", "question_id"] 
ds = ds.remove_columns(cols_remove)
ds = ds.train_test_split(test_size=0.1)
train_ds = ds["train"]
val_ds = ds["test"]

سنقوم الآن بتحميل المعالج، الذي يحتوي على جزء معالجة الصور والترميز، ومعالجة مجموعة البيانات الخاصة بنا مسبقًا.

from transformers import PaliGemmaProcessor 
model_id = "google/paligemma-3b-pt-224"
processor = PaliGemmaProcessor.from_pretrained(model_id)

سنقوم بإنشاء قالب سريع لتهيئة PaliGemma للإجابة على الأسئلة المرئية. نظرًا لأن الرمز المميز يقوم بتضمين المدخلات، فإننا نحتاج إلى تعيين اللوحات الموجودة في ملصقاتنا على شيء آخر غير رمز اللوحة الموجود في الرمز المميز، بالإضافة إلى رمز الصورة.

import torch
device = "cuda"

image_token = processor.tokenizer.convert_tokens_to_ids("<image>")
def collate_fn(examples):
  texts = ["answer " + example["question"] for example in examples]
  labels= [example['multiple_choice_answer'] for example in examples]
  images = [example["image"].convert("RGB") for example in examples]
  tokens = processor(text=texts, images=images, suffix=labels,
                    return_tensors="pt", padding="longest")

  tokens = tokens.to(torch.bfloat16).to(device)
  return tokens

يمكنك إما تحميل النموذج مباشرة أو تحميل النموذج بـ 4 بت لـ QLoRA. أدناه يمكنك رؤية كيفية تحميل النموذج مباشرة. سنقوم بتحميل النموذج، وتجميد برنامج تشفير الصور وجهاز العرض، وضبط وحدة فك التشفير فقط. إذا كانت صورك ضمن نطاق معين، والتي قد لا تكون موجودة في مجموعة البيانات التي تم تدريب النموذج عليها مسبقًا، فقد ترغب في تخطي تجميد برنامج تشفير الصور.

model = PaliGemmaForConditionalGeneration.from_pretrained(model_id, torch_dtype=torch.bfloat16).to(device)

for param in model.vision_tower.parameters():
    param.requires_grad = False

for param in model.multi_modal_projector.parameters():
    param.requires_grad = True

إذا كنت تريد تحميل النموذج في 4 بت لـ QLoRA، يمكنك إضافة التغييرات التالية أدناه.

from transformers import BitsAndBytesConfig
from peft import get_peft_model, LoraConfig

bnb_config = BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_quant_type="nf4",
        bnb_4bit_compute_type=torch.bfloat16
)

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",
)
model = PaliGemmaForConditionalGeneration.from_pretrained(model_id, quantization_config=bnb_config, device_map={"":0})
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()

سنقوم الآن بتهيئة المدرب ووسائط التدريب. إذا كنت ستقوم بضبط QLoRA، فاضبط المحسن على paged_adamw_8bit بدلاً من.

from transformers import TrainingArguments
args=TrainingArguments(
            num_train_epochs=2,
            remove_unused_columns=False,
            per_device_train_batch_size=16,
            gradient_accumulation_steps=4,
            warmup_steps=2,
            learning_rate=2e-5,
            weight_decay=1e-6,
            adam_beta2=0.999,
            logging_steps=100,
            optim="adamw_hf",
            save_strategy="steps",
            save_steps=1000,
            push_to_hub=True,
            save_total_limit=1,
            bf16=True,
            report_to=["tensorboard"],
            dataloader_pin_memory=False
        )

تهيئة Trainerوتمرير مجموعات البيانات ووظيفة تجميع البيانات ووسائط التدريب والاتصال train() لبدء التدريب.

trainer = Trainer(
        model=model,
        train_dataset=train_ds,
        eval_dataset=val_ds,
        data_collator=collate_fn,
        args=args
        )
trainer.train()

موارد إضافية

نود أن نشكر عمر سانسيفيرو، ولوكاس باير، وشياوهوا تشاي، وماتياس مينديرر على مراجعاتهم الشاملة حول منشور المدونة هذا. نود أن نشكر بيتر روبيشو لمساعدتهم في ضبط التغييرات في المحولات.

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