此模型文件为毕业设计(论文)基于深度学习技术的流星轨迹识别系统设计中所提出的多模态大语言模型解决流星轨迹识别下游任务的实例。
此模型文件基底为Cog-VLM多模态大语言模型。通过微调了原模型的vit模块来实现对流星观测轨迹识别的下游任务。经过微调之后的模型完全继承了原模型的各种多模态能力,并且具备识别流星轨迹的能力。
原模型仓库:https://github.com/THUDM/CogVLM
模型微调数据集:https://www.kaggle.com/datasets/geyuanzhu/cogvlm-star-images
微调源码:https://github.com/1212wuhu/CogVLM-star
如何运行?
你需要保证拥有一张显存不得少于48G的显卡,并且运行内存不得少于64G(多卡理论上可以,但是笔者由于多卡机器运存不够未能成功)。并且强烈推荐在Linux系统上进行推理工作。
克隆原模型仓库后,运行:
# CUDA >= 11.8
pip install -r requirements.txt
python -m spacy download en_core_web_sm
同时,你需要额外安装apex库:
git clone https://github.com/NVIDIA/apex
cd apex
# if pip >= 23.1 (ref: https://pip.pypa.io/en/stable/news/#v23-1) which supports multiple `--config-settings` with the same key...
pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings "--build-option=--cpp_ext" --config-settings "--build-option=--cuda_ext" ./
# otherwise
pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --global-option="--cpp_ext" --global-option="--cuda_ext" ./
之后,切换到basic_demo/目录下运行:
torchrun --standalone --nnodes=1 --nproc-per-node=1 cli_demo_sat.py --from_pretrained cogagent-chat --version chat --bf16
--nproc-per-node设定为你进行推理的显卡数量,--from_pretrained设定为下载的模型权重,如果你的电脑无法与huggingface建立稳定的通信,请参阅原模型库中readme的“常见问题”部分有关本地分词器的相应说明。
如何微调?
理论上无需微调即可完成本论文提出的下游任务。因此本模块仅为有需要的微调人群所设立,同时用以自身留档。
微调工作请不要参考原模型仓库issue中的有关减少模型层数的讨论与解决方案,减少模型层数会使模型严重丢失原有性能。微调工作需要至少4张单卡显存48G以上的显卡进行调试。请注意,微调工作对单卡显存要求极高,本人猜测原模型作者 提出的可用8张3090显卡进行微调工作他们自己应该完全没有实验过 (或者说本人能力不足,没有找到如何分给多张显卡进行训练的方式,至于4090显卡进行微调那更是不要想了)。
数据集制作
数据集分为两个部分,label和image。本论文采用的数据集制作方法讲图像标题作为了label。数据集具体的读取方法在utils\utils\dataset.py中进行定义:
data = self.data[index]
# img
try:
img = Image.open(data).convert('RGB')
except Exception as e:
print_rank0(e, level=logging.WARNING)
return {}
img_dict = self.process_img(img)
# text
label = data.split('/')[-1].split('.')[0]
uni_key = label
text_dict = self.process_text(label, "CAPTCHA:")
本文中的数据集也已经开源。
模型微调参数
在原模型提供的微调模板中,几乎微调了所有的参数,导致issue中有人提8*A100(80G)都会出现爆显存状况,因此在finetune_demo\finetune_cogagent_demo.py中,可以对
enable = ["encoder", "cross_attention", "linear_proj", 'mlp.vision', 'rotary.vision', 'eoi', 'boi', 'vit']
中包括的各种超参数进行选择,本文选择了vit进行微调。
微调过程
每一个check-point需要近60G的存储空间,因此微调时请注意是否有足够的存储空间预留出来。如果采用多卡进行微调,需要在微调结束之后,使用utils\merge_model.py运行
torchrun --standalone --nnodes=1 --nproc-per-node=4 utils/merge_model.py --version base --bf16 --from_pretrained ./checkpoints/merged_lora_(cogagent/cogvlm490/cogvlm224)
命令进行模型合并,如若直接进行推理会产生令人难以理解的错误。