Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
DankoZhang opened this issue Nov 25, 2024 · 6 comments

Comments

@DankoZhang
Copy link

📚 The doc issue

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

Suggest a potential alternative/fix

No response

@lll2343
Copy link
Collaborator

lll2343 commented Dec 10, 2024

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

@DankoZhang
Copy link
Author

DankoZhang commented Dec 16, 2024

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

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

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

@lll2343
Copy link
Collaborator

lll2343 commented Dec 18, 2024

Hi,

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

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

@DankoZhang
Copy link
Author

DankoZhang commented Dec 18, 2024

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,那我需要构造一些流程图节点识别数据、流程描述数据等,一同训练么
    期待回复~

@lll2343
Copy link
Collaborator

lll2343 commented Dec 18, 2024

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 数据用于训练,以确保模型能够适应您的特定任务。

@DankoZhang
Copy link
Author

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": "图中是决策节点"}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants