LTH14 / rcg

PyTorch implementation of RCG https://arxiv.org/abs/2312.03701
MIT License
785 stars 36 forks source link

你好,我有一个8万张图片的数据集,我想用一张A100来进行训练,不用分布式训练,请问你可以告诉我要改哪些设置吗 #27

Open gzhuinjune opened 5 months ago

gzhuinjune commented 5 months ago

imagenet对我来说太大了,我想用自己的图片来进行训练,我是不是直接把八万张图片丢到train文件夹里面就可以了呢,请问一张a100够吗,我需要调整哪些别的超参数呢,谢谢您的工作,祝您一切顺利!!!

LTH14 commented 4 months ago

感谢您的关注。如果你使用和code里面一样的dataloader,可以直接把八万张图片放在train文件夹里就可以了。一张a100足够训练representation generator(RDM),也不需要修改参数,但是要训练image generator(MAGE)可能不够。

gzhuinjune commented 4 months ago

谢谢大佬耐心的回复,我已经用单卡训练了一个rdm了,但是我在训练mage的时候遇到了报错。不知道您有没有遇到过类似的问题 962395b89b1e6e1b6cbd0ca4d5bddb0 第一张图是我的运行代码,第二张图是我遇到的报错的情况。它在generation step的时候会报错 3a2c33a7e0e8f2e0f56bb47be119b24 于是,我试着用两张卡来跑(我的电脑有两张A100),用的是这个命令,但是它直接就报错了。请问我应该如何避免这些报错呢 a4515d4af367363b6b37863a13999a3 1cd665f1853cc3f41c9d164a6b8f626

gzhuinjune commented 4 months ago

不知道是不是和这个比较类似 image

LTH14 commented 4 months ago

单卡的问题是因为MAGE在generate的时候会把所有GPU上生成的图片进行concat_all_gather操作。对于单卡来说这个会报错,把这句话注释掉就行。我没有在多卡A100上调试过,但多卡A6000上torch 1.7.1也会出现问题,你可以试试如下操作:

  1. 把pytorch升级到1.11.0版本,torchvision升级到0.12.0
  2. 上述升级会导致timm报错,需要根据这个issue进行修改。除了添加该issue里的代码之外,还要在代码文件里import torch
  3. 命令第一行改为torchrun --standalone --nproc_per_node=2 --nnodes=1 --node_rank=0 \
gzhuinjune commented 3 months ago

谢谢您的回答!

gzhuinjune commented 3 months ago

是rdm的问题还是mage的问题呢。理论上来说我这个数据集比imagenet应该简单很多才多,可是imagnet上面才个位数的fid

LTH14 commented 3 months ago

我觉得可能有如下几个问题,供您参考:

第一,在您的数据集上的生成模型表现不应该用传统的FID进行衡量。FID使用的是在imagenet上预训练的inception network从图像中提取特征,然后计算真实数据集的特征分布与生成数据的特征分布之间的frechet distance。在imagenet上预训练的inception network很难从你的数据中提取出有意义的特征。并且,请不要使用我提供的这个方式安装torch-fidelity pip install -e git+https://github.com/LTH14/torch-fidelity.git@master#egg=torch-fidelity,而是应该直接安装正版 pip install torch-fidelity,因为我提供的方式只能计算与imagenet training statistic的FID。

第二,mage使用的tokenizer是在imagenet上预训练的,在您的数据集上表现不一定好。DiT和LDM的tokenizer在OpenImage上进行预训练,效果可能会好一些。但我建议您自己在您的数据集上预训练tokenizer,或者不使用tokenizer,用类似ADM的方法直接diffuse pixel也可以考虑。

第三,由于您的数据集与imagenet分布差异非常大,我建议您重新训练每一个模块,包括Moco v3,RDM,tokenizer,pixel generator。

希望对您有所帮助!

gzhuinjune commented 3 months ago

对,rdm和pixel generator我都重新训练了,我试试也重新训练一下另外两个

gzhuinjune commented 3 months ago

请问您可以给我一些重新训练Moco v3和tokenizer的指引嘛,我看issue里面也有很多人更换数据集,说不定他们也能用上

gzhuinjune commented 3 months ago

4ae5f1ce015c197239f8f8f1ed4cc81 https://github.com/facebookresearch/moco-v3,我看到了,是不是用这个就行

gzhuinjune commented 3 months ago

我用自己的数据集训练一下这个,https://github.com/dome272/VQGAN-pytorch 然后替换文件夹里面的vggan.ckpt就行对吗,这个就相当于重新训练了tokenizer,希望得到您的回复,感谢您的帮助

gzhuinjune commented 3 months ago

哎哎,我看到mage好像没有用到vqgan呀,只有ldm用到了对吗

LTH14 commented 3 months ago

MAGE用到的是Google训练的tokenizer https://github.com/LTH14/rcg/blob/main/pixel_generator/mage/models_mage.py#L299-L302 我建议把他替换成你自己使用官方VQGAN在你自己数据集上训练的checkpoint:https://github.com/CompVis/taming-transformers

gzhuinjune commented 3 months ago

好,那么moco v3用这个来训练对吗,谢谢 https://github.com/facebookresearch/moco-v3

LTH14 commented 3 months ago

gzhuinjune commented 3 months ago

谢谢您的帮助,事情正在往好的方向发展。这是我用vqgan训练的部分结果,重建效果挺好的,我想这次训练完应该没问题。 image 我想顺便再问您一个非常小的问题,mage用的这个vqgan权重是哪里下载的呢,对应的参数是什么呢,我在vqgan的官网看到的imagenet训练的两个权重和您这个不同,请问为什么不用它们提供的呢,这个是您自己训练的吗,我现在比较担心我训练完之后和mage的对不上 image image

LTH14 commented 3 months ago

这个权重是Google内部训练的VQGAN。他的网络结构确实和原本的VQGAN不完全一样(虽然差距很小)。我建议你把这个文件https://github.com/LTH14/rcg/blob/main/pixel_generator/mage/taming/modules/diffusionmodules/model.py 替换成官方VQGAN的对应文件https://github.com/CompVis/taming-transformers/blob/master/taming/modules/diffusionmodules/model.py

LTH14 commented 3 months ago

图片size没有很大关系。我建议你print一下预训练模型state_dict里的keys。有一种可能是,moco训练的模型存的keys是base_encoder.xxxxx,你可能需要把这个base_encoder.给去掉才能把两边的keys对应上。

On Sat, May 11, 2024 at 6:52 AM Thu YinJun @.***> wrote:

我在moco上面是用224的图片训练的,在mage上面用的图片是256,请问这个会有关系吗。mocov3官方用的就是224的尺寸

— Reply to this email directly, view it on GitHub https://github.com/LTH14/rcg/issues/27#issuecomment-2105674601, or unsubscribe https://github.com/notifications/unsubscribe-auth/AFJD3KAWO4V3AWDEMTF6W7DZBXZ75AVCNFSM6AAAAABFQRRQ2SVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMBVGY3TINRQGE . You are receiving this because you commented.Message ID: @.***>

gzhuinjune commented 3 months ago

谢谢老哥,我找到了原因是因为我单卡训练的时候keys里面没有module这个词,我删掉就好。另外在vqgan载入的时候用原来的训练的权重里面会多一些东西,在load的时候把strict改为false就可以。和你交流很愉快,你这么厉害,却还这么耐心回答一些初学者的问题,谢谢你。现在我就等两边moco和vqgan都训练完就可以看到结果了。

LTH14 commented 3 months ago

谢谢老哥,我找到了原因是因为我单卡训练的时候keys里面没有module这个词,我删掉就好。另外在vqgan载入的时候用原来的训练的权重里面会多一些东西,在load的时候把strict改为false就可以。和你交流很愉快,你这么厉害,却还这么耐心回答一些初学者的问题,谢谢你。现在我就等两边moco和vqgan都训练完就可以看到结果了。

祝顺利!

creatorcao commented 3 months ago

好,那么moco v3用这个来训练对吗,谢谢 https://github.com/facebookresearch/moco-v3

你好! 可以分享一下训练moco-v3的经验吗?我用小数据训练总是timeout,查了很久也不知道怎么处理。我用torch 1.11, torchvision 0.12, 双卡训练的 @gzhuinjune

LTH14 commented 3 months ago

好,那么moco v3用这个来训练对吗,谢谢 https://github.com/facebookresearch/moco-v3

你好! 可以分享一下训练moco-v3的经验吗?我用小数据训练总是timeout,查了很久也不知道怎么处理。我用torch 1.11, torchvision 0.12, 双卡训练的 @gzhuinjune

您好!请问您是否能具体说明一下是什么timeout的错误呢?

creatorcao commented 3 months ago

就是submit job之后就不动了,一直是下面这个状态: => creating model 'vit_small' => creating model 'vit_small' 过了那个时间之后就提示NCCL错误: Watchdog caught collective operation timeout: Some NCCL operations have failed or timed out. Due to the asynchronous nature of CUDA kernels, subsequent GPU operations might run on corrupted/incomplete data. To avoid this inconsistency, we are taking the entire process down.

export OMP_NUM_THREADS=1
export NCCL_DEBUG=INFO

torchrun --standalone --nproc_per_node=2 --nnodes=1 --node_rank=0 \
main_moco.py \
--arch=vit_small \
--batch-size=256 --workers=2 \
--optimizer=adamw --lr=1.5e-4 --weight-decay=0.1 \
--epochs=300 --warmup-epochs=40 \
--stop-grad-conv1 --moco-m-cos --moco-t=0.2 \
rcg/data/imagenette2
LTH14 commented 3 months ago

单卡训练是没有问题的吗?如果单卡训练没问题,那大概率是卡间通讯的问题,可能需要检查一下master address什么的?

creatorcao commented 3 months ago

这个moco-v3 repo 说只支持多卡,我用单卡会报错:In this repo, only multi-gpu, DistributedDataParallel training is supported; single-gpu or DataParallel training is not supported. This code is improved to better suit the multi-node setting, and by default uses automatic mixed-precision for pre-training.

LTH14 commented 3 months ago

我觉得有可能是pytorch版本的问题,我之前好像在换到torch 1.11之后也遇到过MAE没法训练的情况。你试试回退到更早的pytorch版本呢,比如1.7.1或者1.10?

creatorcao commented 3 months ago

official repo推荐的是CUDA 10.2 PyTorch 1.9.0, 但是需要设置master address, 您可以告诉我怎么设置吗? 我用的学校的服务器,不知道这个dist-url,我就用的torch 1.11 torchrun

  -a vit_base \
  --optimizer=adamw --lr=1.5e-4 --weight-decay=.1 \
  --epochs=300 --warmup-epochs=40 \
  --stop-grad-conv1 --moco-m-cos --moco-t=.2 \
  --dist-url 'tcp://[your first node address]:[specified port]' \
  --multiprocessing-distributed --world-size 8 --rank 0 \
  [your imagenet-folder with train and val folders]
LTH14 commented 3 months ago

你如果就用一台机器的话,可以考虑设置成'tcp://localhost:8888'。如果要使用多台可能需要知道你学校服务器的名字(也就是ssh account_name@server_name的server_name,把localhost替换成统一的master server name

gzhuinjune commented 3 months ago

这个moco-v3 repo 说只支持多卡,我用单卡会报错:In this repo, only multi-gpu, DistributedDataParallel training is supported; single-gpu or DataParallel training is not supported. This code is improved to better suit the multi-node setting, and by default uses automatic mixed-precision for pre-training.

注释掉这个就好,然后接着报错,你把用多卡算loss的部分注释掉就行

creatorcao commented 3 months ago

谢谢回复! 我刚发现用旧版本跑成功了,需要设置正确的master address和port。

gzhuinjune commented 3 months ago

谢谢回复! 我刚发现用旧版本跑成功了,需要设置正确的master address和port。

你好,我其实也不会设置这个master address和port,请问你可以和我说说你是如何设置的吗

LTH14 commented 3 months ago

我才看到您两天前开了一个issue,不好意思没有及时回复。解决了就好,祝顺利!

creatorcao commented 3 months ago

我才看到您两天前开了一个issue,不好意思没有及时回复。解决了就好,祝顺利!

多谢!👍

creatorcao commented 3 months ago

谢谢回复! 我刚发现用旧版本跑成功了,需要设置正确的master address和port。

你好,我其实也不会设置这个master address和port,请问你可以和我说说你是如何设置的吗

用slurm就会输出一个node名字: MASTER_ADDR=$(scontrol show hostname $SLURM_NODELIST | head -n 1) 用socket找到一个port

gzhuinjune commented 3 months ago

谢谢回复! 我刚发现用旧版本跑成功了,需要设置正确的master address和port。

你好,我其实也不会设置这个master address和port,请问你可以和我说说你是如何设置的吗

用slurm就会输出一个node名字: MASTER_ADDR=$(scontrol show hostname $SLURM_NODELIST | head -n 1) 用socket找到一个port

谢谢您

gzhuinjune commented 3 months ago

好,那么moco v3用这个来训练对吗,谢谢 https://github.com/facebookresearch/moco-v3

你好! 可以分享一下训练moco-v3的经验吗?我用小数据训练总是timeout,查了很久也不知道怎么处理。我用torch 1.11, torchvision 0.12, 双卡训练的 @gzhuinjune

你好请问你也在用自己的训练集训练吗,你现在得到的效果如何呀,咱们可以加个联系方式沟通一下吗,我训练了好久,但是依然遇到一些麻烦

creatorcao commented 2 months ago

你好,请问怎么添加联系方式呢? @gzhuinjune

gzhuinjune commented 2 months ago

你好,请问怎么添加联系方式呢? @gzhuinjune

我的微信号是yj1392576398

creatorcao commented 2 months ago

你好!我想请问一下,训练完MAGE后,我的图片生成出来是很亮很模糊,我自己的数据是microscopy的,您知道在训练的时候需要注意和调节哪些参数吗?是不是跟imagenet图片差异很大造成的?

LTH14 commented 2 months ago

你使用的是自己训练的VQGAN还是MAGE里的VQGAN呢?MAGE里的VQGAN是在imagenet上预训练的,如果你的图片和imagenet图片差异很大,则需要重新在你自己的图片上训练VQGAN

gzhuinjune commented 2 months ago

你好,我和上面这个贴主有沟通,我俩都是自己训练了vqgan和moco,但是效果反而比直接用你之前提供的vqgan和moco还差,我训练的adm效果如下 b7939414275d71ca64014fb08628051 我感觉效果还是不怎么理想,我看到您在别的讨论里面提到训练moco需要去掉color jittering,我想这可能是一个重要的原因,我打算重新训练moco,请问您可以告诉我除了去掉这个color jittering,我还需要针对我的数据集做哪些调整吗,谢谢您!

gzhuinjune commented 2 months ago

另外,我想问问moco里面这个mean和std是拿我整个数据集进行计算得到的,还是利用训练集呢,下面的几个数据增强我需要再删掉哪些呢,是不是高斯模糊也应该关掉呢。如您看到的,我的数据集是颜色敏感的,因为不同的颜色直接代表不同的语义,而且它需要图片生成的线条是横平竖直的 normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])

# follow BYOL's augmentation recipe: https://arxiv.org/abs/2006.07733
augmentation1 = [
    transforms.RandomResizedCrop(224, scale=(args.crop_min, 1.)),
    transforms.RandomApply([
        transforms.ColorJitter(0.4, 0.4, 0.2, 0.1)  # not strengthened
    ], p=0.8),
    transforms.RandomGrayscale(p=0.2),
    transforms.RandomApply([moco.loader.GaussianBlur([.1, 2.])], p=1.0),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    normalize
]
gzhuinjune commented 2 months ago

另外我还觉得有一个可能的原因导致我的训练效果不佳,就是我的每个类别下面的图片数量非常不均衡,多的有几万张,少的只有几十张,我现在删掉了图片数量过少的类别。请问我需要重新训练全部的vqgan和rdm以及moco和像素生成器吗,还是只需要重新训练moco和像素生成器就行,我感觉我之前训练的vqgan和rdm的效果还是不错的(现在只是删掉了其中的一些类别)

LTH14 commented 2 months ago

有几个比较细节的点可能需要注意一下:

  1. data normalization。MAGE的VQGAN输入normalize到[0, 1],而原始VQGAN的code里是[-1, 1]。如果你使用了自己的VQGAN,那么在MAGE的training code里可能需要修改data augmentation以符合你的VQGAN的input normalization。
  2. moco的mean和variance是整个ImageNet数据集上RGB三个channel的mean和variance。如果你换了数据集,这个也会有区别。如果你的数据集是颜色敏感的,我建议moco可以考虑不要进行任何关于颜色的data augmentation和normalization,包括color jittering,random gray scale,以及gaussian blur。
  3. 关于数据均衡问题,由于我们的训练是完全无监督的(与类别关系不大),所以我觉得任何模块都不需要重新训练(包括moco和pixel generator)。
gzhuinjune commented 2 months ago

谢谢您的回答,请问您说的这个normalize在哪个地方呀,这个地方我确实没有留意

creatorcao commented 2 months ago

谢谢解答!第2点“moco可以考虑不要进行任何关于颜色的data augmentation和normalization”,是可以把这些包括下面的normalize都注释掉对吗?我的数据集跟ImageNet差别很大,我以前也试过不要normalization,结果是会好些。

augmentation1 = [
    transforms.RandomResizedCrop(224, scale=(args.crop_min, 1.)),
   # transforms.RandomApply([
   # transforms.ColorJitter(0.4, 0.4, 0.2, 0.1)  # not strengthened
    ], p=0.8),
  # transforms.RandomGrayscale(p=0.2),
  # transforms.RandomApply([moco.loader.GaussianBlur([.1, 2.])], p=1.0),
  # transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
   # normalize
]
LTH14 commented 2 months ago

关于normalize,在这个codebase里的MAGE是没有normalize的,也就是by default [0, 1]: https://github.com/LTH14/rcg/blob/main/main_mage.py#L164-L169. 但是原始的VQGAN是有normalize到[-1, 1]的https://github.com/CompVis/taming-transformers/blob/master/taming/data/base.py#L51。如果你使用了原始的VQGAN code训练的VQGAN,那也需要把这里MAGE的输入也normalize到[-1, 1]。另外需要注意的是,我们在RDM以及rep-cond MAGE的训练里都hard code了moco的augmentation:https://github.com/LTH14/rcg/blob/main/rdm/models/diffusion/ddpm.py#L572-L573, https://github.com/LTH14/rcg/blob/main/pixel_generator/mage/models_mage.py#L459-L460,也就是把[0, 1]的input按照moco原本的方式进行normalization。如果你对moco训练的normalization有改变的话,这两个地方也需要相应改变。

LTH14 commented 2 months ago

总之,我建议仔细检查各个地方的image normalization -- 包括你刚刚展示的效果图,看起来像是统一都比较暗,这很有可能是normalization出现了问题。

gzhuinjune commented 2 months ago

谢谢哥们!

creatorcao commented 2 months ago

谢谢解答,收获很多!