本次作业旨在实践图像描述任务,掌握使用多模态大模型进行 prompt engineering 的技能,同时体验使用 CNN-RNN 等模型架构完成图像到文本的生成任务。通过本次作业,将对多模态学习的基本流程和方法有一个全面的认识。
队长:梁一凡 本硕博2101班U202115210 40%
成员:祝家心 本硕博2101班U202115191 20%
成员:邓 斌 智 实2101班U202115228 30%
成员:黄骏言 智 实2101班U202115263 10%
刘禹良、陈伟
在本研究中,我们使用了阿里云的 Qwen-VL多模态大模型对未标注的图片进行描述生成。主要任务是创造多维度的描述,以增强对视觉内容的理解。我们通过提示工程技术(Prompt Engineering)来优化输入查询(即提示),以提高模型输出的质量和相关性。随后我们使用生成的描述作为标签训练 MiniCPM-V 模型,为了提高训练速度和节省内存,我们以预训练模型为基础分别进行 LoRA 微调和全量微调,采用了 BLEU等五种指标评估生成的图像描述的质量,并对比分析了预训练模型和不同微调技术训练后的模型性能。我们将模型进行了 web 对话部署,并使用自有数据集的图片测试了模型的泛化能力。
要创建并激活虚拟环境,请按照以下步骤操作:
首先,克隆本仓库到你的本地机器:
git clone https://github.com/BRONYA-818/NLP_Final_Project.git
cd NLP_Final_Project
conda env create -f environment.yaml
conda activate MiniCPMV
由于我们的项目可能需要从Huggingface上下载文件,对于连接问题有以下解决方案:
1.科学上网
2.使用镜像站
- 如果是linux,在终端运行
export HF_ENDPOINT="https://hf-mirror.com"
- 如果是windows,在终端运行
set HF_ENDPOINT="https://hf-mirror.com"
- 在.py文件开头增加
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
请将数据集(包括图片文件夹和json标注文件)放置在:
finetune/data
最后该文件夹应该有如下文件:
finetune/
└── data/
├── Train/
│ ├── 0000.jpg
│ ├── 0001.jpg
│ └── ...
├── Val/
│ ├── 2002.jpg
│ └── ...
├── train.json
└── eval.json
json文件的格式应当为:
[
{
"id": "0000",
"image": "data/Train/0000.jpg",
"conversations": [
{
"role": "user",
"content": "<image>\n 请告诉我这张照片记录了一个什么场景,尽可能包含图像中出现的所有物体。"
},
{
"role": "assistant",
"content": "这是一张从车内后视镜拍摄的照片,捕捉到了一个美丽的日落景色和道路上的车辆行驶画面。 在图片左侧可以看到一辆汽车的一部分车身以及车窗反射出的道路景象;右侧则是一个圆形的反光镜(可能是另一辆车或路边设施上的),它反映出道路、天空中的太阳和其他一些细节。 中间部分是开阔的道路,上面有白色的车道线标记,并且可以看见前方有一辆小轿车正在路上行驶。夕阳将整个场景染成了一片金黄色调,营造出了宁静而美好的氛围。"
}
]
}
]
模型权重请在百度网盘链接(提取码:jg59 )下载,位于NLP Final Project/MiniCPM-V/LoRA权重/output,请将output文件夹置于finetune目录下。因文件较大,可以只下载
checkpoint-5000
adapter_model.safetensors
tokenizer_config
trainer_state.json
training_args.bin
adapter_config.json
special_tokens_map.json
tokenizer.model
最后文件组织形式为
finetune/
└── output/
├── checkpoint-5000/
├── adapter_model.safetensors
├── tokenizer_config
├── trainer_state.json
├── training_args.bin
├── adapter_config.json
├── special_tokens_map.json
└── tokenizer.model
训练脚本
finetune/finetune_ds.sh(用于全量微调)
finetune/finetune_lora.sh(用于LoRA微调)
在finetune目录下运行
bash finetune_ds.sh
或
bash finetune_lora.sh
即可复现训练,更多与训练有关的细节请查看finetune/readme.md
,里面介绍了如何准备数据、如何微调数据、运行配置的要求以及其他常见问题。
关于运行配置要求
以下表格展示了在使用 NVIDIA A100 (80GiB) GPU 进行微调时,模型在不同数量的 GPU 下的内存使用情况。微调使用了 DeepSpeed Zero-3 优化、梯度检查点技术以及将优化器和参数内存卸载到 CPU,最大长度设置为 2048,批量大小设置为 1。
微调策略 | GPUs: 2 | GPUs: 4 | GPUs: 8 |
---|---|---|---|
LoRA微调 | 14.4 GiB | 13.6 GiB | 13.1 GiB |
全量微调 | 16.0 GiB | 15.8 GiB | 15.63GiB |
推理请运行:
python inference.py
webUI 对话demo请运行
python web_demo.py
指标计算请运行
python metrics.py
我们所有的推理结果位于:
finetune/
└── output/
├── ds/
│ ├── output.json
│ └── metrics.json
├── lora/
│ ├── output.json
│ └── metrics.json
└── pretrained/
├── output.json
└── metrics.json
运行推理和webUI demo时请注意选择模型类型和模型路径,所有代码运行时也需要注意根据自己的路径进行修改
type="pretrained" #在这里进行修改,以决定使用的模型类型
assert type in ["pretrained", "ds", "lora"]
model_path = 'openbmb/MiniCPM-V-2'#预训练模型路径
# model_path = 'finetune/output/xxx.pt'#全量微调或LoRA微调模型路径
如果受限于硬件条件(推理预计需要8GB显存)无法运行webUI demo,可以联系QQ:879059433,我将在本地服务器上运行并开放链接供测试使用。如果有其他任何问题也可以提issue或者直接QQ联系。 以下是webUI demo的演示图片:
如果你想为本项目做出贡献,请遵循以下步骤:
- Fork 本仓库。
- 创建一个新的分支:
git checkout -b feature-branch
- 提交你的更改:
git commit -am '添加了新功能'
- 推送到分支:
git push origin feature-branch
- 创建一个新的 Pull Request。
本项目使用的许可证类型。详细信息请参见 LICENSE 文件。
感谢以下开源项目的工作,使本项目得以实现:
感谢阿八的歌声陪伴我每一个星夜
洛天依B站官号
关注洛天依喵谢谢喵
点个关注请你吃小笼包
不关注的人都坏坏喵