官方Baseline学习
再来回顾一下,该问题背景基于 天池Better Synth多模态大模型数据合成挑战赛,详细可以参考该链接。
简而言之,本背景基于图片数据方面,在合成与清洗图文数据中提高多模态大模型的图片理解能力。
基于 Mini-Gemini 模型进行训练,只关注于预训练(模态间对齐)阶段的数据合成与清洗,指令微调阶段为固定数据集。选用 MGM-2B 规模的模型作为模型。
小题外话
官方提供了相应的Baseline:
通过了基本的数据准备、下载,数据的环境配置后(下载需要等待一段时间)。
下面我们基于官方的Baseline,学习一下其中的内容:
数据合成
利用 Data-juicer(详见官方链接),我们可以快速调用blip模型合成数据:
dataset_path: input/pretrain_stage_1_10k/mgm_pretrain_stage_1_10k.jsonl
export_path: output/image_captioning_output/res_10k.jsonl
# np: 1
process:
- image_captioning_mapper:
hf_img2seq: '/root/autodl-tmp/better_synth_baseline_autoDL/models/goldsj/blip2-opt-2___7b' # You can replace this path to a local downloaded HF model
keep_original_sample: false # we only need the recaptioned captions
其中,np设置>1支持并行处理,定义的常数取决于CPU和GPU的配置,process中的 image_captioning_mapper 就是 caption 的相关算子(官方定义)。
训练
我们只看官方可供修改的部分地方:
############################################################################
########################### Editable Part Begins ###########################
############################################################################
# exp meta information
EXP_NAME=default
PRETRAIN_DATASET=../input/pretrain_stage_1/mgm_pretrain_stage_1.jsonl
PRETRAIN_DATASET_IMAGE_PATH=../input/pretrain_stage_1
# training args
# pretraining
# make sure PRETRAIN_BATCH_SIZE_PER_GPU * PRETRAIN_GRADIENT_ACCUMULATION_STEPS * num_gpus = 256
# **NOTICE**: the default setting is for 8 GPU
PRETRAIN_BATCH_SIZE_PER_GPU=8
PRETRAIN_GRADIENT_ACCUMULATION_STEPS=4
PRETRAIN_DATALOADER_NUM_WORKERS=4
# finetuning
# make sure FINETUNE_BATCH_SIZE_PER_GPU * FINETUNE_GRADIENT_ACCUMULATION_STEPS * num_gpus = 128
# **NOTICE**: the default setting is for 8 GPU
FINETUNE_BATCH_SIZE_PER_GPU=8
FINETUNE_GRADIENT_ACCUMULATION_STEPS=2
FINETUNE_DATALOADER_NUM_WORKERS=4
# log and ckpt
LOGGING_STEP=1
CKPT_SAVE_STEPS=100
TOTAL_SAVE_CKPT_LIMIT=1
# inference args
# inference for some benchmarks supports multi-gpus
INFER_CUDA_IDX="0,1,2,3,4,5,6,7"
############################################################################
############################ Editable Part Ends ############################
############################################################################
其中,主要涉及显卡分配、PRETRAIN和FINETUNE的参数的相关配置,这里不再过多赘述。
小题外话(关于服务器中的python文件在导入自定义模块中识别不出mgm文件位置情况)
在官方提供了相应的Baseline中的训练过程中,由于在Linux服务器中的python文件在导入自定义模块中容易出现识别不出mgm文件所在位置,非常容易红温(不是)。查阅资料后,笔者导入模块时使用相对路径导入后还是无效,最后找到如下解决办法:
在train_mem.py文件添加系统路径:
# 完整的绝对路径
import sys
sys.path.append("/root/autodl-tmp/better_synth_baseline_autoDL/toolkit/training/")
from mgm.train.train import train
if __name__ == "__main__":
train(attn_implementation="flash_attention_2")
同时,在两个数据集上推理的适合,也会出现类似错误:
同样,我们只要在此基础上添加类似指定即可:
export PYTHONPATH=“/root/autodl-tmp/better_synth_baseline_autoDL/toolkit/training/:$PYTHONPATH”
以mmbench.sh为例:
#!/bin/bash
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
CKPT=$1
SPLIT=$2
output_dir=$SCRIPT_DIR/../../output/eval_results/$CKPT/mmbench
# 在这里添加
export PYTHONPATH="/root/autodl-tmp/better_synth_baseline_autoDL/toolkit/training/:$PYTHONPATH"
CUDA_VISIBLE_DEVICES=$3 python -m mgm.eval.model_vqa_mmbench \
--model-path $SCRIPT_DIR/../../output/training_dirs/$CKPT \
--question-file $SCRIPT_DIR/../training/data/eval_stage_1/mmbench/$SPLIT.tsv \
--answers-file $output_dir/answers/$SPLIT/$CKPT.jsonl \
--single-pred-prompt \
--temperature 0 \
--conv-mode gemma
mkdir -p $output_dir/answers_upload/$SPLIT
python $SCRIPT_DIR/../training/scripts/convert_mmbench_for_submission.py \
--annotation-file $SCRIPT_DIR/../training/data/eval_stage_1/mmbench/$SPLIT.tsv \
--result-dir $output_dir/answers/$SPLIT \
--upload-dir $output_dir/answers_upload/$SPLIT \
--experiment $CKPT
另一个文件就不再赘述。
最终,将结果按要求打包即可。
关于Data-juicer
官方提供了多种方便的算子(官方称呼),针对提供的数据集和合成数据,可以进一步利用对应算子进行数据筛选和清洗,提高数据质量,增强图文的一致性。
例如(这些操作会延长运行时间,对于算力不足的配置来说比较煎熬)以下:
image_text_matching_filter算子
image_text_similarity_filter算子
phrase_grounding_recall_filter算子、限制图片的长宽大小、描述文字的长短等(可查看官方,这里不再赘述)。
同时,也可以针对文本和图片分别进行处理和筛选。
参考资料
[1].天池Better Synth多模态大模型数据合成挑战赛.
[2]. Data-juicer.
[3].https://modelscope.github.io/data-juicer/_modules/data_juicer/ops/filter/image_text_matching_filter.html#ImageTextMatchingFilter.
[4].https://modelscope.github.io/data-juicer/_modules/data_juicer/ops/filter/image_text_similarity_filter.html.