#ai夏令营 #datawhale #夏令营
Task1 环境配置,跑通baseline
任务目标
- 赛事环境配置 & 跑通baseline
- 多模态大模型训练脚本
- 熟悉data-juicer
任务流程
服务器租用
在autoDL上租用实例进行训练
- 使用单卡120G内存的实例规格(配置成功的是这一个方案)
- 使用双卡,每张卡80G内存的实例规格(未尝试)
基础环境配置
由于我们选取了社区镜像,所以机子里面的conda是有一套配置好的环境dj
conda activate dj
pip show flash-attn
查看关键的flash-attn包是否存在,输出包的信息即说明环境配置正确
若后续发生错误,则需检查环境完整性
cd ~/autodl-tmp/better_synth_baseline_autoDL
bash install.sh
模型数据集下载
这个就按照步骤在终端写以下指令
cd better_synth_baseline_autoDL
# 下载部分模型和数据
bash download.sh
# 下载BLIP 模型
python download_blip.py
最终查看是否出现报错以及是否存在model文件夹
数据处理
dj-process --config solution/image_captioning.yaml
Data-Juicer的核心是其包含超过80个高度系统化且可复用的算子(operators),这些算子构成了强大的数据处理工具箱,允许用户灵活地对数据进行清洗、生成、分析与转换。值得注意的是,它支持通过配置文件实现流程自动化,减少了手动编码的需求,大大提升了效率。此外,采用高效的并行处理框架,如Aliyun-PAI、Ray、Slurm和CUDA,Data-Juicer优化了资源利用,加快了数据处理速度,降低了计算成本。
项目中通过data-juicer为数据集中的图片生成一段描述,可以通过下图看出来
模型训练 & 推理测评
这一步的shell代码也在train_mgm_2b_stage_1.sh的后半段,可以简单看一下
# train model
PRETRAIN_NAME=MGM-2B-Pretrain-$EXP_NAME
FINETUNE_NAME=MGM-2B-Finetune-$EXP_NAME
AUX_SIZE=768
NUM_TRAIN_EPOCHS=1
PRETRAIN_SAMPLE_NUM=200000
mkdir -p $SCRIPT_DIR/../output/training_dirs/$PRETRAIN_NAME
deepspeed $SCRIPT_DIR/training/mgm/train/train_mem.py \
--deepspeed $SCRIPT_DIR/training/scripts/zero2_offload.json \
--model_name_or_path $SCRIPT_DIR/training/model_zoo/LLM/gemma/gemma-2b-it \
--version gemma \
--data_path $PRETRAIN_DATASET_JSON \
--image_folder $PRETRAIN_DATASET_IMAGE_PATH \
--vision_tower $SCRIPT_DIR/training/model_zoo/OpenAI/clip-vit-large-patch14-336 \
--vision_tower_aux $SCRIPT_DIR/training/model_zoo/OpenAI/openclip-convnext-large-d-320-laion2B-s29B-b131K-ft-soup \
--mm_projector_type mlp2x_gelu \
--tune_mm_mlp_adapter True \
--mm_vision_select_layer -2 \
--mm_use_im_start_end False \
--mm_use_im_patch_token False \
--image_size_aux $AUX_SIZE \
--bf16 True \
--output_dir $SCRIPT_DIR/../output/training_dirs/$PRETRAIN_NAME \
--num_train_epochs $NUM_TRAIN_EPOCHS \
--per_device_train_batch_size $PRETRAIN_BATCH_SIZE_PER_GPU \
--per_device_eval_batch_size 4 \
--gradient_accumulation_steps $PRETRAIN_GRADIENT_ACCUMULATION_STEPS \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps $CKPT_SAVE_STEPS \
--save_total_limit $TOTAL_SAVE_CKPT_LIMIT \
--learning_rate 1e-3 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps $LOGGING_STEP \
--tf32 True \
--model_max_length 2048 \
--gradient_checkpointing True \
--dataloader_num_workers $PRETRAIN_DATALOADER_NUM_WORKERS \
--lazy_preprocess True \
--report_to none \
2>&1 | tee $SCRIPT_DIR/../output/training_dirs/$PRETRAIN_NAME/pretrain.log
mkdir -p $SCRIPT_DIR/../output/training_dirs/$FINETUNE_NAME
deepspeed $SCRIPT_DIR/training/mgm/train/train_mem.py \
--deepspeed $SCRIPT_DIR/training/scripts/zero2_offload.json \
--model_name_or_path $SCRIPT_DIR/training/model_zoo/LLM/gemma/gemma-2b-it \
--version gemma \
--data_path $SCRIPT_DIR/training/data/finetuning_stage_1_12k/mgm_instruction_stage_1_12k.json \
--image_folder $SCRIPT_DIR/training/data/finetuning_stage_1_12k \
--vision_tower $SCRIPT_DIR/training/model_zoo/OpenAI/clip-vit-large-patch14-336 \
--vision_tower_aux $SCRIPT_DIR/training/model_zoo/OpenAI/openclip-convnext-large-d-320-laion2B-s29B-b131K-ft-soup \
--pretrain_mm_mlp_adapter $SCRIPT_DIR/../output/training_dirs/$PRETRAIN_NAME/mm_projector.bin \
--mm_projector_type mlp2x_gelu \
--mm_vision_select_layer -2 \
--mm_use_im_start_end False \
--mm_use_im_patch_token False \
--image_aspect_ratio pad \
--group_by_modality_length True \
--image_size_aux $AUX_SIZE \
--bf16 True \
--output_dir $SCRIPT_DIR/../output/training_dirs/$FINETUNE_NAME \
--num_train_epochs $NUM_TRAIN_EPOCHS \
--per_device_train_batch_size $FINETUNE_BATCH_SIZE_PER_GPU \
--per_device_eval_batch_size 4 \
--gradient_accumulation_steps $FINETUNE_GRADIENT_ACCUMULATION_STEPS \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps $CKPT_SAVE_STEPS \
--save_total_limit $TOTAL_SAVE_CKPT_LIMIT \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps $LOGGING_STEP \
--tf32 True \
--model_max_length 2048 \
--gradient_checkpointing True \
--dataloader_num_workers $FINETUNE_DATALOADER_NUM_WORKERS \
--lazy_preprocess True \
--report_to none \
2>&1 | tee $SCRIPT_DIR/../output/training_dirs/$FINETUNE_NAME/finetuning.log
# inference for submission
# TextVQA
echo "Infer on TextVQA..."
bash $SCRIPT_DIR/eval/textvqa.sh $FINETUNE_NAME $INFER_CUDA_IDX
# MMBench
echo "Infer on MMBench..."
bash $SCRIPT_DIR/eval/mmbench.sh $FINETUNE_NAME "mmbench_dev_20230712" $INFER_CUDA_IDX
# copy this script to output
cp $0 $SCRIPT_DIR/../output/train.sh
# info
echo "Training and Inference done."
echo "Training checkpoints are stored in output/training_dirs/$FINETUNE_NAME."
echo "Inference results are stored in output/eval_results/$FINETUNE_NAME."
$SCRIPT_DIR也就当前我们所在位置,toolkit目录下,所以需要
cd better_synth_baseline_autoDL/toolkit
上面这一段代码其实就是对数据集输入、训练策略、模型、输出位置进行了一个指定,最终我们可以在MGM-2B-Finetune-default和MGM-2B-Pretrain-default获得咱们这一次训练的结果
构建zip文件
- solution文件夹
- 存放评估后的结果文件夹:output/eval_results
- 训练的sh文件:train.sh
- finetuning过程的日志文件:MGM-2B-Finetune-default/finetuning.log
- pretrain过程的日志文件:MGM-2B-Pretrain-default/pretrain.log
代码如下:
# 方案一
cd submit
cp -r /root/autodl-tmp/better_synth_baseline_autoDL/solution .
cp -r /root/autodl-tmp/better_synth_baseline_autoDL/output/eval_results output/
cp -r /root/autodl-tmp/better_synth_baseline_autoDL/output/train.sh output/
cp /root/autodl-tmp/better_synth_baseline_autoDL/output/training_dirs/MGM-2B-Finetune-default/finetuning.log output/training_dirs/MGM-2B-Finetune-image_recaption/
cp /root/autodl-tmp/better_synth_baseline_autoDL/output/training_dirs/MGM-2B-Pretrain-default/pretrain.log output/training_dirs/MGM-2B-Pretrain-image_recaption/
zip -r submit.zip solution output
# 方案二
cd better_synth_baseline_autoDL
zip -r submit.zip solution
zip -r submit.zip output/eval_results
zip submit.zip output/train.sh
zip submit.zip output/training_dirs/MGM-2B-Pretrain-default/pretrain.log
zip submit.zip output/training_dirs/MGM-2B-Finetune-default/finetuning.log