Closed vicky-zhuang closed 2 years ago
在learn joint bpe后,用这个bpe code对每个语言分别进行bpe&binarize。在训练前将这几个训练集放在同一个文件夹里就可以了。这样每个语言都有dict(虽然内容是一样的)
你好,关于这个问题,我的第一反应是把dict.txt复制多份dict.xx.txt。而作者你说的方式具体是怎么做的(主要就是想知道binarize(fairseq-preprocess)时,怎么把bpe code给用上)?参考https://github.com/facebookresearch/fairseq/blob/main/examples/translation/README.md 中Multilingual Translation中的预处理方式,会得到不同的dict。
@beiweixiaoxu 整个过程是learn sentencepiece → apply sentencepiece → binarize。 在apply sentencepiece这一步会用到bpe code(或者说是sentencepiece model),binarize的时候就用不到bpe code了。 我对每个语言对都做了apply sentencepiece→binarize,每个语言对在一个独立的文件夹下,将这些文件夹下的文件都复制到同一个文件夹下就可以用来训multilingual model了
我按照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
处理的?
@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的参数传入。
@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
@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
感谢,我没啥问题了
我遇到了跟楼主一样的问题:试着跑你们IWSLT上的实验,按照提供的脚本跑完binarize以后,只能产出一个joint的dict.txt,将其对每个语言复制一份后,用fairseq-train跑MNMT会出错。 能提供一下IWSLT上大致的数据处理流程嘛?谢谢
@moore3930 应该是在有一个joint的dict之后对每个语言对分别做binarize,然后再将这几个语言对的文件放到一个multilingual的文件夹,训multilingual模型的时候用这个文件夹的数据训。
@moore3930 应该是在有一个joint的dict之后对每个语言对分别做binarize,然后再将这几个语言对的文件放到一个multilingual的文件夹,训multilingual模型的时候用这个文件夹的数据训。
没错,已经放到同一个文件夹了,但是那个可能dict有问题,跑挂了,看起来像是索引越界。
看起来问题好像出在这个binarize脚本跟fairseq的代码版本不匹配?请问你们IWSLT的实验是用这个脚本处理数据的吗: https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/preprocess_universal.py
@moore3930 不是,下载和数据预处理用 https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/data/iwslt/raw/prepare-iwslt14.sh ,之后直接用fairseq官方的binarize脚本
@moore3930 不是,下载和数据预处理用 https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/data/iwslt/raw/prepare-iwslt14.sh ,之后直接用fairseq官方的binarize脚本
好的。另一个问题是:fairseq-preprocess会产出多个词典,如何merge呢?
@moore3930 不需要merge,直接放到一个文件夹即可
@moore3930 不需要merge,直接放到一个文件夹即可
OK,我试了下,明白了,多谢。问题出在preprocess_universal.py 这个脚本太老了(即https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/data/iwslt/raw/prepare-iwslt14.sh 的最后一行,产出的词典貌似不是相同的。 建议改下README里IWSLT的数据处理部分。
我按照给出的链接https://github.com/RayeRen/multilingual-kd-pytorch/blob/master/data/iwslt/raw/prepare-iwslt14.sh对iwslt数据进行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是哪一个版本?望解答,谢谢~