超详细的CogVLM2模型最新微调落地经验

CogVLM2是由智谱AI团队推出的新一代多模态大模型,它在视觉和语言理解方面实现了显著的性能提升。

该模型基于Meta-Llama-3-8B-Instruct构建,支持长达8K的文本长度和高达1344*1344分辨率的图像输入,具备强大的文档图像理解能力。

CogVLM2模型继承并优化了上一代模型的经典架构,采用了一个拥有50亿参数的视觉编码器,并整合了一个70亿参数的视觉专家模块。

CogVLM2模型在多项基准测试中取得了优异的成绩,特别是在图像理解、视觉推理和视觉对话方面超越了其他模型。

微调对于CogVLM2这样的大型多模态模型至关重要,它允许模型在保留其广泛的知识和多模态理解能力的同时,学习特定领域的专业语言习惯、术语和要求。

通过使用特定领域的数据集对CogVLM2进行进一步训练,使其能够更好地适应和执行特定任务,如医学图像分析或法律文档审查。

CogVLM2提供了包括peft框架在内的多种微调技术,这些方法能够在不显著增加模型参数量的情况下,有效地调整模型权重以适应下游任务。

github项目地址为:https://github.com/THUDM/CogVLM2。

、peft框架微调

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

、swift框架微调

未完......

更多详细的内容欢迎关注:杰哥新技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值