Este repositorio contiene un script para entrenar Qwen2-VL utilizando únicamente HuggingFace y Liger-Kernel.
[Ajuste fino de Phi3-Vision]
[Llama3.2-Ajuste de visión]
[Afinación de Molmo]
environment.yaml
vision_model
mientras usa LoRA. Instale los paquetes necesarios utilizando 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
Nota: Debe instalar flash-attn después de instalar los otros paquetes.
El script requiere un conjunto de datos formateado según la especificación LLaVA. El conjunto de datos debe ser un archivo JSON donde cada entrada contenga información sobre conversaciones e imágenes. Asegúrese de que las rutas de las imágenes en el conjunto de datos coincidan con la --image_folder
proporcionada.
Cuando se utiliza un conjunto de datos de varias imágenes, todos los tokens de imágenes deberían ser
y los nombres de los archivos de imágenes deberían haber estado en una lista. Consulte el ejemplo a continuación y siga formateando sus datos.
[
{
"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. "
}
]
}
...
]
Nota: Qwen2-VL utiliza un vídeo como secuencia de imágenes.
Nota: Con el conjunto de datos mixto (por ejemplo, algunos datos en un lote tienen imágenes mientras que otros no) solo es compatible con zero2.
Para ejecutar el script de entrenamiento, utilice el siguiente comando:
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
Este script ajustará el modelo con el tipo de modelo 8bit-adamw y fp8. Si te quedas sin vram, puedes usar esto.
Si desea entrenar solo el modelo de lenguaje con LoRA y realizar un entrenamiento completo para el modelo de visión:
bash scripts/finetune_lora.sh
Si quieres entrenar tanto el modelo de lenguaje como el modelo de visión con LoRA:
bash scripts/finetune_lora_vision.sh
IMPORTANTE: si desea sintonizar embed_token
con LoRA, debe sintonizar lm_head
juntos. Nota: Congelar LLM solo funcionaría sin LoRA (incluido vision_model LoRA).
--deepspeed
(str): ruta al archivo de configuración de DeepSpeed (predeterminado: "scripts/zero2.json").--data_path
(str): Ruta a los datos de entrenamiento formateados por LLaVA (un archivo JSON). (Requerido)--image_folder
(cadena): ruta a la carpeta de imágenes como se menciona en los datos de entrenamiento formateados por LLaVA. (Requerido)--model_id
(str): Ruta al modelo Qwen2-VL. (Requerido)--output_dir
(str): directorio de salida para puntos de control del modelo--num_train_epochs
(int): Número de épocas de entrenamiento (predeterminado: 1).--per_device_train_batch_size
(int): tamaño del lote de entrenamiento por GPU por paso de reenvío.--gradient_accumulation_steps
(int): pasos de acumulación de gradiente (predeterminado: 4).--freeze_vision_tower
(bool): Opción para congelar vision_model (predeterminado: Falso).--freeze_llm
(bool): Opción para congelar LLM (predeterminado: Falso).--tune_merger
(bool): Opción para sintonizar el proyector (predeterminado: Verdadero).--num_lora_modules
(int): Número de módulos de destino para agregar LoRA (-1 significa todas las capas).--vision_lr
(flotante): tasa de aprendizaje para vision_model.--merger_lr
(flotante): Tasa de aprendizaje para fusión (proyector).--learning_rate
(flotante): Tasa de aprendizaje del módulo de idioma.--bf16
(bool): Opción para usar bfloat16.--fp16
(bool): Opción para usar fp16.--min_pixels
(int): Opción para tokens de entrada mínimos.--max_pixles
(int): OPción para el máximo de tokens mínimos.--lora_namespan_exclude
(str): excluye módulos con intervalos de nombres para agregar LoRA.--max_seq_length
(int): longitud máxima de secuencia (predeterminado: 32K).--bits
(int): bits de cuantificación (predeterminado: 16).--disable_flash_attn2
(bool): Desactiva la atención de Flash 2.--report_to
(str): herramienta de informes (opciones: 'tensorboard', 'wandb', 'none') (predeterminado: 'tensorboard').--logging_dir
(str): directorio de registro (predeterminado: "./tf-logs").--lora_rank
(int): rango LoRA (predeterminado: 128).--lora_alpha
(int): LoRA alfa (predeterminado: 256).--lora_dropout
(flotante): abandono de LoRA (predeterminado: 0,05).--logging_steps
(int): pasos de registro (predeterminado: 1).--dataloader_num_workers
(int): número de trabajadores del cargador de datos (predeterminado: 4). Nota: La tasa de aprendizaje de vision_model
debe ser entre 10 y 5 veces menor que la de language_model
.
Puede entrenar el modelo utilizando un conjunto de datos de video. Sin embargo, Qwen2-VL procesa videos como una secuencia de imágenes, por lo que deberá seleccionar fotogramas específicos y tratarlos como imágenes múltiples para el entrenamiento. Puede configurar configuraciones de LoRA y usarlas también para LoRA.
bash scripts/finetune_video.sh
Nota: Cuando entrenas con video, es solo una imagen múltiple, por lo que debes ajustar max_pixels
para obtener la máxima resolución y fps
según la VRAM disponible.
Si te quedas sin vram, puedes usar zero3_offload en lugar de zero3. Sin embargo, se prefiere usar zero3.
bash scripts/merge_lora.sh
Nota: Recuerde reemplazar las rutas en finetune.sh
o finetune_lora.sh
con sus rutas específicas. (También en merge_lora.sh
cuando se usa LoRA).
El modelo admite una amplia gama de entradas de resolución. De forma predeterminada, utiliza la resolución nativa para la entrada. Para un mejor rendimiento, se recomienda utilizar números de píxeles nativos o mayores; sin embargo, se necesita demasiada memoria y tiempo de cálculo para imágenes grandes. Entonces podrías ajustar los números de píxeles. El modelo divide la imagen en token * 28 * 28
por lo que puedes cambiar la parte token_num en el script.
Por ejemplo:
min_pixels = 256 * 28 * 28
max_pixels = 1280 * 28 * 28
Nota: Para el video, no es necesario configurarlo así, simplemente puede configurar la resolución máxima.
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
Podrías ejecutar unset LD_LIBRARY_PATH
para este error. Podrías ver este problema.
Nota: Debes utilizar el peso combinado cuando entrenes con LoRA.
pip install gradio
python -m src.serve.app
--model-path /path/to/merged/weight
Puede iniciar una demostración basada en gradio con este comando. Esto también puede establecer algunas configuraciones de otra generación como repetition_penalty
, temperature
, etc.
Este proyecto está bajo la licencia Apache-2.0. Consulte el archivo de LICENCIA para obtener más detalles.
Si encuentra útil este repositorio en su proyecto, considere dar un y citar:
@misc { Qwen2-VL-Finetuning ,
author = { Yuwon Lee } ,
title = { Qwen2-VL-Finetune } ,
year = { 2024 } ,
publisher = { GitHub } ,
url = { https://github.com/2U1/Qwen2-VL-Finetune }
}
Este proyecto se basa en