赞
踩
CogVLM2是由智谱AI团队推出的新一代多模态大模型,它在视觉和语言理解方面实现了显著的性能提升。
该模型基于Meta-Llama-3-8B-Instruct构建,支持长达8K的文本长度和高达1344*1344分辨率的图像输入,具备强大的文档图像理解能力。
CogVLM2模型继承并优化了上一代模型的经典架构,采用了一个拥有50亿参数的视觉编码器,并整合了一个70亿参数的视觉专家模块。
CogVLM2模型在多项基准测试中取得了优异的成绩,特别是在图像理解、视觉推理和视觉对话方面超越了其他模型。
微调对于CogVLM2这样的大型多模态模型至关重要,它允许模型在保留其广泛的知识和多模态理解能力的同时,学习特定领域的专业语言习惯、术语和要求。
通过使用特定领域的数据集对CogVLM2进行进一步训练,使其能够更好地适应和执行特定任务,如医学图像分析或法律文档审查。
CogVLM2提供了包括peft框架在内的多种微调技术,这些方法能够在不显著增加模型参数量的情况下,有效地调整模型权重以适应下游任务。
github项目地址为:https://github.com/THUDM/CogVLM2。
1、库安装
pip install -r finetune_demo/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
为了能够安装mip4py库,我们首先保证linux系统已经安装openmpi和mpich。
如果没有,则需要执行下面的apt命令:
apt update
apt install openmpi-bin libopenmpi-dev
apt install mpich mpich-doc mpich-committers-dev
2、模型下载
(1)英语模型 git clone https://huggingface.co/THUDM/cogvlm2-llama3-chat-19B
(2)中英双语模型
git clone https://huggingface.co/THUDM/cogvlm2-llama3-chinese-chat-19B
3、数据集构建
首先下载开源的CogVLM-SFT-311K数据集:
git lfs install
git clone https://huggingface.co/datasets/THUDM/CogVLM-SFT-311K
数据集构成包括两个核心部分:images 和 labels 。
这在 CogVLM-SFT-311K 数据集中体现为 labels_en 和 labels_zh,分别对应英语和中文的描述文本。
在进行模型微调时,你拥有灵活性去调整以下路径指示以匹配你的实际文件夹命名:
self.visuals_folder = os.path.join(dataset_root, 'images')
self.caption_folder = os.path.join(dataset_root, 'labels_en') # 可替换为 'labels_zh' 或 'labels' 依据需求。
其中,images文件夹内存储了所有的图像资料,而 labels则容纳了与之严格一一对应的标签文件。
图像文件均采用 jpg 格式封装,而每个描述文档则以json形式存在,内含一系列的对话交互。
对话框架固定为两个角色:user 和 assistant。
每个角色的对话内容由 roles 和 content这两个字段组成。
一个典型的描述文件结构展示如下:
{
"conversations": [
{
"role": "user",
"content": "从图中能推断出斑马的行为及其所处环境的哪些特征?"
},
{
"role": "assistant",
"content": "观察图片,我们可以推断这两只斑马正并排站在一棵多刺树的枝叶下,可能是为了躲避烈日的炙烤。这棵提供阴凉的树木在最炎热的时段为它们提供了避暑之处。斑马所处的是一片绿草茵茵的地带,这样的环境非常适合它们进食和休息,同时又能靠近遮蔽处。这表明斑马的行为受到了周围环境条件和可用资源的影响。此外,这也彰显了这些动物通过诸如合作寻找遮蔽等方式,适应环境变化,以在自然栖息地中生存繁衍的智慧。"
}
]
}
4、模型微调配置
为了在保持训练效率的同时,最大化地利用有限的GPU资源,模型微调的配置文件ds_config.yaml设置如下:
train_micro_batch_size_per_gpu: 1
gradient_accumulation_steps: 1
steps_per_print: 50
gradient_clipping: 1.0
zero_optimization:
stage: 2
contiguous_gradients: false
overlap_comm: true
reduce_scatter: true
reduce_bucket_size: 1000000000
allgather_bucket_size: 100000000
load_from_fp32_weights: false
round_robin_gradients: false
offload_optimizer:
device: cpu
pin_memory: true
zero_allow_untested_optimizer: true
bf16:
enabled: true
activation_checkpointing:
partition_activations: false
contiguous_memory_optimization: false
cpu_checkpointing: false
wall_clock_breakdown: true
其中,配置参数说明如下:
train_micro_batch_size_per_gpu: 指定每个GPU上处理的微批次(micro-batch)大小。值为1意味着每个GPU处理单个样本,然后通过梯度累积(如果启用)来模拟更大的批次效果。
gradient_accumulation_steps: 如果使用梯度累积,这个参数定义了需要多少个微批次的梯度才进行一次更新。这里设为1,意味着不使用梯度累积。
steps_per_print: 训练过程中每多少步打印一次日志信息。
gradient_clipping: 设置梯度裁剪的阈值,防止梯度爆炸。这里是1.0,可能表示未特别限制或按其他方式控制梯度大小。
zero_optimization:stage: ZeRO的优化阶段,共分三个阶段,这里设置为2,通常意味着更多的内存优化,包括参数、梯度和优化器状态的分割。
contiguous_gradients: 是否使用连续内存优化来存储梯度,设为false可能是因为内存优化策略或其他考虑。
overlap_comm: 允许通信和计算重叠,提高效率。
reduce_scatter: 使用reduce_scatter操作来聚合分割的梯度,减少通信开销。
reduce_bucket_size 和 allgather_bucket_size: 控制梯度通信时桶的大小,单位字节。较大的值可以减少通信次数但增加内存使用。
load_from_fp32_weights: 是否从FP32权重加载模型开始训练,设为false表明直接从已有的检查点或模型加载。
round_robin_gradients: 控制梯度处理的顺序,设为false可能避免特定GPU的负载不均衡。
offload_optimizer:device: 将优化器状态移到指定设备,这里是CPU,有助于节省GPU内存。
offload_optimizer:pin_memory: 当将数据或状态移到CPU时,使用固定内存可以加速数据传输。
zero_allow_untested_optimizer: 允许使用未经过充分测试的优化器,这可能为了尝试新的或定制的优化策略。
bf16:enabled: 启用BF16(Brain Floating Point)混合精度训练,减少内存占用并加速计算,适用于支持的硬件。
activation_checkpointing: 检查点激活,用于进一步减少内存需求,特别是对于大型模型。这里的配置关闭了分区和连续内存优化,以及CPU检查点。
wall_clock_breakdown: 记录训练过程中的时间消耗细节,帮助分析瓶颈性能。
5、微调命令
通过执行下面命令开始微调:
deepspeed finetune_demo/peft_lora.py --ds_config ds_config.yaml
为了查看微调loss收敛情况,我们可以通过tensorboard查看:
tensorboard --logdir=output
6、微调后模型验证
执行命令进行推理验证:
CUDA_VISIBLE_DEVICES=0 python peft_infer.py
未完......
更多详细的内容欢迎关注:杰哥新技术
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。