ShannonAI / mrc-for-flat-nested-ner

Code for ACL 2020 paper `A Unified MRC Framework for Named Entity Recognition`
643 stars 117 forks source link

内存问题 #27

Open iamhere1 opened 4 years ago

iamhere1 commented 4 years ago

您好,请问下en_onto5的实验大概需要多少内存? 我申请了80G内存,还是内存不够正常吗? 报错信息: image

littlesulley commented 4 years ago

80G内存应该是CPU的?并没有这么大内存的GPU。 需要两张 16G内存的GPU 并行来跑。

iamhere1 commented 4 years ago

嗯,CPU使用的内存,谢谢了,但我的训练数据没加载好就报错了,我debug下看看

iamhere1 commented 3 years ago

您好,我使用generate_query_ner_dataset生成的训练样本,这个函数会对每个 pair (sentence, query), 构建了一个实例。 训练集句子个数111120,query个数18,生成实例个数11112018=2000160, 而程序加载将近40万个实例都时候,基本上就需要37G,全加载需要37 5 G,您训练时是直接全部加载后再训练吗?

JaeZheng commented 3 years ago

@iamhere1 你好,当我在测试脚本上预测数量较大的样本时,同样出现了这个程序内存使用过多导致进程被kill的问题,debug后定位到是/dataloader/mrc_utils.py中convert_examples_to_features()函数,该函数将所有样本加载为BERT模型对应格式的输入数据后再返回构建dataloader,所以会出现内存不足问题。目前我也还未解决这个问题,暂时的一个思路是分成多个子文件加载,还未实际编码实现。期待后续的交流。

zixiliuUSC commented 3 years ago

@littlesulley 你好我也遇到了一模一样的问题,请问你们会不会在近期改进代码呢? @JaeZheng 我也遇到了一样的问题,请问你这边解决了吗?

JaeZheng commented 3 years ago

@littlesulley 你好我也遇到了一模一样的问题,请问你们会不会在近期改进代码呢? @JaeZheng 我也遇到了一样的问题,请问你这边解决了吗?

你好,我目前已解决预测大规模数据时的内存问题,解决方法是分批多个子文件预测。不过训练时遇到大规模训练数据应该怎么办,目前还未解决,应该也可同理,分批load多个文件数据进去data loader。

iamhere1 commented 3 years ago

@JaeZheng 感觉你的思路可行啊,分批读入数据,将暂时用不到的数据从内存释放,目前我也没做进一步的尝试还。

ghost commented 3 years ago

您好,非常抱歉我的回复晚了。

可以在训练开始之前生成 模型输入的.cache 文件。具体请参考 ./script/data/transform_mrc_datasets_to_cache.sh,其中--num_data_processor代表了使用多少个进程来处理数据。

使用ACE2004 举例说明一下:

python3 $REPO_PATH/run/binary_mrc_datasets.py \
--data_dir /data/ace2004 \
--max_seq_length 160 \
--data_sign ace2004 \
--num_data_processor 2 \
--bert_model /data/pretrain_ckpt/cased_L-24_H-1024_A-16

在运行结束之后,将会在--data_dir得到以mrc-ner.{train/dev/test}.cache.{max_seq_length}.{num_data_processor}-[0-num_data_processor]方式命名的文件:mrc-ner.{train/dev/test}.cache.160.2-0mrc-ner.{train/dev/test}.cache.160.2-1

NOTICE: 如果使用.cache文件来作为模型训练的输入,在train_enace2004.sh 文件中的--num_data_processor应该和之前预处理数据时的数字保持一致。