nanoVLM هو أبسط طريقة للبدء بها
تمرين نموذج لغة الرؤية (VLM) الخاص بك باستخدام PyTorch النقي. انها خفيفة الوزن مجموعة الأدوات
والذي يسمح لك بإطلاق تدريب VLM على دفتر ملاحظات colab ذو الطبقة المجانية.

لقد استلهمنا تقنية nanoGPT الخاصة بـ Andrej Karpathy، ونقدم مشروعًا مشابهًا في مجال الرؤية.

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

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

جدول المحتويات:

ليرة تركية؛ د

يمكنك البدء في تدريب نموذج لغة الرؤية باستخدام مجموعة أدوات nanoVLM الخاصة بنا باتباع الخطوات التالية:


git clone https://github.com/huggingface/nanoVLM.git


python train.py

إليك دفتر ملاحظات Colab الذي سيساعدك على بدء تشغيل التدريب دون الحاجة إلى إعداد محلي!

ما هو نموذج لغة الرؤية؟

كما يوحي الاسم، فإن نموذج لغة الرؤية (VLM) هو نموذج متعدد الوسائط يعالج طريقتين: الرؤية والنص. تأخذ هذه النماذج عادةً الصور و/أو النص كمدخلات وتولد النص كمخرجات.

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

تسمية توضيحية للصورة قطتان مستلقيتان على السرير مع وجود أجهزة تحكم عن بعد بالقرب منهما التسمية التوضيحية
كشف الكائنات في الصورة <locxx><locxx><locxx><locxx> كشف الكائنات
قم بتقسيم الكائنات الموجودة في الصورة <segxx><segxx><segxx> التقسيم الدلالي
كم عدد القطط في الصورة؟ 2 الإجابة على الأسئلة البصرية

إذا كنت مهتمًا بمعرفة المزيد عن VLMs، فإننا نوصي بشدة بقراءة أحدث مدونتنا حول هذا الموضوع: نماذج لغة الرؤية (أفضل، أسرع، أقوى)

العمل مع المستودع

“الكلام رخيص، أرني الرمز” – لينوس تورفالدس

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

يوجد أدناه هيكل المجلد الخاص بمستودعنا. لقد قمنا بإزالة ملفات المساعد للإيجاز.

.
├── data
│   ├── collators.py
│   ├── datasets.py
│   └── processors.py
├── generate.py
├── models
│   ├── config.py
│   ├── language_model.py
│   ├── modality_projector.py
│   ├── utils.py
│   ├── vision_language_model.py
│   └── vision_transformer.py
└── train.py

بنيان

.
├── data
│   └── ...
├── models      
│   └── ...
└── train.py     

نحن نصمم نموذج nanoVLM بعد بنيتين معروفتين ومستخدمتين على نطاق واسع. رؤيتنا العمود الفقري (models/vision_transformer.py) هو محول الرؤية القياسي، وبشكل أكثر تحديدًا برنامج تشفير الرؤية SigLIP من Google. يتبع العمود الفقري للغة لدينا بنية Llama 3.

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

رسم تخطيطي للبنية النموذجية
بنية النموذج (المصدر: المؤلفون)

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

رسم تخطيطي لخلط البكسل
تصور خلط البكسل (المصدر: المؤلفون)

جميع الملفات خفيفة الوزن للغاية وموثقة جيدًا. نحن نشجعك بشدة على التحقق منها بشكل فردي للحصول على فهم أفضل لتفاصيل التنفيذ (models/xxx.py)

أثناء التدريب، نستخدم الأوزان الأساسية التالية المدربة مسبقًا:

  1. العمود الفقري للرؤية: google/siglip-base-patch16-224
  2. العمود الفقري للغة: HuggingFaceTB/SmolLM2-135M

يمكن للمرء أيضًا استبدال العمود الفقري بمتغيرات أخرى من SigLIP/SigLIP 2 (للعمود الفقري للرؤية) وSmolLM2 (للعمود الفقري للغة).

تدريب VLM الخاص بك

الآن بعد أن أصبحنا على دراية بالهندسة المعمارية، دعنا نغير المسار ونتحدث عن كيفية تدريب نموذج لغة الرؤية الخاص بك باستخدامه train.py.

.
├── data
│   └── ...
├── models
│   └── ...
└── train.py     

يمكنك البدء بالتدريب باستخدام:

python train.py

هذا البرنامج النصي هو متجرك الشامل لمسار التدريب بأكمله، بما في ذلك:

  • تحميل مجموعة البيانات والمعالجة المسبقة
  • تهيئة النموذج
  • التحسين والتسجيل

إعدادات

قبل أي شيء آخر، يقوم البرنامج النصي بتحميل فئتي التكوين من models/config.py:

  • TrainConfig: معلمات التكوين المفيدة للتدريب، مثل معدلات التعلم، ومسارات نقاط التفتيش، وما إلى ذلك.
  • VLMConfig: معلمات التكوين المستخدمة لتهيئة VLM، مثل الأبعاد المخفية وعدد رؤوس الانتباه وما إلى ذلك.

تحميل البيانات

في قلب خط أنابيب البيانات هو get_dataloaders وظيفة. هو – هي:

  • تحميل مجموعات البيانات عبر Hugging Face’s load_dataset واجهة برمجة التطبيقات.
  • يجمع مجموعات بيانات متعددة ويخلطها عشوائيًا (إذا تم توفيرها).
  • يطبق تقسيم القطار/فال عبر الفهرسة.
  • يلفها في مجموعات بيانات مخصصة (VQADataset, MMStarDataset) والمجمعات (VQACollator, MMStarCollator).

علامة مفيدة هنا data_cutoff_idx، مفيد لتصحيح الأخطاء في مجموعات فرعية صغيرة.

تهيئة النموذج

تم بناء النموذج عن طريق VisionLanguageModel فصل. إذا كنت تستأنف من نقطة تفتيش، فالأمر سهل كما يلي:

from models.vision_language_model import VisionLanguageModel

model = VisionLanguageModel.from_pretrained(model_path)

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

إعداد المُحسِّن: اثنان من LRs

لأن طريقة العرض (MP) حديثًا بينما يتم تدريب العناصر الأساسية مسبقًا، يتم تقسيم المُحسِّن إلى مجموعتين من المعلمات، لكل منهما معدل التعلم الخاص بها:

  • LR أعلى لـ MP
  • LR أصغر لمكدس التشفير/فك التشفير

يضمن هذا التوازن أن يتعلم MP بسرعة مع الحفاظ على المعرفة في العمود الفقري للرؤية واللغة.

حلقة التدريب

هذا الجزء قياسي إلى حد ما ولكنه منظم بشكل مدروس:

  • يتم استخدام الدقة المختلطة مع torch.autocast لتحسين الأداء.
  • يتم تنفيذ جدول معدل التعلم جيب التمام مع الاحماء الخطي عبر get_lr.
  • يتم تسجيل إنتاجية الرمز المميز (الرموز المميزة في الثانية) لكل دفعة لمراقبة الأداء.

كل 250 خطوة (قابلة للتكوين)، يتم تقييم النموذج عند التحقق من الصحة و MMStar مجموعات بيانات الاختبار. إذا تحسنت الدقة، يتم فحص النموذج.

التسجيل والمراقبة

لو log_wandb تم تمكين، احصائيات التدريب مثل batch_loss, val_loss, accuracy، و tokens_per_second
يتم تسجيلها في “الأوزان والتحيزات” للتتبع في الوقت الفعلي.

تتم تسمية عمليات التشغيل تلقائيًا باستخدام بيانات التعريف مثل حجم العينة، وحجم الدُفعة، وعدد العصر، ومعدلات التعلم، والتاريخ، ويتم التعامل معها جميعًا بواسطة المساعد get_run_name.

ادفع إلى المحور

استخدم ما يلي لدفع النموذج المُدرب إلى المركز ليقوم الآخرون بالعثور عليه واختباره:

model.save_pretrained(save_path)

يمكنك دفعهم بسهولة باستخدام:

model.push_to_hub("hub/id")

تشغيل الاستدلال على نموذج تم تدريبه مسبقًا

باستخدام nanoVLM كمجموعة أدوات، قمنا بتدريب نموذج ونشره على Hub. لقد استخدمنا google/siglip-base-patch16-224 و HuggingFaceTB/SmolLM2-135M كالعمود الفقري. تم تدريب النموذج لمدة 6 ساعات تقريبًا على وحدة معالجة الرسومات H100 واحدة على عينات 1.7 مليون تقريبًا من المرجل.

لا يهدف هذا النموذج إلى التنافس مع نماذج SoTA، بل إلى إزالة الغموض عن المكونات وعملية التدريب الخاصة بـ VLMs.

.
├── data
│   └── ...
├── generate.py     
├── models
│   └── ...
└── ...

لنجري الاستدلال على النموذج المُدرب باستخدام generate.py script. يمكنك تشغيل البرنامج النصي للإنشاء باستخدام الأمر التالي:

python generate.py

سيستخدم هذا الوسيطات الافتراضية ويقوم بتشغيل الاستعلام “ما هذا؟” على الصورة assets/image.png.
يمكنك استخدام هذا البرنامج النصي على صورك الخاصة والمطالبات كما يلي:

python generate.py --image path/to/image.png --prompt "You prompt here"

إذا كنت تريد تصور قلب النص، فما عليك سوى هذه السطور:

model = VisionLanguageModel.from_pretrained(source).to(device)
model.eval()

tokenizer = get_tokenizer(model.cfg.lm_tokenizer)
image_processor = get_image_processor(model.cfg.vit_img_size)

template = f"Question: {args.prompt} Answer:"
encoded = tokenizer.batch_encode_plus([template], return_tensors="pt")
tokens = encoded["input_ids"].to(device)

img = Image.open(args.image).convert("RGB")
img_t = image_processor(img).unsqueeze(0).to(device)

print("\nInput:\n ", args.prompt, "\n\nOutputs:")
for i in range(args.generations):
    gen = model.generate(tokens, img_t, max_new_tokens=args.max_new_tokens)
    out = tokenizer.batch_decode(gen, skip_special_tokens=True)[0]
    print(f"  >> Generation {i+1}: {out}")

نقوم بإنشاء النموذج وضبطه على eval. قم بتهيئة برنامج الرمز المميز، الذي يقوم بترميز موجه النص، ومعالج الصور، الذي يستخدم لمعالجة الصور. والخطوة التالية هي معالجة المدخلات والتشغيل model.generate لإنشاء نص الإخراج. وأخيرا، فك تشفير الإخراج باستخدام batch_decode.

صورة اِسْتَدْعَى جيل
صورة قطة ما هذا؟ في الصورة أستطيع رؤية ملاءة السرير ذات اللون الوردي. أستطيع أن أرى قطتين مستلقيتين على ملاءة السرير.
اليوغا ماذا تفعل المرأة؟ هنا في المنتصف تؤدي اليوغا

إذا كنت تريد تشغيل الاستدلال على النموذج المُدرب في واجهة واجهة المستخدم، فإليك مساحة Hugging Face Space التي يمكنك من خلالها التفاعل مع النموذج.

خاتمة

في منشور المدونة هذا، تعرفنا على ماهية VLMs، واستكشفنا خيارات البنية التي تدعم nanoVLM، وقمنا بتفكيك مسارات عمل التدريب والاستدلال بالتفصيل.

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

إذا قمت بتجربته، أو قمت بالبناء عليه، أو كانت لديك أسئلة نود أن نسمعها منك. ترقيع سعيد!

مراجع

  1. GitHub – Huggingface/nanoVLM: أبسط وأسرع مستودع للتدريب/الضبط الدقيق لوحدات VLM صغيرة الحجم.
  2. نماذج لغة الرؤية (أفضل، أسرع، أقوى)
  3. شرح نماذج لغة الرؤية
  4. الغوص في نماذج لغة الرؤية
  5. SmolVLM: إعادة تعريف نماذج الوسائط المتعددة الصغيرة والفعالة

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