TsinghuaAI / CPM-2-Pretrain

Code for CPM-2 Pre-Train
MIT License
159 stars 26 forks source link

关于数据处理问题 #9

Closed RoyZhanyi closed 3 years ago

RoyZhanyi commented 3 years ago

您好~ 我在尝试跑CPM-2-Pretrain代码时发现以下问题:

  1. 在“src-->data-->dataset_utils.py”中compile_helper()与deepspeed相比 发现缺失以下代码 ret = subprocess.run(['make', '-C', path]) 如若不加此行代码会出现 import helper导入不成功,如果加上上述代码会出现2的问题。 请问该行代码是否需要加上?

  2. 当我加入ret = subprocess.run(['make', '-C', path]) 进行预训练会出现数组越界问题 IndexError:index 53004 is out of bounds for axis 0 with size 62 问题出现在“src-->data-->enc_dec_dataset.py” line228. 我检查了一下似乎出现在了offset=tmp_target_offset[2 * x]这个上面。 不知道问题出在哪里。

很抱歉不能把原版错误粘贴出来。。问题困扰了我两天,还望作者能帮忙解答一下此处问题!万分感谢❤️❤️❤️

t1101675 commented 3 years ago

由于 help 的代码是 c++ 写的,因此 make 的那行代码是进行 c++ 的编译,如果已经编译出可执行文件就可以不用这行代码了。2 中的问题和数据预处理有关,请问您是否使用的是我们提供的预处理脚本呢?预处理数据多大?训练脚本的参数设置是否可以分享出来看一下?谢谢!

RoyZhanyi commented 3 years ago

数据预处理如下:

  1. 源数据为txt文件,一行一个document。(txt文件大小为1.5G)
  2. 运行scripts/gen_data.sh将txt文件处理成二进制文件,得到如下6个文件

    context.bin (660M) context.idx(7.2M) target.bin(147M) target.idx(7.2M) target_offset.bin(74M) target_offset.idx(7.2M)

  3. 执行scripts/pretrain_enc_dec.sh,会报出越界问题 IndexError:index 53004 is out of bounds for axis 0 with size 62 (由于原有模型太大。我做了参数部分更改, src/configs/model/enc_dec_xlarge_config.json 如下) { "d_model": 2560,(4096) "d_ff": 10240, "d_kv": 32,(原64) "num_heads": 32, (原64) "num_layers": 24, "num_decoder_layers": 24, "dropout_rate": 0.0, "feed_forward_proj": "relu", "init_method_std": 0.001, "initializer_factor": 1.0, "layer_norm_epsilon": 1e-06, "max_position_embeddings": 512, "use_cache": true, "use_scaled_init_for_output_weights": true, "do_dim_trick": false } batch_size调整为4
  4. 执行scripts/pretrain_enc_dec.sh得到的npy具体详情如下:

    train_doc_idx.npy(6.8M) train_sample_idx.npy(15M) train_shuffle_idx.npy(7.3M) valid_doc_idx.npy(123K) valid_sample_idx.npy(334K) valid_shuffle_idx.npy(167K) test_doc_idx.npy(2.6K) test_sample_idx.npy(5.4K) test_shuffle_idx.npy(2.8K)

上述执行预训练过程在“src-->data-->dataset_utils.py”中compile_helper()中添加了那行make代码 我在一台机器上8张卡做的训练,已调整 NUM_WORKERS 和 NUM_GPUS_PER_WORKER,

RoyZhanyi commented 3 years ago

您好~ 麻烦抽空看下问题出在哪里啦~ 这个问题还没有解决, 万分感谢 !!@t1101675

RoyZhanyi commented 3 years ago

或者方便提供下其他交流效率高的联系方式嘛? 谢谢~ @zzy14 @t1101675

t1101675 commented 3 years ago

可以大概输出一下是哪行代码出的问题嘛,现在我们这边不太好看出问题,谢谢~

t1101675 commented 3 years ago

经过测试问题应该出在中英双语的词表。我们更新了一下数据处理的脚本 gen_data.sh,改成了纯中文的词表,现在我们本地测试是没有问题的。如果您是训练纯中文模型的话可以先使用纯中文词表,双语词表等我们修复问题之后会进一步更新。感谢指出问题!

XiaoqingNLP commented 2 years ago

@t1101675 用咱们默认的预处理方法,会出现assert target[0] == token_id, (target[0], token_id) 不相等的情况,仔细阅读了代码逻辑,感觉没有什么地方会产生不相等的问题;

  1. 排查了一下,target[0] 不正常,token_id 非常大,target[0] 是按照索引读取出来,按理不应该不正常
  2. 初步假设是target_offset 超过最大数值范围所以导致的,如果文档非常长会导致这个问题吗?
t1101675 commented 2 years ago

这是有可能的,可以检查一下 target_offset 里面的内容

XiaoqingNLP commented 2 years ago

@t1101675 有比较好的检查方法吗?

t1101675 commented 2 years ago

可以在数据处理的脚本里面加一个判断,比如加一个 assert,看看写入 target_offset 的东西是否过大