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

训练问题的几个汇总请教 #136

Closed
zcdliuwei opened this issue Jul 20, 2024 · 5 comments
Closed

训练问题的几个汇总请教 #136

zcdliuwei opened this issue Jul 20, 2024 · 5 comments

Comments

@zcdliuwei
Copy link

您好,非常感谢您优秀的开源项目,我有一批爬取的图文对数据集,正在使用您的预训练模型进行微调,遇到了几个问题,汇总在这里,希望得到您的回复,不胜感激。
1,我的图文对数据,使用的是原始的user prompt,没有使用sharegpt4v进行prompt上采样 (应该是为了提高T2I的长文本理解能力),所以我把tools/convert_images_to_json.py中的第80行代码:entry['sharegpt4v'] = ''注释掉了,也就是我的data_info.json文件中只有width、height、ratio、path、prompt属性,没有sharegpt4v。因此我没有运行asset/docs/data_feature_extraction.md中的3.1部分,即python tools/extract_features.py --run_t5_feature_extract --caption_label=sharegpt4v这一步预处理代码,然后我运行训练,得到如下报错:
image
为了规避这个报错,我把configs/pixart_sigma_config/PixArt_sigma_xl2_img1024_internalms.py中的第41行real_prompt_ratio = 0.5,默认值改成了real_prompt_ratio = 1.0,绕过了assert len(self.sharegpt4v_txt_samples[0]) != 0的检查,请问,real_prompt_ratio = 0.5这个默认配置代表啥意思,我的改动是合理的吗,会不会影响训练效果?

2,在训练前的提取图文特征预处理阶段,当我运行完tools/convert_images_to_json.py生成data_info.json后,该json文件中的项数,与原始数据文件夹下图文对数量一致,但是运行asset/docs/data_feature_extraction.md中的第2步:Extract VAE features后,因为tools/extract_features.py中如下这一行代码:meta_data_clean = [item for item in meta_data if item['ratio'] <= 4.5],过滤掉了宽高比过于悬殊的数据,导致img_sdxl_vae_features_512resolution_ms_new文件夹下的npy文件个数比原始图片、以及data_info.json中的项数少了几十个,而Extract T5 features (prompt)这一步预处理,得到的caption_features_new文件夹下的npz文件个数,又与原始图片、以及data_info.json中的项数一致,因为我数据量较大, 跑一轮耗时比较久,不方便检查,请问这种情况会影响训练吗,比如训练一轮后因为数量不一致导致训练中断等问题。

3,配置文件configs/pixart_sigma_config/PixArt_sigma_xl2_img1024_internalms.py中第24行:train_batch_size = 2 # 3 for w.o feature extraction; 12 for feature extraction,这个注释是什么意思,为什么3是不带特征抽取,而12是包含特征抽取的?
以及train_scripts/train.py中的第296行:if args.debug: config.train_batch_size = 2。请问batch size大小和debug开启与否的关系是什么?目前我采用的是默认参数训练,也就是开启debug,train_batch_size = 2,在我一块80G的A100上只用了大约30G显存,请问我如何增大显存占用率? 如果直接关掉debug,增大train_batch_size,这跟特征抽取之间是什么关系,因为我已经提前抽取了图文特征,训练时这些参数的设置看起来又跟预处理有关,导致我有点困惑,希望得到您的解答。

问题较多,期待您的回复,谢谢!!

@Feynman1999
Copy link

Feynman1999 commented Aug 12, 2024

作为路人回复下,作者可能比较忙哈哈,仅供参考哈~
1.关于real_prompt_ratio。看下InternalDataMSSigma类的getdata方法,可以看到每次获取一个sample的时候,可能会用prompt的字符串作为描述,也可能会用sharegpt4v的作为描述;这个real_prompt_ratio就是二选一的概率。你没有提取gpt4v的描述,用1.0是没有问题的。

  1. 看下InternalDataMSSigma类的初始化方法,里面有一行meta_data_clean = [item for item in meta_data if item['ratio'] <= 4.5],也就是说在load数据时,也会进行这个过滤,只load过滤后的npy和npz。这个过滤和你说的tools/extract_features.py中如下这一行代码:meta_data_clean = [item for item in meta_data if item['ratio'] <= 4.5]的规则是一样的。那么应该不会发生冲突。(至于你说的不方便检查,其实你可以不训练,只遍历dataset来检查下就好,这是一个常用的检查数据集的trick)

3.3 for w.o feature extraction; 12 for feature extraction 这个我也不是很懂。
if args.debug: config.train_batch_size = 2 。这是软件测试中常用的思路,debug只是为了检查训练是否正常,所以一般你设置成多少都可以,设置成2只是为了偏小,速度快点。debug在正式训练中需要关闭。
我觉得你把batchsize调大,然后占到七十多g就行,learning rate可以在你确定好batchsize之后调整下就行

@crapthings
Copy link

re: 我觉得你把batchsize调大,然后占到七十多g就行,learning rate可以在你确定好batchsize之后调整下就行

这个 learning rate 大概范围是多少?

@zcdliuwei
Copy link
Author

作为路人回复下,作者可能比较忙哈哈,仅供参考哈~ 1.关于real_prompt_ratio。看下InternalDataMSSigma类的getdata方法,可以看到每次获取一个sample的时候,可能会用prompt的字符串作为描述,也可能会用sharegpt4v的作为描述;这个real_prompt_ratio就是二选一的概率。你没有提取gpt4v的描述,用1.0是没有问题的。

  1. 看下InternalDataMSSigma类的初始化方法,里面有一行meta_data_clean = [item for item in meta_data if item['ratio'] <= 4.5],也就是说在load数据时,也会进行这个过滤,只load过滤后的npy和npz。这个过滤和你说的tools/extract_features.py中如下这一行代码:meta_data_clean = [item for item in meta_data if item['ratio'] <= 4.5]的规则是一样的。那么应该不会发生冲突。(至于你说的不方便检查,其实你可以不训练,只遍历dataset来检查下就好,这是一个常用的检查数据集的trick)

3.3 for w.o feature extraction; 12 for feature extraction 这个我也不是很懂。 if args.debug: config.train_batch_size = 2 。这是软件测试中常用的思路,debug只是为了检查训练是否正常,所以一般你设置成多少都可以,设置成2只是为了偏小,速度快点。debug在正式训练中需要关闭。 我觉得你把batchsize调大,然后占到七十多g就行,learning rate可以在你确定好batchsize之后调整下就行

谢谢您善意的回复,目前我的情况:
1,real_prompt_ratio我改成了1.0,目前训练正常进行中,这个参数的含义应该如您所述。
2,代码里考虑了数据集过滤的情况,应该不会影响训练。
3,我没有仔细看论文和代码,所以我也没懂那一行代码的具体含义,看来我还是要回去仔细看看源代码。训练的时候,我把dubug关掉了。

训练时,我用了105W图文对数据集,train_batch_size=12,没有修改作者默认的学习率,在一块80G的A卡上正在训练。我发现,train_batch_size设置成大于12的值时,比如20、24时,每个epoch耗时反而增加了很多,猜测可能跟问题3中的feature extraction有关,但是我已经提前做了数据预处理,图文特征全部取出来存在本地了,所以这一点也有点困惑。

最后,我选择了train_batch_size=12,GPU占用少的时候是50+G,多的时候是70G,我没有再增大batch_size,因为也想留点空间测试中间保存的模型,学习率保持默认配置。
image

使用同样的105W数据集,我之前也曾将SDXL做基模,使用kohya_ss库(https://github.com/kohya-ss/sd-scripts)进行训练。SDXL的可训练的参数是2B+,pixartSigma只有0.6B,在同样的一块A卡上,训练SDXL可设置的train_batch_size可以达到48,而pixartSigma只能到24,而且训练时间SDXL也更快。考虑到SDXL可训练参数比pixartSigma大很多,我以为pixartSigma训练应该更快,batch_size应该更大才对,看来还是要回去好好研究源代码才行。

@Feynman1999
Copy link

作为路人回复下,作者可能比较忙哈哈,仅供参考哈~ 1.关于real_prompt_ratio。看下InternalDataMSSigma类的getdata方法,可以看到每次获取一个sample的时候,可能会用prompt的字符串作为描述,也可能会用sharegpt4v的作为描述;这个real_prompt_ratio就是二选一的概率。你没有提取gpt4v的描述,用1.0是没有问题的。

  1. 看下InternalDataMSSigma类的初始化方法,里面有一行meta_data_clean = [item for item in meta_data if item['ratio'] <= 4.5],也就是说在load数据时,也会进行这个过滤,只load过滤后的npy和npz。这个过滤和你说的tools/extract_features.py中如下这一行代码:meta_data_clean = [item for item in meta_data if item['ratio'] <= 4.5]的规则是一样的。那么应该不会发生冲突。(至于你说的不方便检查,其实你可以不训练,只遍历dataset来检查下就好,这是一个常用的检查数据集的trick)

3.3 for w.o feature extraction; 12 for feature extraction 这个我也不是很懂。 if args.debug: config.train_batch_size = 2 。这是软件测试中常用的思路,debug只是为了检查训练是否正常,所以一般你设置成多少都可以,设置成2只是为了偏小,速度快点。debug在正式训练中需要关闭。 我觉得你把batchsize调大,然后占到七十多g就行,learning rate可以在你确定好batchsize之后调整下就行

谢谢您善意的回复,目前我的情况: 1,real_prompt_ratio我改成了1.0,目前训练正常进行中,这个参数的含义应该如您所述。 2,代码里考虑了数据集过滤的情况,应该不会影响训练。 3,我没有仔细看论文和代码,所以我也没懂那一行代码的具体含义,看来我还是要回去仔细看看源代码。训练的时候,我把dubug关掉了。

训练时,我用了105W图文对数据集,train_batch_size=12,没有修改作者默认的学习率,在一块80G的A卡上正在训练。我发现,train_batch_size设置成大于12的值时,比如20、24时,每个epoch耗时反而增加了很多,猜测可能跟问题3中的feature extraction有关,但是我已经提前做了数据预处理,图文特征全部取出来存在本地了,所以这一点也有点困惑。

最后,我选择了train_batch_size=12,GPU占用少的时候是50+G,多的时候是70G,我没有再增大batch_size,因为也想留点空间测试中间保存的模型,学习率保持默认配置。 image

使用同样的105W数据集,我之前也曾将SDXL做基模,使用kohya_ss库(https://github.com/kohya-ss/sd-scripts)进行训练。SDXL的可训练的参数是2B+,pixartSigma只有0.6B,在同样的一块A卡上,训练SDXL可设置的train_batch_size可以达到48,而pixartSigma只能到24,而且训练时间SDXL也更快。考虑到SDXL可训练参数比pixartSigma大很多,我以为pixartSigma训练应该更快,batch_size应该更大才对,看来还是要回去好好研究源代码才行。

我想可能是sigma使用transformer的结构,一般比unet要暂用的显存更多。你训练的效果怎么样,你是要在自己的数据集上做finetune吗?

@zcdliuwei
Copy link
Author

作为路人回复下,作者可能比较忙哈哈,仅供参考哈~ 1.关于real_prompt_ratio。看下InternalDataMSSigma类的getdata方法,可以看到每次获取一个sample的时候,可能会用prompt的字符串作为描述,也可能会用sharegpt4v的作为描述;这个real_prompt_ratio就是二选一的概率。你没有提取gpt4v的描述,用1.0是没有问题的。

  1. 看下InternalDataMSSigma类的初始化方法,里面有一行meta_data_clean = [item for item in meta_data if item['ratio'] <= 4.5],也就是说在load数据时,也会进行这个过滤,只load过滤后的npy和npz。这个过滤和你说的tools/extract_features.py中如下这一行代码:meta_data_clean = [item for item in meta_data if item['ratio'] <= 4.5]的规则是一样的。那么应该不会发生冲突。(至于你说的不方便检查,其实你可以不训练,只遍历dataset来检查下就好,这是一个常用的检查数据集的trick)

3.3 for w.o feature extraction; 12 for feature extraction 这个我也不是很懂。 if args.debug: config.train_batch_size = 2 。这是软件测试中常用的思路,debug只是为了检查训练是否正常,所以一般你设置成多少都可以,设置成2只是为了偏小,速度快点。debug在正式训练中需要关闭。 我觉得你把batchsize调大,然后占到七十多g就行,learning rate可以在你确定好batchsize之后调整下就行

谢谢您善意的回复,目前我的情况: 1,real_prompt_ratio我改成了1.0,目前训练正常进行中,这个参数的含义应该如您所述。 2,代码里考虑了数据集过滤的情况,应该不会影响训练。 3,我没有仔细看论文和代码,所以我也没懂那一行代码的具体含义,看来我还是要回去仔细看看源代码。训练的时候,我把dubug关掉了。
训练时,我用了105W图文对数据集,train_batch_size=12,没有修改作者默认的学习率,在一块80G的A卡上正在训练。我发现,train_batch_size设置成大于12的值时,比如20、24时,每个epoch耗时反而增加了很多,猜测可能跟问题3中的feature extraction有关,但是我已经提前做了数据预处理,图文特征全部取出来存在本地了,所以这一点也有点困惑。
最后,我选择了train_batch_size=12,GPU占用少的时候是50+G,多的时候是70G,我没有再增大batch_size,因为也想留点空间测试中间保存的模型,学习率保持默认配置。 image
使用同样的105W数据集,我之前也曾将SDXL做基模,使用kohya_ss库(https://github.com/kohya-ss/sd-scripts)进行训练。SDXL的可训练的参数是2B+,pixartSigma只有0.6B,在同样的一块A卡上,训练SDXL可设置的train_batch_size可以达到48,而pixartSigma只能到24,而且训练时间SDXL也更快。考虑到SDXL可训练参数比pixartSigma大很多,我以为pixartSigma训练应该更快,batch_size应该更大才对,看来还是要回去好好研究源代码才行。

我想可能是sigma使用transformer的结构,一般比unet要暂用的显存更多。你训练的效果怎么样,你是要在自己的数据集上做finetune吗?

是的,应该是这个原因。嗯,我们爬了一批MJ的数据,之前拿SDXL做基模ft,现在改用DiT框架了,105万数据,bs=12的情况下,在pixartSigma上训练一轮要两周,我现在跑了10天了,看中间模型测试结果,确实远好于SDXL,感谢华为的开源

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

3 participants