InternVL icon indicating copy to clipboard operation
InternVL copied to clipboard

[Docs] 在mlp1层之前,新增一个全连接层,应该怎么训练?

Open DankoZhang opened this issue 1 year ago • 6 comments

📚 The doc issue

在mlp1层之前,新增一个全连接层,应该怎么训练,视觉层和语言层都参与训练吗?辛苦帮忙解答下@czczup

Suggest a potential alternative/fix

No response

DankoZhang avatar Nov 25 '24 09:11 DankoZhang

能否提供一下更详细的需求?

lll2343 avatar Dec 10 '24 09:12 lll2343

能否提供一下更详细的需求?

@lll2343 感谢回复,这里的出发点是输入的图片分辨率比较大,num_image_token的数量需要从256->64, 想过两个方案,一是直接修改mlp1层,二是增加一个新的mlp用于降维,想了解下怎么训练比较好,或者是否有其他方案?

另外,如果相要提升模型对特定领域流程图的理解能力,应该怎么训练呢?

DankoZhang avatar Dec 16 '24 02:12 DankoZhang

Hi,

  1. 修改 MLP 无法减少 num_image_token
    pixel_shuffle 已降低 num_image_token,详见 [extract_feature函数]。 如果输入图片分辨率较高,可以通过调整 max_dynamic_patch 来减少切图数量。

  2. 增加训练步数
    修改 [meta.json]中的 repeat_time 参数(见 meta.json),在该数据集上训练更多步数以提升性能。

lll2343 avatar Dec 18 '24 06:12 lll2343

Hi,

  1. 修改 MLP 无法减少 num_image_token pixel_shuffle 已降低 num_image_token,详见 [extract_feature函数]。 如果输入图片分辨率较高,可以通过调整 max_dynamic_patch 来减少切图数量。
  2. 增加训练步数 修改 [meta.json]中的 repeat_time 参数(见 meta.json),在该数据集上训练更多步数以提升性能。

@lll2343 ,感谢回复~

  1. 【调整 max_dynamic_patch 来减少切图数量】,这样存在一个问题,如果图片分辨率较高,比如4000x3000,在显存一定的情况下,max_dynamic_patch需要设置的较小,比如默认的12,这样最佳切分是4x3,切分后图片总的分辨率变为(448x4,448x3),会导致图片失真严重;
  2. 目前我们显存比较紧张,在设置较大max_dynamic_patch的情况下,想要通过降低num_image_token数量的方式(例如256->64),进而降低显存占用。修改mlp1是适配num_image_token的调整。因此想了解修改之后如何训练模型;
  3. 关于流程图能力这块,我想了解的是,数据集一般怎么构造,我的任务是根据流程图,输出caption,那我需要构造一些流程图节点识别数据、流程描述数据等,一同训练么 期待回复~

DankoZhang avatar Dec 18 '24 06:12 DankoZhang

Hi,

  1. 降低 num_image_token 的方法

    修改 MLP1 并不会直接减少 num_image_token。实际上,这是通过 pixel_shuffle 来实现的。目前 downsample_ratio 设置为 0.5,num_image_token 已经从 256 降低到了 64。您可以将 downsample_ratio 设置得更小,例如 0.25,这样 num_image_token 将从 256 降至 16。具体实现请参考 extract_feature 函数

    vit_embeds = vit_embeds[:, 1:, :]  # b,256,c
    # 假设图像尺寸为 224x224,num_patch=14,downsample_ratio=0.5
    h = w = int(vit_embeds.shape[1] ** 0.5)  # 16,16
    vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], h, w, -1)  # b,16,16,c
    vit_embeds = self.pixel_shuffle(vit_embeds, scale_factor=self.downsample_ratio)  # b,8,8,c*4
    vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], -1, vit_embeds.shape[-1])  # b,64,c*4
    vit_embeds = self.mlp1(vit_embeds)  # b,64,llm_em
    return vit_embeds
    
  2. 重新训练 MLP1 的开销

    修改 MLP1 后需要重新训练 projetcor来进行对其,包括预训练和微调。这将带来较大的计算和时间开销。

  3. 调整 max_dynamic_patch 的设置

    在训练时,您可以不需要设置较小的 max_dynamic_patch,例如设置为 6;而在推理时,可以使用较大的值,如 12,这样也能够正常工作。

  4. 是的,构建一批符合您需求的 Caption 数据用于训练,以确保模型能够适应您的特定任务。

lll2343 avatar Dec 18 '24 08:12 lll2343

Hi,

  1. 降低 num_image_token 的方法 修改 MLP1 并不会直接减少 num_image_token。实际上,这是通过 pixel_shuffle 来实现的。目前 downsample_ratio 设置为 0.5,num_image_token 已经从 256 降低到了 64。您可以将 downsample_ratio 设置得更小,例如 0.25,这样 num_image_token 将从 256 降至 16。具体实现请参考 extract_feature 函数
    vit_embeds = vit_embeds[:, 1:, :]  # b,256,c
    # 假设图像尺寸为 224x224,num_patch=14,downsample_ratio=0.5
    h = w = int(vit_embeds.shape[1] ** 0.5)  # 16,16
    vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], h, w, -1)  # b,16,16,c
    vit_embeds = self.pixel_shuffle(vit_embeds, scale_factor=self.downsample_ratio)  # b,8,8,c*4
    vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], -1, vit_embeds.shape[-1])  # b,64,c*4
    vit_embeds = self.mlp1(vit_embeds)  # b,64,llm_em
    return vit_embeds
    
  2. 重新训练 MLP1 的开销 修改 MLP1 后需要重新训练 projetcor来进行对其,包括预训练和微调。这将带来较大的计算和时间开销。
  3. 调整 max_dynamic_patch 的设置 在训练时,您可以不需要设置较小的 max_dynamic_patch,例如设置为 6;而在推理时,可以使用较大的值,如 12,这样也能够正常工作。
  4. 是的,构建一批符合您需求的 Caption 数据用于训练,以确保模型能够适应您的特定任务。

@lll2343 非常感谢,关于num_image_token这块,已经明白了,还有两个小问题,请教下:

  1. 现在internvl2.5版本中,image_size默认是448, downsample_ratio 设置为 0.5的情况下,对应的num_image_token是256,您和团队在训练模型时,为什么没有采用64这种更低的量级呀,会影响模型的效果吗?
  2. 对于流程图训练这块,期望您能提供更多的经验,想了解的是,我们任务中的流程图的节点,和传统节点不太一致,因此,对于caption生成的任务,是直接构建如下示例1,端到端数据即可,还是需要混合一些示例2的数据,让模型认识不同的节点类型呢?
  • 示例1:{"query": "请解释说明图中流程图的含义", "answer": "xxx"}
  • 示例2:{"query": "图中[*, *, *, *]是什么图形", "answer": "图中是决策节点"}

DankoZhang avatar Dec 18 '24 08:12 DankoZhang

  1. 会影响模型效果,感知能力会有下降
  2. 最好是混合一些示例2的数据,经验上来讲训练效果会变好一些

Weiyun1025 avatar Aug 30 '25 03:08 Weiyun1025