Commit 4b76ba54 by 曹润柘

合并分支 'master' 到 'caorunzhe'

updates (sec 18, deployment)

查看合并请求 !561
parents 6135e2f0 5ab4cec0
......@@ -23,7 +23,7 @@
\chapter{机器翻译应用技术}
\parinterval 机器翻译的应用场景众多,特别是随着翻译品质的不断提升,有越来越多的机器翻译需求被挖掘出来。但是,仅凭一个翻译引擎是无法满足这些需求的。应用机器翻译时,需要“额外”考虑很多因素,例如,数据加工方式、交互方式、应用的领域等,甚至机器翻译模型也要经过改造才能适应到不同的场景中。
\parinterval 近几年,随着翻译品质的不断提升,越来越多的机器翻译需求被挖掘出来。但是,仅凭一个翻译引擎无法满足如此多样的需求。应用机器翻译技术时,需要“额外”考虑很多因素,例如,数据加工方式、交互方式、应用的领域等,甚至机器翻译模型也要经过改造才能适应到不同的场景中。
\parinterval 本章将重点介绍机器翻译应用中所面临的问题,以及解决这些问题可以采用的策略。本章所涉及的内容较为广泛,一方面会大量使用本书前十七章的模型和方法,另一方面也会介绍新的技术手段。最终,本章会结合机器翻译的特点展示机器翻译可能的应用场景,并进行一些对机器翻译未来的思考。
......@@ -33,21 +33,21 @@
\section{机器翻译的应用并不简单}
\parinterval 机器翻译一直是自然语言处理的热点,无论从评测比赛的结果,还是论文发表数量上看,机器翻译的研究可谓火热。但是,客观的说,我们离机器翻译完美的应用还有相当的距离。这主要是因为,成熟的系统需要很多技术的融合。因此,机器翻译系统研发也是一项复杂的系统工程。而机器翻译研究大多是对局部模型和方法的调整,这也会造成一个现象,很多论文里报道的技术方法可能无法直接应用于真实场景的系统。当然,也并不是本书所要讨论的,这里更加关注如何对具体的机器翻译应用问题进行求解。有几方面挑战:
\parinterval 机器翻译一直是自然语言处理的热点,无论从评测比赛的结果,还是论文发表数量上看,机器翻译的研究可谓火热。但是,客观的说,我们离机器翻译完美的应用还有相当的距离。这主要是因为,成熟的系统需要很多技术的融合。因此,机器翻译系统研发也是一项复杂的系统工程。而机器翻译研究大多是对局部模型和方法的调整,这也会造成一个现象,很多论文里报道的技术方法可能无法直接应用于真实场景的系统。因此,需要关注如何对具体的机器翻译应用问题进行求解,使机器翻译技术能够落地。有几方面挑战:
\begin{itemize}
\vspace{0.5em}
\item {\small\bfnew{机器翻译模型很脆弱}}。实验环境下,给定翻译任务,甚至给定训练和测试数据,机器翻译模型可以表现的很好。但是,真实的应用场景是不断变化的。经常会出现训练数据缺乏、应用领域与训练数据不匹配、用户的测试方法与开发者不同等等一系列问题。特别是,对于不同的任务,神经机器翻译等模型需要进行非常细致的调整,理想中一套``包打天下''的模型和设置是不存在的。这些都导致一个结果:直接使用既有机器翻译模型很难满足真实应用的需求。
\item {\small\bfnew{机器翻译模型很脆弱}}。实验环境下,给定翻译任务,甚至给定训练和测试数据,机器翻译模型可以表现的很好。但是,应用场景是不断变化的。经常会出现训练数据缺乏、应用领域与训练数据不匹配、用户的测试方法与开发者不同等等一系列问题。特别是,对于不同的任务,神经机器翻译等模型需要进行非常细致的调整,理想中一套``包打天下''的模型和设置是不存在的。这些都导致一个结果:直接使用既有机器翻译模型很难满足真实应用的需求。
\vspace{0.5em}
\item {\small\bfnew{机器翻译缺少针对场景的应用技术}}。目前为止,机器翻译的研究进展已经为我们提供很好的基础模型。但是,在应用时,用户并不是简单的与这些模型“打交道”,他们更加关注如何解决自身的业务需求,例如,机器翻译应用的交互方式、系统是否可以自己预估翻译可信度等等。甚至,在某些场景中,用户对翻译模型的体积和速度都有非常严格的要求。
\item {\small\bfnew{机器翻译缺少针对场景的应用技术}}。目前为止,机器翻译的研究进展已经为我们提供很好的机器翻译基础模型。但是,用户并不是简单的与这些模型“打交道”,他们更加关注如何解决自身的业务需求,例如,机器翻译应用的交互方式、系统是否可以自己预估翻译可信度等等。甚至,在某些场景中,用户对翻译模型的体积和速度都有非常严格的要求。
\vspace{0.5em}
\item {\small\bfnew{优秀系统的研发需要长时间的打磨}}这不是一个技术问题。因为如果有足够的时间,所有人都可以把任何事情做到极致。但是,不论是为了毕业、提职,还是希望在领域占据一席之地,我们总是希望在尽可能短的时间内把系统研发出来,把结果报道出来。这种做法无可厚非,因为科学研究需要对更本质的科学问题进行探索,而非简单的工程开发与调试。但是,对一个初级的系统进行研究往往会掩盖掉``真正的问题'',因为很多问题在更先进的系统中根本就不存在。
\item {\small\bfnew{优秀系统的研发需要长时间的打磨}}工程打磨也是研发优秀机器翻译系统的必备条件,有些时候甚至是决定性的。从科学研究的角度看,我们需要对更本质的科学问题进行探索,而非简单的工程开发与调试。但是,对一个初级的系统进行研究往往会掩盖掉``真正的问题'',因为很多问题在更优秀的系统中并不存在。
\vspace{0.5em}
\end{itemize}
\parinterval 下面本章将重点对机器翻译应用中的若干技术问题展开讨论,旨在给机器翻译应用提供一些可落地的思路。之后,本章也会结合笔者的经验,对机器翻译的方向展开一些讨论。
\parinterval 下面本章将重点对机器翻译应用中的若干技术问题展开讨论,旨在给机器翻译应用提供一些可落地的思路。之后,本章也会结合笔者的经验,对机器翻译的发展方向展开一些讨论。
%----------------------------------------------------------------------------------------
% NEW SECTION
......@@ -65,28 +65,28 @@
\vspace{0.5em}
\end{itemize}
\parinterval 这时就产生一个问题,能否使用新的数据让系统变得更好?简单直接的方式是,将新的数据和原始数据混合重新训练系统,但是使用全量数据训练模型的周期很长,这种方法成本的很高。而且,新的数据可能是不断产生的,甚至是流式的。这时就需要快速、低成本的方式对模型进行更新。
\parinterval 这时就产生一个问题,能否使用新的数据让系统变得更好?简单直接的方式是,将新的数据和原始数据混合重新训练系统,但是使用全量数据训练模型的周期很长,这种方法的成本很高。而且,新的数据可能是不断产生的,甚至是流式的。这时就需要一种快速、低成本的方式对模型进行更新。
\parinterval 增量训练就是满足上述需求的一种方法。本质上来说,神经机器翻译中使用的随机梯度下降方法就是典型的增量训练方法,其基本思想是:每次选择一个样本对模型进行更新,这个过程反复不断执行,每次模型更新都是一次增量训练。当拥有由多个样本构成的新数据时,可以把这些新样本作为训练数据,把当前的模型作为初始模型,之后正常执行机器翻译的训练过程即可。如果新增加的数据量不大(比如,几万句对),训练的代价非常低。
\parinterval 增量训练就是满足上述需求的一种方法。本质上来说,神经机器翻译中使用的随机梯度下降方法就是典型的增量训练方法,其基本思想是:每次选择一个样本对模型进行更新,这个过程反复不断执行,每次模型更新都是一次增量训练。当多个样本构成了一个新数据集时,可以把这些新样本作为训练数据,把当前的模型作为初始模型,之后正常执行机器翻译的训练过程即可。如果新增加的数据量不大(比如,几万句对),训练的代价非常低。
\parinterval 这里面的一个问题是,新的数据虽然能代表一部分的翻译现象,但是如果仅仅依赖新数据进行更新,会使模型产生对新数据的过分拟合,进而造成无法很好地处理新数据之外的样本。这也可以被看做是一种灾难性遗忘的问题({\color{red} 参考文献!}),即:模型过分注重对新样本的拟合,丧失了旧模型的一部分能力。解决这个问题,有几种思路:
\parinterval 这里面的一个问题是,新的数据虽然能代表一部分的翻译现象,但是如果仅仅依赖新数据进行更新,会使模型对新数据过分拟合,进而造成无法很好地处理新数据之外的样本。这也可以被看做是一种灾难性遗忘的问题({\color{red} 参考文献!}),即:模型过分注重对新样本的拟合,丧失了旧模型的一部分能力。解决这个问题,有几种思路:
\begin{itemize}
\vspace{0.5em}
\item 数据混合。在增量训练时,除了使用新的数据,再混合一定量的旧数据,混合的比例可以训练的代价进行调整。这样,模型相当于在全量数据的一个采样结果上进行更新。
\item 数据混合。在增量训练时,除了使用新的数据,再混合一定量的旧数据,混合的比例可以根据训练的代价进行调整。这样,模型相当于在全量数据的一个采样结果上进行更新。
\vspace{0.5em}
\item 模型插值({\color{red} 参考文献!})。在增量训练之后,将新模型与旧模型进行插值。
\vspace{0.5em}
\item 多目标训练({\color{red} 参考文献!})。在增量训练时,除了在新数据上定义损失函数之外,可以再定义一个在旧数据上的损失函数,这样确保模型可以在两个数据上都有较好的表现。另一种方案是引入正则化项,避免新模型的参数不会偏离旧模型的参数太远。
\item 多目标训练({\color{red} 参考文献!})。在增量训练时,除了在新数据上定义损失函数之外,可以再定义一个在旧数据上的损失函数,这样确保模型可以在两个数据上都有较好的表现。另一种方案是引入正则化项,使新模型的参数不会偏离旧模型的参数太远。
\vspace{0.5em}
\end{itemize}
\parinterval {\color{red} 图XXX}给出了上述方法的对比。在实际应用中,还有很多细节会影响增量训练的效果,比如,学习率大小的选择等。另外,新的数据积累到何种规模可以进行增量训练也是实践中需要解决问题。一般来说,增量训练使用的数据量越大,训练的效果越稳定。但是,这并不是说数据量少就不可以进行增量训练,而是如果数据量过少时,需要考虑训练代价和效果之间的平衡。而且,过于频繁的增量训练也会带来更多的灾难性遗忘的风险,因此合理进行增量训练也是应用中需要实践的。
\parinterval 理想状态下,系统使用者会希望,系统看到少量句子就可以很好地解决一类翻译问题,即:进行真正的小样本学习。但是,现实的情况是,现在的机器翻译系统还无法很好的做到“举一反三”。增量训练也需要专业人士完成才能得到相对较好的效果。
\parinterval 主要注意的是,理想状态下,系统使用者会希望系统看到少量句子就可以很好地解决一类翻译问题,即:进行真正的小样本学习。但是,现实的情况是,现在的机器翻译系统还无法很好的做到“举一反三”。增量训练也需要专业人士完成才能得到相对较好的效果。
\parinterval 另一个实际的问题是,当应用场景没有双语句对时是否可以优化系统?这个问题在{\chaptersixteen}的领域适应部分进行了一些讨论。一般来说,如果目标任务没有双语数据,仍然可以使用单语数据进行优化。常用的方法有数据增强、基于语言模型的方法等。具体方法可以参考{\chaptersixteen}的内容。
......@@ -108,7 +108,7 @@
\section{小设备机器翻译}
\parinterval 在机器翻译研究中,一般会假设计算资源是充足的。但是,在很多应用场景中,机器翻译使用的计算资源是非常有限的,比如,一些离线设备上没有GPU处理器,而且CPU的处理能力也很弱,甚至内存也非常有限。这时,让模型变得更小、系统变得更快就成为了一个重要的需求。
\parinterval 在机器翻译研究中,一般会假设计算资源是充足的。但是,在很多应用场景中,机器翻译使用的计算资源非常有限,比如,一些离线设备上没有GPU处理器,而且CPU的处理能力也很弱,甚至内存也非常有限。这时,让模型变得更小、系统变得更快就成为了一个重要的需求。
\parinterval 本书中已经讨论了大量的技术方法,可用于小设备上的机器翻译,例如:
......@@ -117,7 +117,7 @@
\item 知识蒸馏({\chapterthirteen})。这种方法可以有效地把翻译能力从大模型迁移到小模型。
\vspace{0.5em}
\item 低精度存储及计算({\chapterfourteen})。可以使用量化的方式将模型压缩,同时使用整数等数据类型也非常适合在CPU等设备上执行。
\item 低精度存储及计算({\chapterfourteen})。可以使用量化的方式将模型压缩,同时整数型计算也非常适合在CPU等设备上执行。
\vspace{0.5em}
\item 轻量模型结构({\chapterfourteen}{\chapterfifteen})。对机器翻译模型的局部结构进行优化也是非常有效的手段,比如,使用更加轻量的卷积计算模块,或者使用深编码器-浅解码器等结构等。
......@@ -126,12 +126,12 @@
\item 面向设备的结构学习({\chapterfifteen})。可以把设备的存储及延时作为目标函数的一部分,自动搜索高效的翻译模型结构。
\vspace{0.5em}
\item 动态适应性模型(引用:王强emnlp findings,还有Adaptive neural networks for fast test-time prediction,Multi-scale dense networks for resource efficient image classification)。模型可以动态调整大小或者计算规模,以达到在不同设备上平衡延时和精度的目的。比如,可以根据延时的要求,动态生成合适深度的神经网络模型进行翻译。
\item 动态适应性模型(引用:王强emnlp findings,还有Adaptive neural networks for fast test-time prediction,Multi-scale dense networks for resource efficient image classification)。模型可以动态调整大小或者计算规模,以达到在不同设备上平衡延时和精度的目的。比如,可以根据延时的要求,动态生成合适深度的神经网络模型进行翻译。
\vspace{0.5em}
\end{itemize}
\parinterval 此外,机器翻译系统的工程实现方式也是十分重要的,例如,编译器的选择、底层线性代数库的选择等等。有时候,使用与运行设备相匹配的编译器\footnote{以神经机器翻译为例,张量计算大多使用C++等语言编写,因此编译器与设备的适配程度对程序的执行效率影响很大。},会带来明显的性能提升。如果希望追求更加极致的性能,甚至需要对一些热点模块进行修改。例如,在神经机器翻译中,矩阵乘法就是一个非常耗时的部分。但是这部分计算又与设备、矩阵的形状有很大关系。对于不同设备,根据不同的矩阵形状可以设计相应的矩阵乘法算法。不过,这部分工作对系统开发和硬件指令的使用水平要求较高。
\parinterval 此外,机器翻译系统的工程实现方式也是十分重要的,例如,编译器的选择、底层线性代数库的选择等等。有时候,使用与运行设备相匹配的编译器\footnote{以神经机器翻译为例,张量计算部分大多使用C++等语言编写,因此编译器与设备的适配程度对程序的执行效率影响很大。},会带来明显的性能提升。如果希望追求更加极致的性能,甚至需要对一些热点模块进行修改。例如,在神经机器翻译中,矩阵乘法就是一个非常耗时的部分。但是这部分计算又与设备、矩阵的形状有很大关系。对于不同设备,根据不同的矩阵形状可以设计相应的矩阵乘法算法。不过,这部分工作对系统开发和硬件指令的使用水平要求较高。
\parinterval 另一个工程问题是,在很多系统中,机器翻译模块并不是单独执行,而是与其他的模块并发执行。这时,由于多个计算密集型任务存在竞争,处理器要进行更多的上下文切换,会造成程序变慢。比如,机器翻译和语音识别两个模块一起运行时{\footnote{在一些语音翻译场景中,由于采用了语音识别和翻译异步执行的方式,两个程序可能会并发。}},机器翻译的速度会有较明显的下降。对于这种情况,需要设计更好的调度机制。而且在一些同时具有CPU和GPU的设备上,可以考虑合理调度CPU和GPU的资源,增加两种设备可并行处理的内容,避免在某个处理器上的拥塞。
......@@ -143,15 +143,28 @@
\section{机器翻译系统部署}
单模型多语言系统
\parinterval 除了在一些离线设备上使用机器翻译,更多时候机器翻译系统会部署在运算能力较强的服务器上。特别是随着神经机器翻译的大规模应用,在GPU服务器上部署机器翻译系统已经成为了常态。另一方面,GPU服务器的成本较高,而且很多应用中需要同时部署多个语言方向的系统。这时如何充分利用设备以满足大规模的翻译需求就成为了不可回避的问题。有几个方向值得尝试:
单卡多语言
\begin{itemize}
\vspace{0.5em}
\item 对于多语言翻译的场景,使用单模型多语言翻译系统是一种很好的选择({\chaptersixteen})。当多个语种的数据量有限、使用频度不高时,这种方法可以很有效地解决翻译需求中长尾部分。例如,一些线上机器翻译服务已经支持超过100种语言的翻译,其中大部分语言之间的翻译需求是相对低频的,因此使用同一个模型进行翻译可以大大节约部署和运维的成本。
\vspace{0.5em}
\item 使用基于中介语言的翻译也可以有效的解决多语言翻译问题({\chaptersixteen})。这种方法同时适合统计机器翻译和神经机器翻译,因此很早就使用在大规模机器翻译部署中。
技术问题:
\vspace{0.5em}
\item GPU部署中,由于GPU成本较高,因此可以考虑在单GPU设备上部署多套不同的系统。如果这些系统之间的并发不频繁,翻译延时不会有明显增加。这种多个模型共享一个设备的方法比较适合翻译请求相对低频但是翻译任务又很多样的情况。
\vspace{0.5em}
\item 机器翻译大规模GPU部署对显存的使用也很严格。由于GPU显存较为有限,因此模型运行的显存消耗也是需要考虑的。一般来说,除了模型压缩和结构优化之外({\chapterfourteen}{\chapterfifteen}),也需要对模型的显存分配和使用进行单独的优化。例如,使用显存池来缓解频繁申请和释放显存空间造成的延时。另外,也可以尽可能让同一个显存块保存生命期不重叠的数据,避免重复开辟新的存储空间。图XXX 展示了一个显存复用的示例。
\vspace{0.5em}
\item 在翻译请求高并发的场景中,使用批量翻译也是有效利用GPU设备的方式。不过,机器翻译是一个处理不定长序列的任务,输入的句子长度差异较大。而且,由于译文长度无法预知,进一步增加了不同长度的句子所消耗计算资源的不确定性。这时,可以让长度相近的句子在一个批次里处理,减小由于句子长度不统一造成的补全过多、设备利用率低的问题。例如,可以按输入句子长度范围分组,如图XXX。 也可以设计更加细致的方法对句子进行分组,以最大化批量翻译中设备的利用率({\color{red} 参考文献:TurboTransformers: An Efficient GPU Serving System For Transformer Models})。
显存优化
\vspace{0.5em}
\end{itemize}
batching策略(长度近似的放到一起,但是目标端长度无法预测,增加了难度)
\parinterval 除了上述问题,如何对多设备环境下进行负载均衡、容灾处理等都是大规模机器翻译系统部署中需要考虑的。有时候,甚至统计机器翻译系统也可以与神经机器翻译系统混合使用。由于统计机器翻译系统对GPU设备的要求较低,纯CPU部署的方案也相对成熟。因此,可以作为GPU机器翻译服务的灾备。此外,在有些任务,特别是低资源翻译任务上,统计机器翻译仍然具有优势。
%----------------------------------------------------------------------------------------
% NEW SECTION
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论