机器翻译是扩大网络内容可及性的一个重要工具。通常情况下,人们使用云提供商来翻译网页。最先进的神经机器翻译(NMT)模型很大,通常需要像GPU这样的专门硬件来实时运行推理。
如果人们能够在他们的本地机器CPU上运行一个紧凑的机器翻译(MT)模型,而不牺牲翻译精度,这将有助于保护隐私和降低成本。
Bergamot项目是Mozilla、爱丁堡大学、布拉格查尔斯大学、谢菲尔德大学和塔尔图大学之间的合作,由欧盟的地平线2020研究和创新计划资助。它将MT带到本地环境中,提供小型、高质量、CPU优化的NMT模型。火狐翻译的网络扩展利用了Bergamot项目的程序,将本地翻译带到了火狐。
在这篇文章中,我们将讨论用于训练我们的高效NMT模型的组件。该项目是开源的,所以你也可以尝试一下,并训练你的模型。
架构
NMT模型被训练成语言对,从语言A翻译到语言B。训练管道被设计成对语言对进行端到端的翻译模型训练,从环境配置到输出可使用的模型。考虑到相同的代码、硬件和配置文件,该管道的运行是完全可重复的。
该管道的复杂性来自于产生一个高效模型的要求。我们使用师生蒸馏法将一个高质量但资源密集的教师模型压缩成一个高效的CPU优化的学生模型,该模型仍然具有良好的翻译质量。我们在压缩部分进一步解释。
该管道包括许多步骤:编译组件、下载和清理数据集、训练教师、学生和后向模型、解码、量化、评估等(更多细节见下文)。该管道可以被表示为一个直接无环图(DAG)。

工作流程基于文件,采用自给自足的脚本,使用磁盘上的数据作为输入,并将中间和输出结果写回磁盘。
我们使用玛丽安神经机器翻译引擎。它是用C++编写的,设计得非常快。该引擎是开源的,被许多大学和公司使用,包括微软。
训练一个高质量的模型
该管道的第一个任务是训练一个高质量的模型,稍后将进行压缩。这一阶段的主要挑战是找到一个好的平行语料库,其中包含源语言和目标语言中相同句子的翻译,然后应用适当的清理程序。
数据集
事实证明,互联网上有许多用于机器翻译的开源平行数据集。汇集此类数据集的最有趣的项目是OPUS。机器翻译年会也收集和分发一些用于竞赛的数据集,例如WMT21新闻的机器翻译。另一个很棒的MT语料库来源是Paracrawl项目。
OPUS数据集搜索界面。

可以使用磁盘上的任何数据集,但从开放源码资源中自动下载数据集,可以很容易地添加新的语言对,而且每当数据集扩大时,我们可以很容易地重新训练模型,以利用额外的数据。在使用之前,请确保检查开源数据集的许可证。
数据清洗
大多数开源数据集都有一定的噪音。好的例子是抓取的网站和翻译的字幕。来自网站的文本可能是质量很差的自动翻译,或者包含意想不到的HTML,而字幕往往是自由形式的翻译,改变了文本的含义。
众所周知,在机器学习(ML)的世界里,如果我们向模型中输入垃圾,就会得到垃圾的结果。数据集的清理可能是实现良好质量的管道中最关键的一步。
我们采用了一些基本的清理技术,这些技术对大多数数据集都有效,比如删除太短或太长的句子,并过滤那些具有不现实的源与目标长度比的句子。我们还使用了bicleaner,一个预先训练好的ML分类器,试图指出数据集中的训练例子是否是一个可逆的翻译。然后,我们可以删除低分的翻译对,这些翻译对可能是不正确的,或以其他方式增加不需要的噪音。
当你的训练集很大时,自动化是必要的。然而,我们总是建议手动查看你的数据,以便调整清理阈值,并添加针对数据集的修复,以获得最佳质量。
数据扩充
世界上有超过7000种语言,其中大多数被归类为低资源语言,这意味着几乎没有可用于训练的平行语料库数据。在这种情况下,我们使用一种流行的数据增强策略,即反翻译。
背译是一种通过增加合成翻译来增加可用训练数据量的技术。我们通过训练一个从目标语言到源语言的翻译模型来获得这些合成例子。然后,我们用它将单语数据从目标语言翻译成源语言,创造出合成例子,添加到我们实际想要的模型的训练数据中,从源语言到目标语言。
模型
最后,当我们有一个干净的平行语料库时,我们要训练一个大的转化器模型,以达到我们所能达到的最佳质量。
一旦模型在增强的数据集上收敛,我们就在不包括回译合成例子的原始平行语料库上对其进行微调,以进一步提高质量。
压缩
根据配置的不同,训练好的模型可能有800Mb或更大,需要大量的计算能力来执行翻译(解码)。在这一点上,它通常是在GPU上执行的,在大多数消费者的笔记本电脑上运行是不现实的。在接下来的步骤中,我们将准备一个能在消费者CPU上有效工作的模型。
知识提炼
我们用于压缩的主要技术是教师-学生知识蒸馏法。我们的想法是使用我们训练的重型模型(教师)将大量的文本从源语言解码成目标语言,然后在这些合成的翻译上训练一个参数更少的模型(学生)。学生应该模仿老师的行为,并表现出类似的翻译质量,尽管其速度明显更快、更紧凑。
我们还用源语言的单语数据来增加平行语料库的数据,用于解码。这通过提供更多的教师行为的训练例子来提高学生的水平。
集合
另一个技巧是不只使用一个老师,而是使用2-4个老师在同一平行语料库上独立训练的集合体。它可以提高一点质量,但代价是必须训练更多的教师。该流水线支持使用教师集合体进行训练和解码。
量化
一种比较流行的模型压缩技术是量化。我们使用8位量化,这基本上意味着我们将神经网络的权重存储为int8而不是float32。它节省了空间,并加快了推理中的矩阵乘法。
其他技巧
其他值得一提的功能,但超出了这篇已经很长的文章的范围,包括学生模型的专门的神经网络架构,教师模型的半精度解码以加快它的速度,词汇短名单,单词排列的训练,以及量化学生的微调。
是的,这是一个很大的问题!现在你可以明白为什么我们要有一个端到端的管道了。
如何学习更多
这项工作是基于大量的研究。如果你对训练管道背后的科学感兴趣,请查看训练管道存储库README和整个更广泛的Bergamot项目中列出的参考出版物。爱丁堡向2020年机器翻译效率任务提交的资料是一篇很好的学术入门文章。查看Nikolay Bogoychev的教程,了解更多关于步骤的实践和操作解释。
结果
最终的学生模型比原来的教师模型小47倍,快37倍,而且质量只下降了一点点
en-pt模型和Flores数据集的基准测试。
| 模型 | 规模 | 参数总数 | 数据集在1个CPU核心上的解码时间 | 质量,BLEU |
| 教师 | 798Mb | 192.75M | 631s | 52.5 |
| 学生量化 | 17Mb | 15.7M | 17.9s | 50.7 |
我们使用MT标准BLEU分数来评估结果,该分数基本上代表了翻译文本和参考文本的相似程度。这种方法并不完美,但事实证明,BLEU分数与人类对翻译质量的判断有很好的相关性。
我们有一个GitHub仓库,里面有所有训练好的模型和评估结果,我们把我们的模型的准确性与云供应商的流行API进行比较。我们可以看到,一些模型的表现与云提供商相似,甚至超过了云提供商,考虑到我们模型的效率、可重复性和开源性质,这是一个很好的结果。
例如,在这里你可以看到Mozilla仅使用开源数据训练的英语到葡萄牙语模型的评估结果。

任何人都可以训练模型并将其贡献到我们的资料库中。这些贡献可以在火狐翻译网络扩展和其他地方使用(见下文)。
规模化
当然,在一台机器上运行整个管道是可能的,尽管这可能需要一段时间。该管道的一些步骤是与CPU绑定的,难以并行化,而其他步骤可以卸载到多个GPU上。资源库中的大多数官方模型都是在有8个GPU的机器上训练的。有几个步骤,比如知识提炼过程中的教师解码,即使在资源充足的单机上也要花费数天时间。因此,为了加快进度,我们增加了集群支持,以便能够将管道的不同步骤分散到多个节点上。
工作流管理器
为了管理这种复杂性,我们选择了在生物信息学界非常流行的Snakemake。它使用基于文件的工作流程,允许在Python中指定步骤的依赖性,支持容器化并与不同的集群软件集成。我们考虑了专注于工作调度的其他解决方案,但最终选择了Snakemake,因为它对单次实验的工作流程更符合人体工程学。
Snakemake规则的例子(规则之间的依赖关系是隐含地推断出来的)。
rule train_teacher:
message: "Training teacher on all data"
log: f"{log_dir}/train_teacher{{ens}}.log"
conda: "envs/base.yml"
threads: gpus_num*2
resources: gpu=gpus_num
input:
rules.merge_devset.output,
train_src=f'{teacher_corpus}.{src}.gz',
train_trg=f'{teacher_corpus}.{trg}.gz',
bin=ancient(trainer),
vocab=vocab_path
output: model=f'{teacher_base_dir}{{ens}}/{best_model}'
params:
prefix_train=teacher_corpus,
prefix_test=f"{original}/devset",
dir=directory(f'{teacher_base_dir}{{ens}}'),
args=get_args("training-teacher-base")
shell: '''bash pipeline/train/train.sh \
teacher train {src} {trg} "{params.prefix_train}" \
"{params.prefix_test}" "{params.dir}" \
"{input.vocab}" {params.args} >> {log} 2>&1'''
集群支持
为了在集群节点上并行化工作流步骤,我们使用Slurm资源管理器。它的操作相对简单,很适合高性能的实验工作流程,并且支持Singularity容器,更容易重现。Slurm也是学术界用于模型训练的最流行的高性能计算机(HPC)的集群管理器,大多数联盟伙伴已经在使用或熟悉它。
如何开始训练
该工作流程是相当资源密集型的,所以你需要一个相当好的服务器机器,甚至是一个集群。我们建议每台机器使用4-8个Nvidia 2080等效或更好的GPU。
克隆github.com/mozilla/fir…,并按照readme中的说明进行配置。
最重要的部分是找到并行数据集,并根据你的可用数据和硬件正确配置设置。你可以在自述文件中了解更多这方面的信息。
如何使用现有模型
现有模型与Firefox Translations网络扩展一起运送,使用户能够在Firefox中翻译网页。这些模型是按要求下载到本地机器的。网络扩展使用这些模型与编译为Web Assembly的 bergamot-translatorMarian包装器。
另外,在mozilla.github.io/translate,有一个游戏网站,你可以在那里输入文本并立即进行翻译,也是在本地,但作为一个静态网站而不是浏览器扩展提供服务。
如果你对服务器上高效的NMT推理感兴趣,你可以试试一个原型的HTTP服务,它使用了本地编译的bergamot-translator,而不是编译成WASM。
或者按照bergamot-translator readme中的构建说明,直接使用C++、JavaScript WASM或Python的绑定。
总结
近年来,机器翻译研究取得了令人瞩目的进展。本地高质量的翻译是未来的趋势,对于公司和研究人员来说,即使没有获得专有数据或大规模计算能力,训练这样的模型也变得越来越实用。
我们希望火狐翻译将为保护隐私、高效、开源的机器翻译设定一个新的标准,让所有人都可以使用。