Este repositório contém um script para treinar Qwen2-VL usando apenas HuggingFace e Liger-Kernel.
[Ajuste fino do Phi3-Vision]
[Llama3.2-Ajuste fino da visão]
[Molmo Finetune]
environment.yaml
vision_model
ao usar LoRA. Instale os pacotes necessários usando 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: Você deve instalar o flash-attn após instalar os outros pacotes.
O script requer um conjunto de dados formatado de acordo com a especificação LLaVA. O conjunto de dados deve ser um arquivo JSON onde cada entrada contém informações sobre conversas e imagens. Certifique-se de que os caminhos da imagem no conjunto de dados correspondam ao --image_folder
fornecido.
Ao usar um conjunto de dados com várias imagens, todos os tokens de imagem devem ser
e os nomes dos arquivos de imagem devem estar em uma lista. Veja o exemplo abaixo e siga a formatação de seus dados.
[
{
"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 usa um vídeo como uma sequência de imagens.
Nota: Com o conjunto de dados misto (por exemplo, alguns dados em um lote possuem imagens, enquanto outros não), ele suporta apenas zero2.
Para executar o script de treinamento, use o seguinte comando:
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
Este script irá ajustar o modelo com 8bit-adamw e fp8 model dtype. Se você ficar sem vram, poderá usar isso.
Caso queira treinar apenas o modelo de linguagem com LoRA e realizar o treinamento completo para o modelo de visão:
bash scripts/finetune_lora.sh
Se você deseja treinar o modelo de linguagem e o modelo de visão com LoRA:
bash scripts/finetune_lora_vision.sh
IMPORTANTE: Se você deseja ajustar o embed_token
com LoRA, você precisa ajustar lm_head
juntos. Nota: Congelar LLM só funcionaria sem LoRA (incluindo vision_model LoRA).
--deepspeed
(str): Caminho para o arquivo de configuração do DeepSpeed (padrão: "scripts/zero2.json").--data_path
(str): Caminho para os dados de treinamento formatados em LLaVA (um arquivo JSON). (Obrigatório)--image_folder
(str): Caminho para a pasta de imagens conforme referenciado nos dados de treinamento formatados em LLaVA. (Obrigatório)--model_id
(str): Caminho para o modelo Qwen2-VL. (Obrigatório)--output_dir
(str): Diretório de saída para pontos de verificação do modelo--num_train_epochs
(int): Número de épocas de treinamento (padrão: 1).--per_device_train_batch_size
(int): Tamanho do lote de treinamento por GPU por etapa de encaminhamento.--gradient_accumulation_steps
(int): Etapas de acumulação de gradiente (padrão: 4).--freeze_vision_tower
(bool): Opção para congelar vision_model (padrão: False).--freeze_llm
(bool): Opção para congelar LLM (padrão: False).--tune_merger
(bool): Opção para ajustar o projetor (padrão: True).--num_lora_modules
(int): Número de módulos de destino para adicionar LoRA (-1 significa todas as camadas).--vision_lr
(float): Taxa de aprendizagem para vision_model.--merger_lr
(float): Taxa de aprendizagem para fusão (projetor).--learning_rate
(float): Taxa de aprendizagem para módulo de idioma.--bf16
(bool): Opção para usar bfloat16.--fp16
(bool): Opção para usar fp16.--min_pixels
(int): Opção para tokens de entrada mínimos.--max_pixles
(int): Opção para tokens máximos.--lora_namespan_exclude
(str): Exclua módulos com namepans para adicionar LoRA.--max_seq_length
(int): Comprimento máximo da sequência (padrão: 32K).--bits
(int): Bits de quantização (padrão: 16).--disable_flash_attn2
(bool): Desativa a atenção do Flash 2.--report_to
(str): Ferramenta de relatório (opções: 'tensorboard', 'wandb', 'none') (padrão: 'tensorboard').--logging_dir
(str): Diretório de registro (padrão: "./tf-logs").--lora_rank
(int): classificação LoRA (padrão: 128).--lora_alpha
(int): LoRA alfa (padrão: 256).--lora_dropout
(float): eliminação de LoRA (padrão: 0,05).--logging_steps
(int): Etapas de registro (padrão: 1).--dataloader_num_workers
(int): Número de trabalhadores do carregador de dados (padrão: 4). Nota: A taxa de aprendizagem de vision_model
deve ser 10x ~ 5x menor que a de language_model
.
Você pode treinar o modelo usando um conjunto de dados de vídeo. No entanto, o Qwen2-VL processa vídeos como uma sequência de imagens, portanto você precisará selecionar quadros específicos e tratá-los como múltiplas imagens para treinamento. Você pode definir configurações LoRA e usá-las também para LoRA.
bash scripts/finetune_video.sh
Nota: Ao treinar com vídeo, é apenas uma imagem múltipla, portanto você deve ajustar max_pixels
para resolução e fps
máximos com base na VRAM disponível.
Se você ficar sem vram, poderá usar zero3_offload em vez de zero3. No entanto, é preferível usar zero3.
bash scripts/merge_lora.sh
Nota: Lembre-se de substituir os caminhos em finetune.sh
ou finetune_lora.sh
pelos seus caminhos específicos. (Também em merge_lora.sh
ao usar LoRA.)
O modelo suporta uma ampla gama de entradas de resolução. Por padrão, ele usa a resolução nativa para entrada. Para melhor desempenho, é recomendado o uso de números de pixels nativos ou maiores, porém é preciso muita memória e tempo de cálculo para imagens grandes. Então você pode ajustar os números de pixels para isso. O modelo divide a imagem em token * 28 * 28
para que você possa simplesmente alterar a parte token_num no script.
Por exemplo:
min_pixels = 256 * 28 * 28
max_pixels = 1280 * 28 * 28
Nota: Para vídeo, você não precisa definir assim, você pode apenas definir a resolução máxima para ele.
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
Você pode executar unset LD_LIBRARY_PATH
para esse erro. Você pode ver esse problema
Nota: Você deve usar o peso mesclado quando treinar com LoRA.
pip install gradio
python -m src.serve.app
--model-path /path/to/merged/weight
Você pode iniciar a demonstração baseada em gradio com este comando. Isso também pode definir outras configurações de geração, como repetition_penalty
, temperature
etc.
Este projeto está licenciado sob a licença Apache-2.0. Consulte o arquivo LICENSE para obter detalhes.
Se você achar este repositório útil em seu projeto, considere fornecer um e 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 projeto é baseado