在上周,我们使用了官方提供的数据集来微调VisualGLM 6B模型,使其能够增强对图片“背景”的回答能力,在这周,我们尝试使用自己爬虫得到的数据集,经过处理后形成json文件,用来初步微调该模型,使其关注图片中的景点
一、处理爬虫得到的数据集
-
数据获取:在项目初期我们使用爬虫工具从多个旅游网站和图片资源库获取了包含趵突泉景点图片的数据。这些数据包括图片的存储路径及其相关描述信息,如景点介绍等。
-
数据清洗和预处理:
- 获取到的数据经过去重和清洗,删除了重复或无效的记录,确保数据的高质量。
- 对部分异常数据进行了检查
- 为每条数据新增了prompt列,即问题列
- 处理后的数据存志csv文件,如下:
- 数据格式转换:对图片和描述信息进行了匹配,并将其整理成统一的json格式,便于后续的处理和使用。转换成json文件,内容如下:
[ { "标题": "趵突泉", "问题": "这张图片中的景点是什么?", "图片位置": "20180803105202617.jpg", "景点介绍": "这张图片中的景点是趵突泉。趵突泉北临泺源堂,西傍观澜亭,东架来鹤桥,南有碑刻长廊围合。泉水有三个出水口,水质清冽甘美,水量巨大,最大涌水量为16.2万m3/d。趵突泉三窟鼎立,“泉源上奋,水涌若轮”。“趵突腾空”被古人列为济南八景之一。池中还有众多小泉眼,水泡串串,飘飘悠悠,如泻珠玑。自古至今,趵突泉即是济南的象征。“济南七十泉流乳,趵突独称第一泉。”历来就有“不到趵突泉,空负济南游”之说。" }, { "标题": "漱玉泉", "问题": "这张图片中的景点是什么?", "图片位置": "20180808092037287.jpg", "景点介绍": "这张图片中的景点是漱玉泉。漱玉泉位于趵突泉景区李清照纪念堂前。泉名取自《世说新语•排调》之“漱石枕流”一典。东、西、北面饰石雕栏杆,池北内壁嵌“漱玉泉”石刻,为济南当代书画家关友声1956年书写,字迹遒劲俊秀,落落大方。泉池长4.8米,宽3.1米,深2米。水自池底及池壁不断涌出,形成串串水泡,飘至水面散裂,丝丝作响,池水由南壁漫石溢出,注入石砌水潭中。" }, { "标题": "马跑泉", "问题": "这张图片中的景点是什么?", "图片位置": "20180803104648723.jpg", "景点介绍": "这种图片中的景点是马跑泉。位于趵突泉公园李清照纪念堂东侧假山下,为不规则形,背倚假山耸立,池壁为自然石垒砌,与假山浑如一体,水流成溪,绕假山北侧流入东泺河。泉池四周,垂柳成荫,松柏叠翠,花木扶疏。" } ]
处理后的数据集和图片集便可用来微调该模型。
二、使用数据集进行微调
设置微调参数
1.根据处理好的数据集,设置模型微调的参数,包括学习率、训练轮次等。这里选择官方微调的参数设置,主要关注学习率0.0001、迭代轮次train-iters、使用Lora微调的模型层等。
2.以下是使用爬虫数据集对VisualGLM 6B模型进行微调的完整脚本。该脚本配置了多个微调参数,并使用"deepspeed"进行分布式训练。
MODEL_ARGS="--max_source_length 64 \
--max_target_length 256 \
--lora_rank 10 \
--layer_range 0 14 \
--pre_seq_len 4"
gpt_options=" \
--experiment-name finetune-$MODEL_TYPE \
--model-parallel-size ${MP_SIZE} \
--mode finetune \
--train-iters 300 \
--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 300 \
--eval-interval 10000 \
--save "./checkpoints" \
--split 1 \
--eval-iters 10 \
--eval-batch-size 4 \
--zero-stage 1 \
--lr 0.0001 \
--batch-size 4 \
--skip-init \
--fp16 \
--use_lora
"
说明
NUM_WORKERS 和 NUM_GPUS_PER_WORKER: 配置了训练使用的工作节点数和每个节点的GPU数量。
MP_SIZE: 模型并行大小,配置为1。
MODEL_TYPE: 设置为"visualglm-6b"。
MODEL_ARGS: 定义了模型的微调参数,包括最大源长度、最大目标长度、LoRA rank、层范围和前缀序列长度。
OPTIONS_NCCL: NCCL配置选项,用于优化分布式训练。
HOST_FILE_PATH: 指定主机文件路径,支持单个主机。
train_data 和 eval_data: 配置了训练和验证数据集的路径。
gpt_options: 定义了训练的各项参数,包括实验名称、模型并行大小、训练迭代次数、学习率衰减样式、warmup、保存间隔、评估间隔、检查点路径、评估批次大小、零阶段、学习率、批次大小、跳过初始化、fp16 和 LoRA 使用等。
run_cmd: 最终运行的命令,使用deepspeed进行分布式训练。
执行微调
- 运行微调脚本,使用处理后的数据集进行模型微调。
bash finetune/finetune_visualglm.sh
- 监控训练过程,记录模型性能变化和训练日志。
设置迭代轮次记录,监控模型训练过程变化
验证和测试
1.模型微调结束
将模型结果存在/VisualGLM-6B-main/checkpoints文件夹内,微调得到的模型文件主要是model_config.json文件和300文件夹内的模型pt文件,300为训练轮次。
2.模型推理
使用如下命令进行模型推理
python cli_demo3.py --from_pretrained /root/HYJ/VisualGLM-6B-main/checkpoints/finetune-visualglm-6b-05-29-17-54 --prompt_zh
这张图片中的景点是什么?
3.模型验证和测试
- 使用部分未见过的数据对微调后的模型进行测试,评估其在新任务上的表现。使用own_data的数据,按照下面的命令进行模型推理,读取微调后的模型。
三、存在的问题
微调后的模型没有体现景点识别和问答的能力,分析以下几点原因:
-
数据质量问题:
- 爬虫获取的数据可能存在质量参差不齐的问题,需要进一步清洗和筛选。
- 图片和描述信息的匹配可能不够精准,影响微调效果。
-
数据量问题:
- 爬虫获取的数据量较少,影响模型的泛化能力。
- 需要考虑增加数据量或使用数据增强技术。
-
模型适应性问题:
- 由于任务变化,模型可能需要更长的训练时间才能适应新任务。
- 需要调优微调参数,找到最佳配置。
-
计算资源问题:
- 微调过程可能需要大量的计算资源,尤其是显存和计算时间。
- 需要优化训练过程,合理分配计算资源。
四、下周工作安排
调整模型参数、优化数据质量,继续微调模型。