For the English version of the README, please refer to README.md.
- 数据预处理:相关代码位于
dataprocess
文件夹下,数据集相关代码在dataset
文件夹中。数据预处理主要包括路径合并、QA 数据拼接、特征插入 token 处理等。 - LLM模型:使用 Qwen-7B 作为主体,相关代码在
qwen
文件夹中。通过重写QWenModel
的forward
方法,实现多模态特征的注入。 - 视觉模型:使用
CLIP_VIT
和SIGLIP_VIT
,相关代码在visual
文件夹中,其中还包含其他主干网络。 - VLM模型:相关代码在
model
文件夹下的model.py
文件中。
我们使用了多语言数据集,主要包括 COCO2017 数据集和 AI Challenger 图像中文描述数据集:
- COCO 数据集的标注使用了 LLAVA 的
detail_23k
和complex_reasoning_77k
,这些标注可以有效提升模型的描述丰富度。 - AI Challenger 数据集使用原始标注,并使用固定的 prompt。
在 VLM 中,视觉部分采用已经实现初步语义对齐的 CLIP
或 SIGLIP
模型,并使用两层 MLP 进行特征映射。通过重写 QWenModel
的 forward
方法,将对应的 image
标记替换为视觉特征。
如果你希望替换模型架构,请修改这部分。
AI Challenger | COCO | complex_reasoning_77k.json | detail_23k.json |
---|---|---|---|
AI Challenger | COCO 2017 | complex_reasoning_77k.json | detail_23k.json |
请按照配置文件中的路径存放数据集。当然,路径可以自定义。
请注意,此路径需要与data/保持一致,以便模型进行读取。
数据下载完毕后,使用 process_image.py
进行预处理。
使用 pip install
安装 requirements.txt
:
pip install -r requirements.txt
模型训练采用 image model 冻结的方式进行,LLM 使用 Lora 方式训练以减少训练压力。需要训练的参数包括视觉特征映射层以及 LLM 中 Lora 的参数。由于映射层是未训练的初始化参数,为了平衡模型参数优化速度,这里为映射层设定了比 Lora 部分更大的学习率。
运行根目录的 train.sh
,可自行配置相关参数进行试验。
sh train.sh
通过上述步骤,您可以启动训练过程并进行多模态模型的训练。
模型权重将会保存在--output_dir
中,同样,这个路径可以进行自定义。
CUDA_VISIBLE_DEVICES=0 torchrun --nproc_per_node=1 --master_port=25642 train.py \
--lora_rank 128 \
--lora_dropout 0.10 \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 1 \
--num_train_epochs 2 \
--save_steps 1000 \
--save_total_limit 5 \
--learning_rate 3e-5 \
--seed 42 \
--ddp_find_unused_parameters False \
--feature_proj_lr 1e-4 \
--remove_unused_columns false \
--logging_steps 100 \
--output_dir ./weights/train_V1_5 \
--target_modules "c_attn|w1|w2" \
--image_map /home/u2023111315/Basic-Vision-Language-Model/data/image_map_b.json \
--captions_file /home/u2023111315/Basic-Vision-Language-Model/data/captions_b.json
- CUDA_VISIBLE_DEVICES=0: 使用ID为0的GPU。
- torchrun: PyTorch的分布式训练工具。
- --nproc_per_node=1: 每个节点运行1个进程。
- --master_port=25642: 设置进程间通信端口。
- train.py: 主训练脚本。
- --lora_rank 128: LoRA层的秩为128。
- --lora_dropout 0.10: LoRA层的dropout率为10%。
- --per_device_train_batch_size 4: 每个设备的训练批次大小为4。
- --gradient_accumulation_steps 1: 梯度累积步数为1。
- --num_train_epochs 2: 训练2个epoch。
- --save_steps 1000: 每1000步保存一次模型。
- --save_total_limit 5: 最多保存5个检查点。
- --learning_rate 3e-5: 学习率为3e-5。
- --seed 42: 随机种子为42。
- --ddp_find_unused_parameters False: 禁用DDP查找未使用的参数。
- --feature_proj_lr 1e-4: 特征投影层的学习率为1e-4。
- --remove_unused_columns false: 保留未使用的列。
- --logging_steps 100: 每100步记录一次日志。
- --output_dir ./weights/train_V1_5: 输出目录。
- --target_modules "c_attn|w1|w2": LoRA适配的目标模块。
- --image_map /home/u2023111315/Basic-Vision-Language-Model/data/image_map_b.json: 图像映射文件路径。
- --captions_file /home/u2023111315/Basic-Vision-Language-Model/data/captions_b.json: 标注文件路径。
运行根目录的 test.sh
,可自行配置相关参数进行试验。
sh test.sh
代码会读取文件夹下的图片进行问答。
如果想直接测试模型效果,所提供的预训练权重如下:
SIGLIP_Qwen_epoch19000 | SIGLIP_Qwen_epoch36000 |
---|---|
Model1 | Model2 |
可以直接下载相关文件后进行测试。
python test.py --base_language_model Qwen/Qwen-7B-Chat --base_value_model openai/clip-vit-large-patch14 --model_weights ./weights/train_V1_5/checkpoint-10000/ --image_path ./test_img/1.jpg --prompt "使用语言描述一下图中出现了那些颜色<|extra_0|>"
- --base_language_model Qwen/Qwen-7B-Chat: 指定基础语言模型的路径,这里使用的是
Qwen/Qwen-7B-Chat
。 - --base_value_model openai/clip-vit-large-patch14: 指定基础视觉模型的路径,这里使用的是
openai/clip-vit-large-patch14
。 - --model_weights ./weights/train_V1_5/checkpoint-10000/: 指定模型权重的路径,这里使用的是训练过程中保存的检查点
checkpoint-10000
。 - --image_path ./test_img/1.jpg: 指定输入图像的路径,这里使用的是
./test_img/1.jpg
。 - --prompt "使用语言描述一下图中出现了那些颜色<|extra_0|>": 指定模型的提示语,这里要求模型用语言描述图中出现的颜色。
感谢以下项目的伟大工作🙌:
- https://github.com/WatchTower-Liu/VLM-learning/tree/main
- https://github.com/QwenLM/Qwen
- https://github.com/haotian-liu/LLaVA
如果你有任何疑问或者想法,十分欢迎随时联系我😊:
我会在看到邮件的第一时间回复!