Dieses Repository enthält ein Skript zum Trainieren von Qwen2-VL, bei dem ausschließlich HuggingFace und Liger-Kernel verwendet werden.
[Phi3-Vision-Feinabstimmung]
[Llama3.2-Vision Feinabstimmung]
[Molmo Finetune]
environment.yaml
vision_model
während Sie LoRA verwenden. Installieren Sie die erforderlichen Pakete mit 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
Hinweis: Sie sollten flash-attn nach der Installation der anderen Pakete installieren.
Das Skript erfordert einen Datensatz, der gemäß der LLaVA-Spezifikation formatiert ist. Der Datensatz sollte eine JSON-Datei sein, in der jeder Eintrag Informationen zu Konversationen und Bildern enthält. Stellen Sie sicher, dass die Bildpfade im Datensatz mit dem angegebenen --image_folder
übereinstimmen.
Wenn Sie einen Datensatz mit mehreren Bildern verwenden, sollten alle Bild-Tokens
sein und die Namen der Bilddateien sollten in einer Liste enthalten sein. Bitte sehen Sie sich das Beispiel unten an und folgen Sie der Formatierung Ihrer Daten.
[
{
"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. "
}
]
}
...
]
Hinweis: Qwen2-VL verwendet ein Video als Bildfolge.
Hinweis: Beim gemischten Datensatz (z. B. haben einige Daten in einem Stapel Bilder, andere nicht) wird dies nur mit Null2 unterstützt.
Um das Trainingsskript auszuführen, verwenden Sie den folgenden Befehl:
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
Dieses Skript optimiert das Modell mit 8bit-adamw und dem fp8-Modell-Dtype. Wenn Ihnen der VRAM ausgeht, können Sie dies verwenden.
Wenn Sie nur das Sprachmodell mit LoRA trainieren und ein vollständiges Training für das Vision-Modell durchführen möchten:
bash scripts/finetune_lora.sh
Wenn Sie sowohl das Sprachmodell als auch das Visionsmodell mit LoRA trainieren möchten:
bash scripts/finetune_lora_vision.sh
WICHTIG: Wenn Sie den embed_token
mit LoRA optimieren möchten, müssen Sie lm_head
gemeinsam optimieren. Hinweis: Das Einfrieren von LLM würde nur ohne LoRA (einschließlich vision_model LoRA) funktionieren.
--deepspeed
(str): Pfad zur DeepSpeed-Konfigurationsdatei (Standard: „scripts/zero2.json“).--data_path
(str): Pfad zu den LLaVA-formatierten Trainingsdaten (einer JSON-Datei). (Erforderlich)--image_folder
(str): Pfad zum Bilderordner, auf den in den LLaVA-formatierten Trainingsdaten verwiesen wird. (Erforderlich)--model_id
(str): Pfad zum Qwen2-VL-Modell. (Erforderlich)--output_dir
(str): Ausgabeverzeichnis für Modellprüfpunkte--num_train_epochs
(int): Anzahl der Trainingsepochen (Standard: 1).--per_device_train_batch_size
(int): Trainingsstapelgröße pro GPU pro Weiterleitungsschritt.--gradient_accumulation_steps
(int): Schritte zur Gradientenakkumulation (Standard: 4).--freeze_vision_tower
(bool): Option zum Einfrieren von vision_model (Standard: False).--freeze_llm
(bool): Option zum Einfrieren von LLM (Standard: False).--tune_merger
(bool): Option zum Optimieren des Projektors (Standard: True).--num_lora_modules
(int): Anzahl der Zielmodule, die LoRA hinzufügen sollen (-1 bedeutet alle Ebenen).--vision_lr
(float): Lernrate für vision_model.--merger_lr
(float): Lernrate für Merger (Projektor).--learning_rate
(float): Lernrate für Sprachmodul.--bf16
(bool): Option zur Verwendung von bfloat16.--fp16
(bool): Option zur Verwendung von fp16.--min_pixels
(int): Option für minimale Eingabetokens.--max_pixles
(int): OPtion für maximal maximale Token.--lora_namespan_exclude
(str): Module mit Namespans ausschließen, um LoRA hinzuzufügen.--max_seq_length
(int): Maximale Sequenzlänge (Standard: 32 KB).--bits
(int): Quantisierungsbits (Standard: 16).--disable_flash_attn2
(bool): Flash Attention 2 deaktivieren.--report_to
(str): Berichtstool (Auswahlmöglichkeiten: „tensorboard“, „wandb“, „none“) (Standard: „tensorboard“).--logging_dir
(str): Protokollierungsverzeichnis (Standard: „./tf-logs“).--lora_rank
(int): LoRA-Rang (Standard: 128).--lora_alpha
(int): LoRA Alpha (Standard: 256).--lora_dropout
(float): LoRA-Dropout (Standard: 0,05).--logging_steps
(int): Protokollierungsschritte (Standard: 1).--dataloader_num_workers
(int): Anzahl der Data Loader-Worker (Standard: 4). Hinweis: Die Lernrate von vision_model
sollte 10x bis 5x kleiner sein als die language_model
.
Sie können das Modell mithilfe eines Videodatensatzes trainieren. Allerdings verarbeitet Qwen2-VL Videos als Bildfolge, sodass Sie bestimmte Bilder auswählen und diese für das Training als mehrere Bilder behandeln müssen. Sie können LoRA-Konfigurationen festlegen und auch für LoRA verwenden.
bash scripts/finetune_video.sh
Hinweis: Beim Training mit Video handelt es sich nur um mehrere Bilder, daher sollten Sie die max_pixels
für maximale Auflösung und fps
basierend auf dem verfügbaren VRAM anpassen.
Wenn Ihnen der VRAM ausgeht, können Sie „zero3_offload“ anstelle von „zero3“ verwenden. Die Verwendung von Null3 wird jedoch bevorzugt.
bash scripts/merge_lora.sh
Hinweis: Denken Sie daran, die Pfade in finetune.sh
oder finetune_lora.sh
durch Ihre spezifischen Pfade zu ersetzen. (Auch in merge_lora.sh
bei Verwendung von LoRA.)
Das Modell unterstützt eine Vielzahl von Auflösungseingängen. Standardmäßig wird für die Eingabe die native Auflösung verwendet. Für eine bessere Leistung wird die Verwendung nativer oder höherer Pixelzahlen empfohlen, allerdings nimmt dies bei großen Bildern zu viel Speicher und Rechenzeit in Anspruch. Man könnte also die Pixelzahlen dafür anpassen. Das Modell teilt das Bild in token * 28 * 28
auf, sodass Sie einfach den Teil token_num im Skript ändern können.
Zum Beispiel:
min_pixels = 256 * 28 * 28
max_pixels = 1280 * 28 * 28
Hinweis: Für Videos müssen Sie diese Einstellung nicht vornehmen, Sie können einfach die maximale Auflösung dafür festlegen.
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
Sie könnten für diesen Fehler unset LD_LIBRARY_PATH
ausführen. Sie könnten dieses Problem sehen
Hinweis: Beim Training mit LoRA sollten Sie das zusammengeführte Gewicht verwenden.
pip install gradio
python -m src.serve.app
--model-path /path/to/merged/weight
Mit diesem Befehl können Sie eine gradiobasierte Demo starten. Dadurch können auch einige andere Generationskonfigurationen wie repetition_penalty
, temperature
usw. festgelegt werden.
Dieses Projekt ist unter der Apache-2.0-Lizenz lizenziert. Einzelheiten finden Sie in der LICENSE-Datei.
Wenn Sie dieses Repository für Ihr Projekt nützlich finden, denken Sie bitte darüber nach, eine zu geben und Folgendes zu zitieren:
@misc { Qwen2-VL-Finetuning ,
author = { Yuwon Lee } ,
title = { Qwen2-VL-Finetune } ,
year = { 2024 } ,
publisher = { GitHub } ,
url = { https://github.com/2U1/Qwen2-VL-Finetune }
}
Dieses Projekt basiert auf