该存储库包含仅使用 HuggingFace 和 Liger-Kernel 训练 Qwen2-VL 的脚本。
【Phi3-视觉微调】
【Llama3.2-视觉微调】
[莫尔莫微调]
environment.yaml
vision_model
进行微调。使用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 使用视频作为图像序列。
注意:对于混合数据集(例如,批次中的某些数据有图像,而有些数据没有),它仅支持 Zero2。
要运行训练脚本,请使用以下命令:
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
该脚本将使用 8bit-adamw 和 fp8 模型数据类型对模型进行微调。如果你的 vram 用完了,你可以使用这个。
如果您只想使用 LoRA 训练语言模型并对视觉模型进行完整训练:
bash scripts/finetune_lora.sh
如果你想用LoRA同时训练语言模型和视觉模型:
bash scripts/finetune_lora_vision.sh
重要提示:如果您想使用 LoRA 调整embed_token
,则需要一起调整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):每个转发步骤每个 GPU 的训练批量大小。--gradient_accumulation_steps
(int): 梯度累积步数(默认值:4)。--freeze_vision_tower
(bool):冻结vision_model 的选项(默认值:False)。--freeze_llm
(bool): 冻结 LLM 的选项(默认值:False)。--tune_merger
(bool):调整投影仪的选项(默认值:True)。--num_lora_modules
(int): 要添加 LoRA 的目标模块数量(-1 表示所有层)。--vision_lr
(float):vision_model 的学习率。--merger_lr
(float): 合并的学习率(投影仪)。--learning_rate
(float): 语言模块的学习率。--bf16
(bool):使用 bfloat16 的选项。--fp16
(bool):使用 fp16 的选项。--min_pixels
(int):最小输入标记的选项。--max_pixles
(int):最大 maxmimum 标记的选项。--lora_namespan_exclude
(str):排除具有名称跨度的模块以添加 LoRA。--max_seq_length
(int):最大序列长度(默认值:32K)。--bits
(int):量化位数(默认值:16)。--disable_flash_attn2
(bool): 禁用 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 dropout (默认值: 0.05)。--logging_steps
(int):记录步骤(默认值:1)。--dataloader_num_workers
(int):数据加载器工作人员数量(默认值:4)。注意: vision_model
的学习率应比language_model
小 10x ~ 5x。
您可以使用视频数据集训练模型。但是,Qwen2-VL 将视频作为图像序列进行处理,因此您需要选择特定的帧并将它们视为多个图像进行训练。您也可以设置 LoRA 配置并用于 LoRA。
bash scripts/finetune_video.sh
注意:使用视频进行训练时,它就像多图像一样,因此您应该根据可用的 VRAM 调整max_pixels
以获得最大分辨率和fps
。
如果 vram 耗尽,可以使用 Zero3_offload 代替 Zero3。然而,最好使用zero3。
bash scripts/merge_lora.sh
注意:请记住将finetune.sh
或finetune_lora.sh
中的路径替换为您的特定路径。 (使用 LoRA 时也在merge_lora.sh
中。)
该模型支持多种分辨率输入。默认情况下,它使用原始分辨率进行输入。为了获得更好的性能,建议使用本机或更高的像素数,但是对于大图像来说,它需要太多的内存和计算时间。所以你可以调整它的像素数。该模型将图像分割为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 }
}
该项目基于