InternVL icon indicating copy to clipboard operation
InternVL copied to clipboard

用InternVL2-4B 微调后遇到到灾难性遗忘的问题

Open crmlei opened this issue 1 year ago • 6 comments

Motivation

用InternVL2-4B 在一个700多张图片的数据集上微调一个垂直领域的图片理解任务。微调后发现输入通用prompt,比如“请简单描述图片的内容”或“请问图片中是否有车辆”,但输出基本都是微调数据集上的答案。好像通用的能力消失了。不知道这样的问题有没有解决方案?谢谢。

Related resources

No response

Additional context

No response

crmlei avatar Sep 06 '24 05:09 crmlei

补充说明下,是全参数微调

crmlei avatar Sep 06 '24 05:09 crmlei

这个是正常的现象,如果想要保留模型的通用能力,需要将通用数据集和垂直领域数据集按照一个配比混合起来训练。

czczup avatar Sep 06 '24 07:09 czczup

这个是正常的现象,如果想要保留模型的通用能力,需要将通用数据集和垂直领域数据集按照一个配比混合起来训练。

那么一般这个比例是多少合适?

crmlei avatar Sep 06 '24 10:09 crmlei

通用:垂直领域=1:1或者通用:垂直领域=5:1都可以,侧重点有区别;

如果是通用:垂直领域=1:1,就是比较侧重垂直领域; 如果是通用:垂直领域=5:1,就是在侧重通用的情况下增强垂直领域。

czczup avatar Sep 06 '24 13:09 czczup

这个是正常的现象,如果想要保留模型的通用能力,需要将通用数据集和垂直领域数据集按照一个配比混合起来训练。

如果全量微调带上通用的数据,指标大概会比全量微调提升多少,你们有做过相关的实验吗?

AIFFFENG avatar Sep 08 '24 08:09 AIFFFENG

通用:垂直领域=1:1或者通用:垂直领域=5:1都可以,侧重点有区别;

如果是通用:垂直领域=1:1,就是比较侧重垂直领域; 如果是通用:垂直领域=5:1,就是在侧重通用的情况下增强垂直领域。

@czczup 请问,我全量微调InternVL2-8B(用了sft数据中的一部分VQA数据),最终在ai2diagram_test测试集上评测,发现accuracy下降的很严重(不如pretrained model),怎么训才能达到甚至超过pretrained model?

  • 数据集用了chartqaai2dgeoqa+
  • 2张80G的GPU,并且PER_DEVICE_BATCH_SIZE=1
  • 由于卡数和显存不足,deepspeed用了zero_stage3_config.json
  • 其他超参保持默认
set -x

GPUS=${GPUS:-8}
BATCH_SIZE=${BATCH_SIZE:-128}
PER_DEVICE_BATCH_SIZE=${PER_DEVICE_BATCH_SIZE:-4}
GRADIENT_ACC=$((BATCH_SIZE / PER_DEVICE_BATCH_SIZE / GPUS))


export PYTHONPATH="${PYTHONPATH}:$(pwd)"
export MASTER_PORT=34229
export TF_CPP_MIN_LOG_LEVEL=3
export LAUNCHER=pytorch

OUTPUT_DIR='work_dirs/internvl_chat_v2_0/internvl2_8b_internlm2_7b_dynamic_res_2nd_finetune_full'

if [ ! -d "$OUTPUT_DIR" ]; then
  mkdir -p "$OUTPUT_DIR"
fi

# number of gpus: 8
# batch size per gpu: 4
# gradient accumulation steps: 4
# total batch size: 128
# epoch: 1
torchrun \
  --nnodes=1 \
  --node_rank=0 \
  --master_addr=127.0.0.1 \
  --nproc_per_node=${GPUS} \
  --master_port=${MASTER_PORT} \
  internvl/train/internvl_chat_finetune.py \
  --model_name_or_path "./pretrained/InternVL2-8B" \
  --conv_style "internlm2-chat" \
  --output_dir ${OUTPUT_DIR} \
  --meta_path "reimplement_internvl_1_2_finetune_custom.json" \
  --overwrite_output_dir True \
  --force_image_size 448 \
  --max_dynamic_patch 6 \
  --down_sample_ratio 0.5 \
  --drop_path_rate 0.1 \
  --freeze_llm False \
  --freeze_mlp False \
  --freeze_backbone True \
  --vision_select_layer -1 \
  --dataloader_num_workers 4 \
  --bf16 True \
  --num_train_epochs 1 \
  --per_device_train_batch_size ${PER_DEVICE_BATCH_SIZE} \
  --gradient_accumulation_steps ${GRADIENT_ACC} \
  --evaluation_strategy "no" \
  --save_strategy "steps" \
  --save_steps 200 \
  --save_total_limit 1 \
  --learning_rate 4e-5 \
  --weight_decay 0.01 \
  --warmup_ratio 0.03 \
  --lr_scheduler_type "cosine" \
  --logging_steps 1 \
  --max_seq_length 4096 \
  --do_train True \
  --grad_checkpoint True \
  --group_by_length True \
  --dynamic_image_size True \
  --use_thumbnail True \
  --ps_version 'v2' \
  --deepspeed "zero_stage3_config.json" \
  --report_to "tensorboard" \
  2>&1 | tee -a "${OUTPUT_DIR}/training_log.txt"
  • 训练过程loss如下 image

  • pretrained、ckpt400、ckpt600、ckpt800、last,在ai2diagram_test测试集上accuracy分别是0.8374、0.5126、0.6635、0.6885、0.6881,如下 image image image image image

weweus avatar Sep 12 '24 03:09 weweus

通用:垂直领域=1:1或者通用:垂直领域=5:1都可以,侧重点有区别; 如果是通用:垂直领域=1:1,就是比较侧重垂直领域; 如果是通用:垂直领域=5:1,就是在侧重通用的情况下增强垂直领域。

@czczup 请问,我全量微调InternVL2-8B(用了sft数据中的一部分VQA数据),最终在ai2diagram_test测试集上评测,发现accuracy下降的很严重(不如pretrained model),怎么训才能达到甚至超过pretrained model?

  • 数据集用了chartqaai2dgeoqa+
  • 2张80G的GPU,并且PER_DEVICE_BATCH_SIZE=1
  • 由于卡数和显存不足,deepspeed用了zero_stage3_config.json
  • 其他超参保持默认
set -x

GPUS=${GPUS:-8}
BATCH_SIZE=${BATCH_SIZE:-128}
PER_DEVICE_BATCH_SIZE=${PER_DEVICE_BATCH_SIZE:-4}
GRADIENT_ACC=$((BATCH_SIZE / PER_DEVICE_BATCH_SIZE / GPUS))


export PYTHONPATH="${PYTHONPATH}:$(pwd)"
export MASTER_PORT=34229
export TF_CPP_MIN_LOG_LEVEL=3
export LAUNCHER=pytorch

OUTPUT_DIR='work_dirs/internvl_chat_v2_0/internvl2_8b_internlm2_7b_dynamic_res_2nd_finetune_full'

if [ ! -d "$OUTPUT_DIR" ]; then
  mkdir -p "$OUTPUT_DIR"
fi

# number of gpus: 8
# batch size per gpu: 4
# gradient accumulation steps: 4
# total batch size: 128
# epoch: 1
torchrun \
  --nnodes=1 \
  --node_rank=0 \
  --master_addr=127.0.0.1 \
  --nproc_per_node=${GPUS} \
  --master_port=${MASTER_PORT} \
  internvl/train/internvl_chat_finetune.py \
  --model_name_or_path "./pretrained/InternVL2-8B" \
  --conv_style "internlm2-chat" \
  --output_dir ${OUTPUT_DIR} \
  --meta_path "reimplement_internvl_1_2_finetune_custom.json" \
  --overwrite_output_dir True \
  --force_image_size 448 \
  --max_dynamic_patch 6 \
  --down_sample_ratio 0.5 \
  --drop_path_rate 0.1 \
  --freeze_llm False \
  --freeze_mlp False \
  --freeze_backbone True \
  --vision_select_layer -1 \
  --dataloader_num_workers 4 \
  --bf16 True \
  --num_train_epochs 1 \
  --per_device_train_batch_size ${PER_DEVICE_BATCH_SIZE} \
  --gradient_accumulation_steps ${GRADIENT_ACC} \
  --evaluation_strategy "no" \
  --save_strategy "steps" \
  --save_steps 200 \
  --save_total_limit 1 \
  --learning_rate 4e-5 \
  --weight_decay 0.01 \
  --warmup_ratio 0.03 \
  --lr_scheduler_type "cosine" \
  --logging_steps 1 \
  --max_seq_length 4096 \
  --do_train True \
  --grad_checkpoint True \
  --group_by_length True \
  --dynamic_image_size True \
  --use_thumbnail True \
  --ps_version 'v2' \
  --deepspeed "zero_stage3_config.json" \
  --report_to "tensorboard" \
  2>&1 | tee -a "${OUTPUT_DIR}/training_log.txt"
  • 训练过程loss如下 image
  • pretrained、ckpt400、ckpt600、ckpt800、last,在ai2diagram_test测试集上accuracy分别是0.8374、0.5126、0.6635、0.6885、0.6881,如下 image image image image image

您好,因为您说的这几个数据集在我们训练过程中都有,而且已经训练了2-4个epoch了,您再次使用他们进行微调可能会导致过拟合的,所以只用这几个数据集想要获得更高的点数比较困难。

czczup avatar Nov 23 '24 15:11 czczup

请问8B微调大概要多少显存?

Kazma11 avatar Dec 16 '24 06:12 Kazma11