一、分析模型参数,确定可调整的参数
在微调脚本中,有多处参数可以调整以优化训练过程和模型性能。以下是各个参数的详细说明及其可能的调整方向:
可调参数
-
NUM_WORKERS 和 NUM_GPUS_PER_WORKER:
- NUM_WORKERS: 训练使用的工作节点数。默认设置为1,可以根据可用资源增加以进行多节点训练。
- NUM_GPUS_PER_WORKER: 每个节点的GPU数量。根据实际硬件配置调整。
-
MP_SIZE:
模型并行大小。默认设置为1,可以在大模型训练时增加以分布计算负载。 -
MODEL_ARGS:
--max_source_length
: 最大输入长度。根据任务需求调整,例如增加以处理更长的输入。--max_target_length
: 最大输出长度。根据任务需求调整,例如增加以生成更长的输出。--lora_rank
: LoRA的秩。增加或减少该值以控制微调的灵活性和计算量。--layer_range
: 选择进行LoRA微调的层范围。调整以选择不同的层进行微调。--pre_seq_len
: 前缀序列长度。根据任务需要调整以影响模型的上下文理解能力。
-
NCCL 配置:
NCCL_DEBUG
: NCCL的调试信息级别,可以设置为info
、warn
、error
等。NCCL_IB_DISABLE
: 是否禁用NCCL的IB。设置为0表示启用,1表示禁用。NCCL_NET_GDR_LEVEL
: GDR级别。根据硬件配置和性能需求调整。
-
训练和验证数据路径:
train_data
和eval_data
: 训练和验证数据的路径。确保路径正确并包含合适的数据格式。 -
GPT 训练选项:
--train-iters
: 训练迭代次数。根据数据量和任务复杂度调整。--lr-decay-style
: 学习率衰减样式。可选择cosine
、linear
等。--warmup
: 预热比例。调整以控制学习率预热阶段的长度。--save-interval
: 保存间隔。根据训练时间和需要调整保存频率。--eval-interval
: 评估间隔。根据需要调整评估频率。--split
: 数据拆分比例。根据数据集情况调整。--eval-iters
: 评估迭代次数。调整以控制评估数据量。--eval-batch-size
: 评估批次大小。根据显存大小和评估速度调整。--zero-stage
: ZeRO优化阶段。调整以控制显存优化策略。--lr
: 学习率。根据任务和模型收敛速度调整。--batch-size
: 训练批次大小。根据显存大小和数据量调整。--use_lora
: 是否启用LoRA微调。根据需要启用或禁用。
二、调参记录
1.增加迭代次数和评估频率
训练迭代次数和评估频率是控制训练过程和模型评估的关键参数。调整这些参数可以提高模型的最终性能和评估的频率。训练迭代次数(--train-iters)默认值为500,可以将其增加到1000以提高模型的训练时间和最终性能。增加训练迭代次数可以让模型有更多机会学习数据,但会增加训练时间。
评估频率(--eval-interval):默认值为10000,可以将其调整为500以增加评估的频率。增加评估频率可以更频繁地监控模型的性能变化,及时发现训练中的问题。
--train-iters 500 \
--eval-interval 300 \
2.修改微调层范围和LoRA秩:
微调层范围和LoRA秩是控制微调灵活性和计算复杂度的关键参数。调整这些参数可以影响模型的微调效果和计算资源需求。微调层默认层范围可能是0和14,可以将其扩展为更多的层,以提高微调的灵活性和细致程度。
默认秩为10,可以将其调整为8以减少计算复杂度和显存占用。较低的LoRA秩可以减少训练时间和资源需求,但可能会影响模型性能。
--layer_range 0 2 4 6 8 10 12 14 \
--lora_rank 8 \
3.调整批次大小和学习率
批次大小和学习率是影响模型训练过程和性能的关键参数。调整这些参数可以显著改善模型的收敛速度和最终性能。较大的批次大小可以提高训练的稳定性,减少噪声,但需要更多的显存。
学习率默认值为0.0001,可以将其调整为0.00005以使模型训练更稳定。较小的学习率可以减少训练过程中的波动,有助于模型更好地收敛,但可能需要更多的训练迭代。
--batch-size 16 \
--lr 0.00005 \
将以上所有调整策略综合应用到微调脚本中,可以如下进行配置:
#! /bin/bash
NUM_WORKERS=1
NUM_GPUS_PER_WORKER=8
MP_SIZE=1
script_path=$(realpath $0)
script_dir=$(dirname $script_path)
main_dir=$(dirname $script_dir)
MODEL_TYPE="visualglm-6b"
MODEL_ARGS="--max_source_length 64 \
--max_target_length 256 \
--lora_rank 8 \
--layer_range 0 2 4 6 8 10 12 14 \
--pre_seq_len 4"
OPTIONS_NCCL="NCCL_DEBUG=info NCCL_IB_DISABLE=0 NCCL_NET_GDR_LEVEL=2"
HOST_FILE_PATH="hostfile"
HOST_FILE_PATH="hostfile_single"
train_data="./own_data/output.json"
eval_data="./own_data/output.json"
gpt_options=" \
--experiment-name finetune-$MODEL_TYPE \
--model-parallel-size ${MP_SIZE} \
--mode finetune \
--train-iters 1000 \
--resume-dataloader \
$MODEL_ARGS \
--train-data ${train_data} \
--valid-data ${eval_data} \
--distributed-backend nccl \
--lr-decay-style cosine \
--warmup .02 \
--checkpoint-activations \
--save-interval 100 \
--eval-interval 500 \
--save './checkpoints' \
--split 1 \
--eval-iters 10 \
--eval-batch-size 8 \
--zero-stage 1 \
--lr 0.00005 \
--batch-size 16 \
--skip-init \
--fp16 \
--use_lora
"
run_cmd="${OPTIONS_NCCL} deepspeed --master_port 16666 --hostfile ${HOST_FILE_PATH} finetune_visualglm.py ${gpt_options}"
echo ${run_cmd}
eval ${run_cmd}
set +x
三、调参结果
将上述参数进行控制变量法调试,进行模型微调和推理,通过对比同张图片的回答来评估模型的效果。对于同张图片,
微调前的回答:
微调后的回答:
我们数据集的普遍labels:
可以看到,通过更改模型参数,微调后的模型回答的模式更接近数据集的labels,但是它仍缺乏景点识别的准确性,无法正确识别图像中的文字。这一缺陷是由于模型本身的局限性,官方也指出了VisualGLM 6B目前处于v1阶段,图像描述事实性/模型幻觉问题,图像细节信息捕捉不足,以及一些来自语言模型的局限性。尽管模型在训练的各个阶段都尽力确保数据的合规性和准确性,但由于 VisualGLM-6B 模型规模较小,且模型受概率随机性因素影响,无法保证输出内容的准确性,且模型易被误导。
四、局限性
本项目正处于V1版本视觉和语言模型的参数、计算量都较小,我们总结了如下主要存在的改进方向:
- 图像描述事实性/模型幻觉问题。在生成图像长描述的时候,距离图像较远时,语言模型的将占主导,有一定可能根据上下文生成并不存在于图像的内容。
- 属性错配问题。在多物体的场景中,部分物体的某些属性,经常被错误安插到其他物体上。
- 分辨率问题。本项目使用了224*224的分辨率,也是视觉模型中最为常用的尺寸;然而为了进行更细粒度的理解,更大的分辨率和计算量是必要的。
- 由于数据等方面原因,模型暂时不具有中文ocr的能力(英文ocr能力有一些),我们会在后续版本中增加这个能力。