يحتوي هذا المستودع على برنامج نصي لتدريب Qwen2-VL باستخدام HuggingFace وLiger-Kernel فقط.
[Phi3-Vision Finetuning]
[Llama3.2-ضبط الرؤية]
[مولمو فينتون]
environment.yaml
vision_model
أثناء استخدام LoRA. قم بتثبيت الحزم المطلوبة باستخدام environment.yaml
.
environment.yaml
conda env create -f environment.yaml
conda activate qwen2
pip install qwen-vl-utils
pip install flash-attn==2.5.8 --no-build-isolation
ملحوظة: يجب عليك تثبيت flash-attn بعد تثبيت الحزم الأخرى.
يتطلب البرنامج النصي مجموعة بيانات منسقة وفقًا لمواصفات LLaVA. يجب أن تكون مجموعة البيانات عبارة عن ملف JSON حيث يحتوي كل إدخال على معلومات حول المحادثات والصور. تأكد من أن مسارات الصور في مجموعة البيانات تتطابق مع --image_folder
المقدم.
عند استخدام مجموعة بيانات متعددة الصور، يجب أن تكون جميع الرموز المميزة للصورة
ويجب أن تكون أسماء ملفات الصور موجودة في القائمة. يرجى الاطلاع على المثال أدناه واتباع تنسيق البيانات الخاصة بك.
[
{
"id" : " 000000033471 " ,
"image" : " 000000033471.jpg " ,
"conversations" : [
{
"from" : " human " ,
"value" : " n What are the colors of the bus in the image? "
},
{
"from" : " gpt " ,
"value" : " The bus in the image is white and red. "
},
{
"from" : " human " ,
"value" : " What feature can be seen on the back of the bus? "
},
{
"from" : " gpt " ,
"value" : " The back of the bus features an advertisement. "
},
{
"from" : " human " ,
"value" : " Is the bus driving down the street or pulled off to the side? "
},
{
"from" : " gpt " ,
"value" : " The bus is driving down the street, which is crowded with people and other vehicles. "
}
]
}
...
]
[ { "id" : " 000000033471 " , "image" : [ " 000000033471.jpg " , " 000000033472.jpg " ], "conversations" : [ { "from" : " human " , "value" : "n }, { "from" : " gpt " , "value" : " Yes, It the perspective of the camera is different. " } ] } ... ]n Is the perspective of the camera differnt? "
[
{
"id" : " sample1 " ,
"video" : " sample1.mp4 " ,
"conversations" : [
{
"from" : " human " ,
"value" : "
},
{
"from" : " gpt " ,
"value" : " A man is walking down the road. "
}
]
}
...
]
ملحوظة: يستخدم Qwen2-VL مقطع فيديو كسلسلة من الصور.
ملاحظة: مع مجموعة البيانات المختلطة (على سبيل المثال، تحتوي بعض البيانات في الدفعة على صور والبعض الآخر لا تحتوي عليها) فهي تدعم فقط الصفر 2.
لتشغيل البرنامج النصي للتدريب، استخدم الأمر التالي:
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
سيقوم هذا البرنامج النصي بضبط النموذج باستخدام نموذج dtype 8bit-adamw وfp8. إذا نفدت vram، يمكنك استخدام هذا.
إذا كنت ترغب في تدريب نموذج اللغة فقط باستخدام LoRA وإجراء تدريب كامل لنموذج الرؤية:
bash scripts/finetune_lora.sh
إذا كنت ترغب في تدريب كل من نموذج اللغة ونموذج الرؤية باستخدام LoRA:
bash scripts/finetune_lora_vision.sh
هام: إذا كنت تريد ضبط embed_token
باستخدام LoRA، فأنت بحاجة إلى ضبط lm_head
معًا. ملاحظة: لن يعمل تجميد LLM إلا بدون LoRA (بما في ذلك Vision_model LoRA).
--deepspeed
(str): المسار إلى ملف تكوين DeepSpeed (الافتراضي: "scripts/zero2.json").--data_path
(str): المسار إلى بيانات التدريب المنسقة LLaVA (ملف JSON). (مطلوب)--image_folder
(str): المسار إلى مجلد الصور كما هو مشار إليه في بيانات التدريب المنسقة LLaVA. (مطلوب)--model_id
(str): المسار إلى نموذج Qwen2-VL. (مطلوب)--output_dir
(str): دليل الإخراج لنقاط التفتيش النموذجية--num_train_epochs
(int): عدد فترات التدريب (الافتراضي: 1).--per_device_train_batch_size
(int): حجم دفعة التدريب لكل وحدة معالجة رسومات لكل خطوة إعادة توجيه.--gradient_accumulation_steps
(int): خطوات تراكم التدرج (الافتراضي: 4).--freeze_vision_tower
(bool): خيار تجميد Vision_model (الافتراضي: False).--freeze_llm
(bool): خيار تجميد LLM (الافتراضي: False).--tune_merger
(bool): خيار لضبط جهاز العرض (الافتراضي: صحيح).--num_lora_modules
(int): عدد الوحدات المستهدفة لإضافة LoRA (-1 يعني جميع الطبقات).--vision_lr
(عائم): معدل التعلم لـ Vision_model.--merger_lr
(float): معدل التعلم للاندماج (جهاز العرض).--learning_rate
(float): معدل التعلم لوحدة اللغة.--bf16
(منطقي): خيار لاستخدام bfloat16.--fp16
(منطقي): خيار لاستخدام fp16.--min_pixels
(int): خيار الحد الأدنى من رموز الإدخال.--max_pixles
(int): خيار للحد الأقصى من الرموز المميزة.--lora_namespan_exclude
(str): استبعاد الوحدات ذات نطاقات الأسماء لإضافة LoRA.--max_seq_length
(int): الحد الأقصى لطول التسلسل (الافتراضي: 32 كيلو بايت).--bits
(int): بتات التكميم (الافتراضي: 16).--disable_flash_attn2
(منطقي): تعطيل Flash Attention 2.--report_to
(str): أداة إعداد التقارير (الاختيارات: 'tensorboard'، 'wandb'، 'none') (الافتراضي: 'tensorboard').--logging_dir
(str): دليل التسجيل (الافتراضي: "./tf-logs").--lora_rank
(int): رتبة LoRA (الافتراضي: 128).--lora_alpha
(int): LoRA alpha (الافتراضي: 256).--lora_dropout
(float): تسرب LoRA (الافتراضي: 0.05).--logging_steps
(int): خطوات التسجيل (الافتراضي: 1).--dataloader_num_workers
(int): عدد العاملين في أداة تحميل البيانات (الافتراضي: 4). ملاحظة: يجب أن يكون معدل التعلم vision_model
أصغر بمقدار 10x ~ 5x من language_model
.
يمكنك تدريب النموذج باستخدام مجموعة بيانات الفيديو. ومع ذلك، يقوم Qwen2-VL بمعالجة مقاطع الفيديو كسلسلة من الصور، لذلك ستحتاج إلى تحديد إطارات محددة ومعاملتها كصور متعددة للتدريب. يمكنك ضبط تكوينات LoRA واستخدامها لـ LoRA أيضًا.
bash scripts/finetune_video.sh
ملاحظة: عند التدريب باستخدام الفيديو، فهو مجرد صور متعددة لذا يجب عليك ضبط max_pixels
للحصول على الحد الأقصى من الدقة وعدد fps
بناءً على VRAM المتوفرة.
إذا نفدت vram، يمكنك استخدام Zero3_offload بدلاً من Zero3. ومع ذلك، يفضل استخدام Zero3.
bash scripts/merge_lora.sh
ملاحظة: تذكر استبدال المسارات الموجودة في finetune.sh
أو finetune_lora.sh
بمساراتك المحددة. (أيضًا في merge_lora.sh
عند استخدام LoRA.)
يدعم النموذج مجموعة واسعة من مدخلات الدقة. بشكل افتراضي، يستخدم الدقة الأصلية للإدخال. للحصول على أداء أفضل، يوصى باستخدام أرقام البكسل الأصلية أو الأعلى، إلا أن الأمر يتطلب الكثير من الذاكرة ووقت الحساب بالنسبة للصور الكبيرة. حتى تتمكن من ضبط أرقام البكسل لذلك. يقوم النموذج بتقسيم الصورة إلى token * 28 * 28
بحيث يمكنك فقط تغيير جزء token_num في البرنامج النصي.
على سبيل المثال:
min_pixels = 256 * 28 * 28
max_pixels = 1280 * 28 * 28
ملحوظة: بالنسبة للفيديو، ليس عليك ضبطه على هذا النحو، يمكنك فقط ضبط الحد الأقصى للدقة له.
Could not load library libcudnn_cnn_train.so.8. Error: /usr/local/cuda-12.1/lib/libcudnn_cnn_train.so.8: undefined symbol: _ZN5cudnn3cnn34layerNormFwd_execute_internal_implERKNS_7backend11VariantPackEP11CUstream_stRNS0_18LayerNormFwdParamsERKNS1_20NormForwardOperationEmb, version libcudnn_cnn_infer.so.8
يمكنك تشغيل unset LD_LIBRARY_PATH
لهذا الخطأ. يمكنك رؤية هذه المشكلة
ملاحظة: يجب عليك استخدام الوزن المدمج عند التدريب باستخدام LoRA.
pip install gradio
python -m src.serve.app
--model-path /path/to/merged/weight
يمكنك تشغيل العرض التوضيحي القائم على التدرج باستخدام هذا الأمر. يمكن أن يؤدي هذا أيضًا إلى تعيين بعض تكوينات الجيل الأخرى مثل repetition_penalty
temperature
وما إلى ذلك.
تم ترخيص هذا المشروع بموجب ترخيص Apache-2.0. راجع ملف الترخيص للحصول على التفاصيل.
إذا وجدت هذا المستودع مفيدًا لمشروعك، فيرجى التفكير في إعطاء إشارة واستشهاد:
@misc { Qwen2-VL-Finetuning ,
author = { Yuwon Lee } ,
title = { Qwen2-VL-Finetune } ,
year = { 2024 } ,
publisher = { GitHub } ,
url = { https://github.com/2U1/Qwen2-VL-Finetune }
}
يعتمد هذا المشروع على