推理脚本解读
#!/bin/bash
############################################################################
########################### Editable Part Begins ###########################
############################################################################
# exp meta information
EXP_NAME=default
PRETRAIN_DATASET=../output/image_captioning_output/res_10k.jsonl
PRETRAIN_DATASET_IMAGE_PATH=../input/pretrain_stage_1_10k
# training args
# pretraining
# make sure PRETRAIN_BATCH_SIZE_PER_GPU * PRETRAIN_GRADIENT_ACCUMULATION_STEPS * num_gpus = 256
# **NOTICE**: the default setting is for 1 GPU
PRETRAIN_BATCH_SIZE_PER_GPU=2
PRETRAIN_GRADIENT_ACCUMULATION_STEPS=128
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 1 GPU
FINETUNE_BATCH_SIZE_PER_GPU=2
FINETUNE_GRADIENT_ACCUMULATION_STEPS=64
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"
############################################################################
############################ Editable Part Ends ############################
############################################################################
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
ORIGINAL_DATASET_ALL=$SCRIPT_DIR/../input/pretrain_stage_1_10k/stage_1.json
# check the global size
PRETRAIN_PASS=`python $SCRIPT_DIR/training/preprocess/check_global_batch_size.py $PRETRAIN_BATCH_SIZE_PER_GPU $PRETRAIN_GRADIENT_ACCUMULATION_STEPS 256`
if [ "$PRETRAIN_PASS" = "False" ]; then
echo "[ERROR] The global batch size of pretraining stage is not 256! Please check and retry."
exit
fi
FINETUNE_PASS=`python $SCRIPT_DIR/training/preprocess/check_global_batch_size.py $FINETUNE_BATCH_SIZE_PER_GPU $FINETUNE_GRADIENT_ACCUMULATION_STEPS 128`
if [ "$FINETUNE_PASS" = "False" ]; then
echo "[ERROR] The global batch size of finetuning stage is not 128! Please check and retry."
exit
fi
# check number of dataset samples
MAX_SAMPLE_NUM=200000
SAMPLED_PRETRAIN_DATASET=$PRETRAIN_DATASET-200k.jsonl
python $SCRIPT_DIR/training/preprocess/check_sample_number.py $PRETRAIN_DATASET $SAMPLED_PRETRAIN_DATASET $MAX_SAMPLE_NUM
# convert dataset from dj format to llava format
PRETRAIN_DATASET_JSON=$SAMPLED_PRETRAIN_DATASET.json
python $SCRIPT_DIR/data-juicer/tools/multimodal/data_juicer_format_to_target_format/dj_to_llava.py $SAMPLED_PRETRAIN_DATASET $PRETRAIN_DATASET_JSON --image_special_token "<__dj__image>" --restore_questions True --original_llava_ds_path $ORIGINAL_DATASET_ALL
# 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."
这个Bash脚本是用于深度学习模型训练和推理的自动化脚本。我将逐行解释脚本的功能:
#!/bin/bash
这是shebang行,告诉系统这个脚本应该用Bash shell来执行。
##############################################################################
########################### Editable Part Begins ###########################
##############################################################################
# exp meta information
EXP_NAME=default
PRETRAIN_DATASET=../output/image_captioning_output/res_10k.jsonl
PRETRAIN_DATASET_IMAGE_PATH=../input/pretrain_stage_1_10k
这些是实验的元信息,包括实验名称和预训练数据集的路径。EXP_NAME
是实验的名称,PRETRAIN_DATASET
是预训练阶段使用的数据集的路径,PRETRAIN_DATASET_IMAGE_PATH
是预训练数据集图像的路径。
# training args
# ...
这部分定义了训练参数,包括预训练和微调的批处理大小、梯度累积步数和数据加载器的工作线程数。
# log and ckpt
LOGGING_STEP=1
CKPT_SAVE_STEPS=100
TOTAL_SAVE_CKPT_LIMIT=1
这些变量设置了日志记录和检查点保存的参数,包括每多少步记录一次日志(LOGGING_STEP
),每多少步保存一次检查点(CKPT_SAVE_STEPS
),以及总共保存多少个检查点(TOTAL_SAVE_CKPT_LIMIT
)。
# inference args
INFER_CUDA_IDX="0"
这部分设置了推理参数,INFER_CUDA_IDX
指定了用于推理的GPU索引。
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
这行代码获取脚本所在的目录并将其存储在变量SCRIPT_DIR
中。
ORIGINAL_DATASET_ALL=$SCRIPT_DIR/../input/pretrain_stage_1_10k/stage_1.json
定义原始数据集的路径。
# check the global size
# ...
这部分脚本检查全局批处理大小是否符合要求。
# check number of dataset samples
# ...
这部分脚本检查数据集中的样本数量是否超过最大值。
# convert dataset from dj format to llava format
# ...
将数据集从dj
格式转换为llava
格式。
# train model
# ...
这部分脚本使用deepspeed
命令来训练模型,包括预训练和微调两个阶段。
mkdir -p $SCRIPT_DIR/../output/training_dirs/$PRETRAIN_NAME
创建预训练模型的输出目录。
deepspeed $SCRIPT_DIR/training/mgm/train/train_mem.py \
# ... arguments ...
使用DeepSpeed训练模型,传递了多个参数,包括模型路径、数据路径、输出目录等。
mkdir -p $SCRIPT_DIR/../output/training_dirs/$FINETUNE_NAME
创建微调模型的输出目录。
deepspeed $SCRIPT_DIR/training/mgm/train/train_mem.py \
# ... arguments ...
使用DeepSpeed进行微调阶段的训练。
# inference for submission
# ...
执行推理脚本,用于评估模型在特定基准测试上的性能。
# copy this script to output
cp $0 $SCRIPT_DIR/../output/train.sh
将当前脚本复制到输出目录,便于记录。
# info
echo "Training and Inference done."
# ...
打印完成信息,包括训练检查点和推理结果的存储位置。
整个脚本是一个自动化流程,用于训练和评估深度学习模型。脚本中的注释提供了足够的信息来理解每部分的作用。用户可以根据需要编辑脚本的"Editable Part"来调整实验设置。