Ucas-HaoranWei / Vary

[ECCV2024] Official code implementation of Vary: Scaling Up the Vision Vocabulary of Large Vision Language Models.
1.65k stars 150 forks source link

Vary-tiny训练,加载下载的权重loss也很高,十分离谱 #96

Closed lucasjinreal closed 2 months ago

lucasjinreal commented 3 months ago

加载vary tiny中的SAM权重继续训练,结果也比较差。

另外代码中的加载部分如果我没有弄错的话应该是这样:

        image_encoder.load_state_dict({k[21:]: v for k, v in state_dict.items() if 'vision_tower_2' in k}, strict=True)

毕竟改了vision_tower_2

{'loss': 6.9598, 'grad_norm': 0.0, 'learning_rate': 0.0, 'epoch': 0.0}                                                                                                                                                           
{'loss': 6.8987, 'grad_norm': 0.0, 'learning_rate': 0.0, 'epoch': 0.0}                                                                                                                                                           
{'loss': 7.0637, 'grad_norm': 209.77658081054688, 'learning_rate': 9.920634920634921e-08, 'epoch': 0.0}                                                                                                                          
{'loss': 7.1576, 'grad_norm': 130.80604553222656, 'learning_rate': 1.9841269841269841e-07, 'epoch': 0.0}                                                                                                                         
{'loss': 6.7199, 'grad_norm': 152.7211151123047, 'learning_rate': 2.976190476190476e-07, 'epoch': 0.0}                                                                                                                           
{'loss': 6.7264, 'grad_norm': 187.8332061767578, 'learning_rate': 3.9682539682539683e-07, 'epoch': 0.0}                                                                                                                          
{'loss': 6.293, 'grad_norm': 101.02922821044922, 'learning_rate': 4.96031746031746e-07, 'epoch': 0.0}                                                                                                                            
{'loss': 5.7051, 'grad_norm': 60.844818115234375, 'learning_rate': 5.952380952380952e-07, 'epoch': 0.0}                                                                                                                          
{'loss': 5.1306, 'grad_norm': 57.32065200805664, 'learning_rate': 6.944444444444445e-07, 'epoch': 0.0}                                                                                                                           
{'loss': 4.8173, 'grad_norm': 37.83329391479492, 'learning_rate': 7.936507936507937e-07, 'epoch': 0.0}                                                                                                                           
  0%| 

作者麻烦有空看一下? 以及如果方便的话,是否可以share 一份loss收敛曲线?

Ucas-HaoranWei commented 3 months ago

sam-b的loss我找不到了,我手里有一个sam-l的每个ep的loss打印,如下: image

lucasjinreal commented 3 months ago

lr为什么是0.0

目前开源的这个base是不可能复现2.6开始这个loss的,可以麻烦看看是什么问题吗?应该不止我一个是这样的情况。除非你用目前的代码能跑出一个这样的loss,那可能就是我们的问题

Ucas-HaoranWei commented 3 months ago

当前codebase我在检查,因为目前只有我一个人维护vary了,所以可能慢一点, 这个loss是ep末的loss,初始不是2.6,第一个ep末才是2.6,当前codebase的问题是第一个ep loss收敛和我内部的一致,但是一个ep后loss 不动,我还在查原因

lucasjinreal commented 3 months ago

好的,感谢跟进,有发现记得pin一下我 第一个epoch end 2.6 ,看起来还算正常

Ucas-HaoranWei commented 3 months ago

应该是deepspeed 下transformers trainer 的问题,在ep>1时收敛不正常,甚至拿少量图overfit不了,解决这个的问题只有自己写trainer,或者导入我训练好的Vary-tiny(all weights)在你的数据上 continue train

lucasjinreal commented 3 months ago

@Ucas-HaoranWei 导入也无法overfit,loss较高。那怎么解决呢?

41passerby commented 3 months ago

sam-b的loss我找不到了,我手里有一个sam-l的每个ep的loss打印,如下: image

@Ucas-HaoranWei 请问 vit 提升到 sam-l 规模,感知能力有没有增强,发现目前开源的模型,存在单词或字母识别错误。提高 vit 参数,不知道能否修复此问题。在错别字问题上面,想到三个参数可调:

  1. vit 参数,扩展到 sam-l 或 sam-h
  2. image_size,提高图片分辨率,从而让 vit 更准
  3. image_token_len,扩大图片特征输出,从而让 vit 更准

不知道作者做这些实验,帮忙分享下经验。

Ucas-HaoranWei commented 3 months ago

sam-b的loss我找不到了,我手里有一个sam-l的每个ep的loss打印,如下: image

@Ucas-HaoranWei 请问 vit 提升到 sam-l 规模,感知能力有没有增强,发现目前开源的模型,存在单词或字母识别错误。提高 vit 参数,不知道能否修复此问题。在错别字问题上面,想到三个参数可调:

  1. vit 参数,扩展到 sam-l 或 sam-h
  2. image_size,提高图片分辨率,从而让 vit 更准
  3. image_token_len,扩大图片特征输出,从而让 vit 更准

不知道作者做这些实验,帮忙分享下经验。

我们内部的sam-l是1280*1280分辨率,400tokens,为了解决下标上标错误问题,应该cover住你的以上三个参数了,效果强于b不少

lucasjinreal commented 3 months ago

@Ucas-HaoranWei 可否回答如何复现训练的问题?

Ucas-HaoranWei commented 3 months ago

基于transformers的codebase短时间内不好解了,这可能是你用llava那套和这套代码loss在多个ep下不骤降的原因,感觉不少人都想scratch去训一下,我正在协调内部codebase开源

lucasjinreal commented 3 months ago

好的,但是有几点错综复杂的现象,有些点指向同一个出错的地方,让我们来推理一下:

看起来都是从头训的问题。

想请教一下,到底要多少数据、大概多久能有涌现效果,如果从头训的话?

Ucas-HaoranWei commented 3 months ago

我用了2M数据,但是我自己先测的50w,是可以收敛到0.几,我才敢scale upde 只加载sam权重,你是否在train.py里重新load了?如果没有,model.from_pretrain后会丢掉sam weights,需要在这句后面再重新load一次sam

lucasjinreal commented 3 months ago

load了。

感觉我们还是得继续看一下,如何复现从头训练,如你所说,50w也能work,我现在差不多也这个数量级,从零的话,后面loss比较难降低,而且我每1000次都推理了一下,基本上没有一个学到东西的渐进过程,可以说是整个过程有点崩。这个得排查一下,哪里没有对齐。

至于deepspeed trainer,感觉可能不是这个原因

Ucas-HaoranWei commented 2 months ago

transformers库貌似可以通过数据*n遍,来替代多个ep收敛 https://github.com/Ucas-HaoranWei/Vary-toy/issues/30#issuecomment-2050877639