NLP-Playground / LaSS

31 stars 5 forks source link

Binarize之后的字典 #5

Closed vicky-zhuang closed 2 years ago

vicky-zhuang commented 2 years ago

我按照给出的链接https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/data/iwslt/raw/prepare-iwslt14.shiwslt数据进行binarize之后,运行bash scripts/train.sh —config baseline.yml该命令出现了如下错误,FileNotFoundError: [Errno 2] No such file or directory: '/home/notebook/code/personal/LaSS/data/data-bin/dict.ar.txt'。我猜测该错误由于字典不一致造成的,binarize之后只有一个字典dict.txt,而这边错误提示明显需要每个语言一个字典。请问,预处理之后字典应该是几个,你们所使用的fairseq是哪一个版本?望解答,谢谢~

linzehui commented 2 years ago

在learn joint bpe后,用这个bpe code对每个语言分别进行bpe&binarize。在训练前将这几个训练集放在同一个文件夹里就可以了。这样每个语言都有dict(虽然内容是一样的)

shaoyangxu commented 2 years ago

你好,关于这个问题,我的第一反应是把dict.txt复制多份dict.xx.txt。而作者你说的方式具体是怎么做的(主要就是想知道binarize(fairseq-preprocess)时,怎么把bpe code给用上)?参考https://github.com/facebookresearch/fairseq/blob/main/examples/translation/README.md 中Multilingual Translation中的预处理方式,会得到不同的dict。

linzehui commented 2 years ago

@beiweixiaoxu 整个过程是learn sentencepiece → apply sentencepiece → binarize。 在apply sentencepiece这一步会用到bpe code(或者说是sentencepiece model),binarize的时候就用不到bpe code了。 我对每个语言对都做了apply sentencepiece→binarize,每个语言对在一个独立的文件夹下,将这些文件夹下的文件都复制到同一个文件夹下就可以用来训multilingual model了

vicky-zhuang commented 2 years ago

我按照fairseq中Multilingual Translation的预处理方式https://github.com/facebookresearch/fairseq/blob/main/examples/translation/README.md对每个语言都进行了binarize,这样每个语言都有字典了但是这些字典是不同的,导致训练过程中出现了如下的错误File "/home/fairseq/tasks/translation_multi_simple_epoch.py", line 117, in check_dicts ), "Diffrent dictionary are specified for different source languages; "请问你们在分别对每个语言对binarize是具体怎么使用fairseq-preprocess处理的?

shaoyangxu commented 2 years ago

@vicky-zhuang 我个人认为一种方式是可以参照:https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/preprocess_universal.py, 先把bpe之后所有语言的文件都读入,建立一个公共的dict,然后进行binarize;也可以按照作者说的,但我理解的作者的做法是:先learn sentencepiece,再apply sentencepiece,但我感觉在binarize过程中还是要用到learn sentencepiece步骤中产生的bpe code作为公共的dict?作为进行fairseq-preprocess的参数传入。

linzehui commented 2 years ago

@vicky-zhuang @beiweixiaoxu 在learn spm的时候会得到一个sentencepiece的vocab,在binarize之前可以将这个vocab转化成binarize可用的dict,参考 https://github.com/facebookresearch/fairseq/issues/2110#issue-614837309 cut -f1 mbart.ende.vocab | tail -n +4 | sed "s/$/ 100/g" > mbart.ende.dict.txt

shaoyangxu commented 2 years ago

@vicky-zhuang @beiweixiaoxu 在learn spm的时候会得到一个sentencepiece的vocab,在binarize之前可以将这个vocab转化成binarize可用的dict,参考 facebookresearch/fairseq#2110 (comment) cut -f1 mbart.ende.vocab | tail -n +4 | sed "s/$/ 100/g" > mbart.ende.dict.txt

感谢,我没啥问题了

moore3930 commented 2 years ago

我遇到了跟楼主一样的问题:试着跑你们IWSLT上的实验,按照提供的脚本跑完binarize以后,只能产出一个joint的dict.txt,将其对每个语言复制一份后,用fairseq-train跑MNMT会出错。 能提供一下IWSLT上大致的数据处理流程嘛?谢谢

linzehui commented 2 years ago

@moore3930 应该是在有一个joint的dict之后对每个语言对分别做binarize,然后再将这几个语言对的文件放到一个multilingual的文件夹,训multilingual模型的时候用这个文件夹的数据训。

moore3930 commented 2 years ago

@moore3930 应该是在有一个joint的dict之后对每个语言对分别做binarize,然后再将这几个语言对的文件放到一个multilingual的文件夹,训multilingual模型的时候用这个文件夹的数据训。

没错,已经放到同一个文件夹了,但是那个可能dict有问题,跑挂了,看起来像是索引越界。

moore3930 commented 2 years ago

看起来问题好像出在这个binarize脚本跟fairseq的代码版本不匹配?请问你们IWSLT的实验是用这个脚本处理数据的吗: https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/preprocess_universal.py

linzehui commented 2 years ago

@moore3930 不是,下载和数据预处理用 https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/data/iwslt/raw/prepare-iwslt14.sh ,之后直接用fairseq官方的binarize脚本

moore3930 commented 2 years ago

@moore3930 不是,下载和数据预处理用 https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/data/iwslt/raw/prepare-iwslt14.sh ,之后直接用fairseq官方的binarize脚本

好的。另一个问题是:fairseq-preprocess会产出多个词典,如何merge呢?

linzehui commented 2 years ago

@moore3930 不需要merge,直接放到一个文件夹即可

moore3930 commented 2 years ago

@moore3930 不需要merge,直接放到一个文件夹即可

OK,我试了下,明白了,多谢。问题出在preprocess_universal.py 这个脚本太老了(即https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/data/iwslt/raw/prepare-iwslt14.sh 的最后一行,产出的词典貌似不是相同的。 建议改下README里IWSLT的数据处理部分。