Ce référentiel contient un script pour entraîner Qwen2-VL en utilisant uniquement HuggingFace et Liger-Kernel.
[Réglage fin de Phi3-Vision]
[Llama3.2-Réglage fin de la vision]
[Molmo Finetune]
environment.yaml
vision_model
lors de l'utilisation de LoRA. Installez les packages requis à l'aide de 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
Remarque : vous devez installer flash-attn après avoir installé les autres packages.
Le script nécessite un ensemble de données formaté selon la spécification LLaVA. L'ensemble de données doit être un fichier JSON dans lequel chaque entrée contient des informations sur les conversations et les images. Assurez-vous que les chemins d'accès aux images dans l'ensemble de données correspondent au --image_folder
fourni.
Lors de l'utilisation d'un ensemble de données multi-images, les jetons d'image doivent tous être <image>
et les noms de fichiers image doivent figurer dans une liste. Veuillez consulter l'exemple ci-dessous et suivre le formatage de vos données.
[
{
"id" : " 000000033471 " ,
"image" : " 000000033471.jpg " ,
"conversations" : [
{
"from" : " human " ,
"value" : " <image> 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" : " <image> n <image> n Is the perspective of the camera differnt? "
},
{
"from" : " gpt " ,
"value" : " Yes, It the perspective of the camera is different. "
}
]
}
...
]
[
{
"id" : " sample1 " ,
"video" : " sample1.mp4 " ,
"conversations" : [
{
"from" : " human " ,
"value" : " <video> n What is going on in this video? "
},
{
"from" : " gpt " ,
"value" : " A man is walking down the road. "
}
]
}
...
]
Remarque : Qwen2-VL utilise une vidéo comme séquence d'images.
Remarque : Avec l'ensemble de données mixtes (par exemple, certaines données d'un lot ont des images alors que d'autres n'en ont pas), il ne prend en charge que zéro2.
Pour exécuter le script de formation, utilisez la commande suivante :
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
Ce script affinera le modèle avec le type de modèle 8bit-adamw et fp8. Si vous manquez de VRAM, vous pouvez l'utiliser.
Si vous souhaitez entraîner uniquement le modèle de langage avec LoRA et effectuer une formation complète pour le modèle de vision :
bash scripts/finetune_lora.sh
Si vous souhaitez entraîner à la fois le modèle de langage et le modèle de vision avec LoRA :
bash scripts/finetune_lora_vision.sh
IMPORTANT : si vous souhaitez régler l' embed_token
avec LoRA, vous devez régler lm_head
ensemble. Remarque : Le gel de LLM ne fonctionnerait que sans LoRA (y compris vision_model LoRA).
--deepspeed
(str) : chemin d'accès au fichier de configuration DeepSpeed (par défaut : "scripts/zero2.json").--data_path
(str) : chemin d'accès aux données d'entraînement au format LLaVA (un fichier JSON). (Requis)--image_folder
(str) : chemin d'accès au dossier d'images tel que référencé dans les données d'entraînement au format LLaVA. (Requis)--model_id
(str) : Chemin d'accès au modèle Qwen2-VL. (Requis)--output_dir
(str) : répertoire de sortie pour les points de contrôle du modèle--num_train_epochs
(int) : nombre d'époques d'entraînement (par défaut : 1).--per_device_train_batch_size
(int) : taille du lot d'entraînement par GPU et par étape de transfert.--gradient_accumulation_steps
(int) : étapes d'accumulation de dégradé (par défaut : 4).--freeze_vision_tower
(bool) : Option pour geler vision_model (par défaut : False).--freeze_llm
(bool) : Option pour geler LLM (par défaut : False).--tune_merger
(bool) : Option pour régler le projecteur (par défaut : True).--num_lora_modules
(int) : Nombre de modules cibles à ajouter LoRA (-1 signifie toutes les couches).--vision_lr
(float) : taux d'apprentissage pour vision_model.--merger_lr
(float) : Taux d'apprentissage pour la fusion (projecteur).--learning_rate
(float) : taux d'apprentissage pour le module de langue.--bf16
(bool) : Option pour utiliser bfloat16.--fp16
(bool) : Option pour utiliser fp16.--min_pixels
(int) : option pour les jetons d'entrée minimum.--max_pixles
(int) : OPtion pour le nombre maximum de jetons maximum.--lora_namespan_exclude
(str) : excluez les modules avec des étendues de noms pour ajouter LoRA.--max_seq_length
(int) : longueur maximale de la séquence (par défaut : 32 Ko).--bits
(int) : Bits de quantification (par défaut : 16).--disable_flash_attn2
(bool) : désactiver Flash Attention 2.--report_to
(str) : outil de reporting (choix : 'tensorboard', 'wandb', 'none') (par défaut : 'tensorboard').--logging_dir
(str) : Répertoire de journalisation (par défaut : "./tf-logs").--lora_rank
(int) : rang LoRA (par défaut : 128).--lora_alpha
(int) : LoRA alpha (par défaut : 256).--lora_dropout
(float) : abandon LoRA (par défaut : 0,05).--logging_steps
(int) : étapes de journalisation (par défaut : 1).--dataloader_num_workers
(int) : nombre de travailleurs du chargeur de données (par défaut : 4). Remarque : Le taux d'apprentissage de vision_model
doit être 10 à 5 fois inférieur à celui de language_model
.
Vous pouvez entraîner le modèle à l'aide d'un ensemble de données vidéo. Cependant, Qwen2-VL traite les vidéos comme une séquence d'images, vous devrez donc sélectionner des images spécifiques et les traiter comme plusieurs images pour l'entraînement. Vous pouvez définir les configurations LoRA et les utiliser également pour LoRA.
bash scripts/finetune_video.sh
Remarque : lors d'un entraînement avec une vidéo, il s'agit tout aussi bien de plusieurs images, vous devez donc ajuster les max_pixels
pour une résolution et fps
maximales en fonction de la VRAM disponible.
Si vous manquez de vram, vous pouvez utiliser zero3_offload au lieu de zero3. Cependant, l'utilisation de zero3 est préférable.
bash scripts/merge_lora.sh
Remarque : N'oubliez pas de remplacer les chemins dans finetune.sh
ou finetune_lora.sh
par vos chemins spécifiques. (Également dans merge_lora.sh
lors de l'utilisation de LoRA.)
Le modèle prend en charge une large gamme d'entrées de résolution. Par défaut, il utilise la résolution native pour la saisie. Pour de meilleures performances, il est recommandé d'utiliser des nombres de pixels natifs ou plus élevés, mais cela prend trop de mémoire et de temps de calcul pour les grandes images. Vous pouvez donc ajuster les nombres de pixels. Le modèle divise l'image en token * 28 * 28
afin que vous puissiez simplement modifier la partie token_num dans le script.
Par exemple:
min_pixels = 256 * 28 * 28
max_pixels = 1280 * 28 * 28
Remarque : Pour la vidéo, vous n'êtes pas obligé de définir cette option, vous pouvez simplement définir la résolution maximale.
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
Vous pouvez exécuter unset LD_LIBRARY_PATH
pour cette erreur. Vous pourriez voir ce problème
Remarque : vous devez utiliser le poids fusionné lorsque vous êtes entraîné avec LoRA.
pip install gradio
python -m src.serve.app
--model-path /path/to/merged/weight
Vous pouvez lancer une démo basée sur Gradio avec cette commande. Cela peut également définir d'autres configurations de génération comme repetition_penalty
, temperature
, etc.
Ce projet est sous licence Apache-2.0. Voir le fichier LICENSE pour plus de détails.
Si vous trouvez ce référentiel utile dans votre projet, pensez à donner un et à citer :
@misc { Qwen2-VL-Finetuning ,
author = { Yuwon Lee } ,
title = { Qwen2-VL-Finetune } ,
year = { 2024 } ,
publisher = { GitHub } ,
url = { https://github.com/2U1/Qwen2-VL-Finetune }
}
Ce projet est basé sur