bert create_pretraining_data.py被杀死了,

yquaqz18  于 3个月前  发布在  其他
关注(0)|答案(7)|浏览(67)

你好。我正在使用GCP(谷歌云平台)进行预训练BERT项目。在使用TPU执行run_pretraining.py之前,我遇到了创建预训练数据的问题。这是create_pretraining_data.py的.sh脚本。

python3 create_pretraining_data.py \ --input_file $DATA_DIR/data_1.txt \ --output_file $OUTPUT_DIR \ --do_lower_case=True \ --do_whole_word_mask=True \ --max_seq_length 512 \ --max_predictions_per_seq 70 \ --masked_lm_prob 0.15 \ --vocab_file $VOCAB_DIR \ --codes_file $CODES_DIR \ --dupe_factor 1
输入文本的大小约为40GB,但似乎太大了,所以我将数据分成了18个文件,每个文件的大小约为1.2GB。起初,我尝试将dupe_factor设置为10,但这似乎也会引起内存问题,所以我只将dupe_factor设置为1,并尝试重复10次,每次分配不同的random_seed。

尽管我尝试在最小环境中执行create_pretraining_data.py,但它仍然被杀死,我在18个文件中只完成了一个文件。这种情况发生在GCP和我的本地服务器上。有什么办法解决这个“灾难性”的情况吗?由于这个问题,这个项目已经延期了,我不知道还能做什么......

8ljdwjyq

8ljdwjyq1#

似乎是一个OOM问题。
你尝试过将一个小文本(约1M)输入脚本吗?

enyaitl3

enyaitl32#

是的,它确实运行得很好。我也认为内存很重要,因为create_pretraining_data.py的逻辑并不是那么节省内存。

lvjbypge

lvjbypge3#

我可能会将分片数量从18个增加到32个。然后在每个分片上单独运行create_pretraining_data.py(制作一个快速脚本来自动化这个过程)。

6bc51xsx

6bc51xsx4#

这是最大长度,但由于您在TPU上,这应该不是问题。您可以将其降低以查看是否仍然存在OOM?

ars1skjm

ars1skjm5#

如果这对任何人有帮助:
我开始时的数据文件大小超过3G,有超过700万个句子,虚拟机在运行了几个小时后(我在虚拟机上有大约102G的RAM),最终导致系统资源耗尽,出现奇怪的错误。
如果你没有无限的RAM,作为补救措施,你可以像下面这样分片数据文件:
split -d -l 250000 data_file.txt data_file_shard
我选择了每个文件25万行,它起作用了。你可以根据你的系统配置尝试不同的大小。
在这之后,我能够生成n个tf_trecord文件。run_pretraining.py步骤可以接受像tf_examples.tf_record*这样的glob输入,因此这个小小的附加步骤解决了问题,完成了超过3G的数据处理,大约用了2-3小时。如果有人仍然不知道如何分割和自动化地循环遍历n个文件创建tfrecords,我可以分享脚本......
祝你好运!

mbyulnm0

mbyulnm06#

如果这对任何人有帮助:
我开始时的数据文件大小超过3G,有超过700万个句子,虚拟机在运行了几个小时后(我在虚拟机上有大约102G的RAM),最终导致系统资源耗尽,出现奇怪的错误。
如果你没有无限的RAM,作为补救措施,你可以像下面这样分片数据文件:
split -d -l 250000 data_file.txt data_file_shard
我选择了每个文件25万行,它起作用了。你可以根据你的系统配置尝试不同的大小。
在这之后,我能够生成n个tf_trecord文件。run_pretraining.py步骤可以接受类似tf_examples.tf_record*的输入,因此这个小小的附加步骤解决了问题,完成了超过3G的数据处理,大约用了2-3小时。如果有人仍然不知道如何分割和自动化地循环遍历n个文件创建tfrecords,我可以分享脚本......
祝你好运!

syqv5f0l

syqv5f0l7#

请按照@anshoomehra的建议操作,它可以正常工作:
在python文件顶部添加以下代码,并记得添加路径。

相关问题