unilm 仓库中的 fairseq 机器翻译实战:预训练模型加载、IWSLT/WMT 基准训练与多语言翻译
【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm
本文以infoxlm/fairseq子仓库中的神经机器翻译官方文档 机器翻译 README 为核心,系统讲解 fairseq 翻译任务的四条主线:通过torch.hub或 CLI 工具加载官方预训练模型、批量推理与 BLEU 评估、从零训练 Transformer / 卷积(fconv)翻译模型,以及多语言联合词典翻译模型的构建。读完后你可以独立完成从数据准备(binarize)、训练、推理到自动评分的完整机器翻译流水线,并理解每个命令行参数在 fairseq 源码中的落点。
文档定位与整体工作流
该文档是 fairseq 翻译示例目录infoxlm/fairseq/examples/translation/的入口说明,与同目录下的四个数据准备脚本配套使用:
| 脚本 | 作用 |
|---|---|
| prepare-iwslt14.sh | 下载并预处理 IWSLT'14 德英(de-en)平行语料 |
| prepare-wmt14en2de.sh | 下载并预处理 WMT'14/17 英德(en-de)语料,支持--icml17复现原始 ConvS2S 设置 |
| prepare-wmt14en2fr.sh | 下载并预处理 WMT'14 英法(en-fr)语料 |
| prepare-iwslt17-multilingual.sh | 下载 IWSLT'17{de,fr}-en多语言语料并训练联合 BPE |
需要注意一个前置约定:文档中的所有cd examples/translation/与fairseq-preprocess、fairseq-train、fairseq-generate等命令,都假定你在 fairseq 仓库根目录下执行,即本仓库中的infoxlm/fairseq/目录。这些 CLI 入口分别对应 fairseq_cli/train.py、fairseq_cli/generate.py、fairseq_cli/preprocess.py、fairseq_cli/score.py 和 fairseq_cli/interactive.py。
整体工作流为三步闭环:
- 数据准备:准备脚本下载原始平行语料并做分词/BPE 化,
fairseq-preprocess再将其二值化为可直接喂给训练器的data-bin目录; - 训练:
fairseq-train按指定--arch与超参训练,检查点输出到checkpoints/; - 推理与评估:
fairseq-generate批量生成译文,fairseq-score或sacrebleu计算 BLEU。
官方预训练模型清单
文档给出了十个官方预训练翻译模型。模型按架构分为两类:早期卷积序列到序列模型(fconv,对应 fconv.py 实现)与 Transformer 模型(对应 transformer.py 实现):
| 模型名 | 架构 | 数据集 | 说明 |
|---|---|---|---|
conv.wmt14.en-fr | Convolutional(Gehring et al., 2017, ConvS2S) | WMT14 英-法 | 附 newstest2014、newstest2012/2013 评测包 |
conv.wmt14.en-de | Convolutional(Gehring et al., 2017) | WMT14 英-德 | 附 newstest2014 评测包 |
conv.wmt17.en-de | Convolutional(Gehring et al., 2017) | WMT17 英-德 | 附 newstest2014 评测包 |
transformer.wmt14.en-fr | Transformer(Ott et al., 2018) | WMT14 英-法 | 联合词典(joined-dict) |
transformer.wmt16.en-de | Transformer(Ott et al., 2018) | WMT16 英-德 | 联合词典 |
transformer.wmt18.en-de | Transformer(Edunov et al., 2018) | WMT'18 英-德 | WMT'18 冠军系统,多模型集成(ensemble) |
transformer.wmt19.en-de | Transformer(Ng et al., 2019) | WMT'19 英-德 | WMT'19 冠军系统,联合词典集成 |
transformer.wmt19.de-en | Transformer(Ng et al., 2019) | WMT'19 德-英 | WMT'19 冠军系统 |
transformer.wmt19.en-ru | Transformer(Ng et al., 2019) | WMT'19 英-俄 | WMT'19 冠军系统 |
transformer.wmt19.ru-en | Transformer(Ng et al., 2019) | WMT'19 俄-英 | WMT'19 冠军系统 |
这些模型名并不是凭空约定的字符串——从源码结构看,它们是各模型类在hub_models()方法中注册的键。以 Transformer 为例,transformer.py#L54-L73 中hub_models()返回的字典包含'transformer.wmt16.en-de'等条目,值即为官方发布包下载地址。也就是说,模型名、下载包、评测语料三者的对应关系可以直接在源码中查证。
方式一:通过 torch.hub 快速交互翻译
这是文档推荐的最低门槛用法。由于分词与 BPE 依赖预处理工具,先安装额外依赖:
pip install sacremoses subword_nmt然后通过 PyTorch Hub 交互式翻译:
import torch # 列出所有可用模型 torch.hub.list('pytorch/fairseq') # [..., 'transformer.wmt16.en-de', ... ] # 加载在 WMT'16 英-德上训练的 Transformer en2de = torch.hub.load('pytorch/fairseq', 'transformer.wmt16.en-de', tokenizer='moses', bpe='subword_nmt') # 底层模型存放在 *models* 属性下 assert isinstance(en2de.models[0], fairseq.models.transformer.TransformerModel) # 翻译一句话 en2de.translate('Hello world!') # 'Hallo Welt!'源码层面,torch.hub的整个接入逻辑集中在 hubconf.py:
- 文件顶部声明了
dependencies(numpy、regex、requests、torch);若 Cython 加速模块token_block_utils_fast缺失,会在加载时自动触发build_ext --inplace现场编译(见 hubconf.py#L21-L38); - 通过导入
BPEHubInterface与TokenizerHubInterface(定义于fairseq/hub_utils.py),分别暴露为 Hub 接口的bpe和tokenizer命名空间——这就是tokenizer='moses'、bpe='subword_nmt'这类字符串参数的解析入口; - 最后遍历
MODEL_REGISTRY,把每个模型类的hub_models()键注册为 Hub 入口(hubconf.py#L41-L48),torch.hub.load(...)实际调用的是该类from_pretrained(model_name)的部分应用(partial)。
因此加载失败或模型名写错时,报错信息会指向hub_models()的键,对照 transformer.py 与 fconv.py(本仓库实际路径见infoxlm/fairseq/fairseq/models/)中的注册表即可排查。
方式二:CLI 批量生成与 BLEU 评估
对评测集做批量生成是文档给出的第二条主线。以下命令以 WMT'14 英-法卷积模型为例(原文档标注在 GTX-1080ti 上运行):
mkdir -p># Compute BLEU score grep ^H /tmp/gen.out | cut -f3- > /tmp/gen.out.sys grep ^T /tmp/gen.out | cut -f2- > /tmp/gen.out.ref fairseq-score --sys /tmp/gen.out.sys --ref /tmp/gen.out.ref # BLEU4 = 40.83, 67.5/46.9/34.4/25.5 (BP=1.000, ratio=1.006, syslen=83262, reflen=82787)关键参数含义(结合 fairseq_cli/generate.py 与 fairseq_cli/score.py 的实现):
--beam 5:束搜索宽度;--batch-size 128:批大小,直接影响吞吐(原文档实测约 580 tokens/s);--remove-bpe:生成后还原 BPE 子词;若训练时用的是 SentencePiece,则应写--remove-bpe=sentencepiece(多语言一节中即如此使用);fairseq-score的--order默认为 4(即 BLEU4),可选--ignore-case、--sacrebleu等开关,其内部调用fairseq/bleu.py的计分逻辑(见 fairseq_cli/score.py#L13-L21)。
grep ^H/grep ^T依赖fairseq-generate的输出协议:每行句对以H行(Hypothesis)与T行(Target)交替打印,这是解析评估结果的稳定依据。
训练新模型(一):IWSLT'14 德英 Transformer
这是文档给出的 Transformer 翻译最小完整示例。
第一步:下载与二值化(在infoxlm/fairseq/根目录下执行):
# Download and prepare the data cd examples/translation/ bash prepare-iwslt14.sh cd ../.. # Preprocess/binarize the data TEXT=examples/translation/iwslt14.tokenized.de-en fairseq-preprocess --source-lang de --target-lang en \ --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ --destdir>CUDA_VISIBLE_DEVICES=0 fairseq-train \ >fairseq-generate># Download and prepare the data cd examples/translation/ # WMT'17 data: bash prepare-wmt14en2de.sh # or to use WMT'14 data: # bash prepare-wmt14en2de.sh --icml17 cd ../.. # Binarize the dataset TEXT=examples/translation/wmt17_en_de fairseq-preprocess \ --source-lang en --target-lang de \ --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ --destdir># Download and prepare the data cd examples/translation/ bash prepare-wmt14en2fr.sh cd ../.. # Binarize the dataset TEXT=examples/translation/wmt14_en_fr fairseq-preprocess \ --source-lang en --target-lang fr \ --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ --destdir>pip install sacrebleu sentencepiece cd examples/translation/ bash prepare-iwslt17-multilingual.sh cd ../..第二步:分两次二值化两个方向的数据。注意第二次必须复用第一次生成的英语词典:
# Binarize the de-en dataset TEXT=examples/translation/iwslt17.de_fr.en.bpe16k fairseq-preprocess --source-lang de --target-lang en \ --trainpref $TEXT/train.bpe.de-en --validpref $TEXT/valid.bpe.de-en \ --joined-dictionary \ --destdir># NOTE: the command below assumes 1 GPU, but accumulates gradients from # 8 fwd/bwd passes to simulate training on 8 GPUs mkdir -p checkpoints/multilingual_transformer CUDA_VISIBLE_DEVICES=0 fairseq-train># Generate and score the test set with sacrebleu SRC=de sacrebleu --test-set iwslt17 --language-pair ${SRC}-en --echo src \ | python scripts/spm_encode.py --model examples/translation/iwslt17.de_fr.en.bpe16k/sentencepiece.bpe.model \ > iwslt17.test.${SRC}-en.${SRC}.bpe cat iwslt17.test.${SRC}-en.${SRC}.bpe \ | fairseq-interactive contenteditable="false">【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities
项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考