参与:李泽南、高静宜 Apache Spark 是用于大规模数据处理的快速和通用引擎,它运行在 Hadoop,Mesos,可以离线或云端运行,具有高速、可扩展等特点。近年来,在 IBM 等大公司和众多社区贡献者的推动下,Spark 得到了越来越多的应用。今天,Facebook 团队也展示了他们使用 Apache Spark 进行大型语言模型训练的方法。 如何处理大规模数据是 Facebook 基础设施团队面临的核心问题。随着软件技术的发展,我们面临着越来越高的硬件需求,为了满足需要,我们必须在开源架构上设计并构建新的系统。 考虑到我们的需求,我们决定使用 Apache Spark,一个快速发展的开源数据处理平台,它可以自由扩展,支持用户自定义应用。 几个月前,我们分享了一个支持 Spark 声明(SQL)的的例子。在本文中,我们将简要介绍如何使用 Spark 重新设计一个大型、复杂(100 余级)的管道,而这个管道最初是使用 HQL 在 Hive 上编写的。在此之中,我们会介绍如何控制数据分布,避免数据偏移,并实现对特定应用程序的优化,以构建高性能及可靠的数据管道。与原来的 HQL 查询集相比,这种新的基于 Spark 的管道是模块化的,高度可读且易于维护的。除了质量提升之外,我们还观察到它的资源使用和数据登录时间也有减少。 使用案例:N-gram 语言模型训练 自然语言处理是涉及计算机和人类语言之间相互作用的人工智能领域。计算机可以对语言进行建模,此类模型可用于检测和纠正拼写错误。N-gram 语言模型是其中使用最广泛的语言建模方法。N-gram 通常以 N-x 方式呈现,其中前 N-1 个字作为历史,基于 N-1 的历史来预测下一个字。例如,「你能来这里吗(Can you please come here)」包含 5 个单词,是一个 5-gram。它的历史是「你能来吗(Can you please come)」基于这个历史,N-gram 语言模型可以计算出单词「这里。(here.)」的条件概率。
大规模、高阶的 N-gram 语言模型(例如 N = 5)已经被证明在许多应用中非常有效,例如自动语音识别和机器翻译。在 Facebook 中,它被用于为上传到时间线的视频自动生成字幕,探测可能低质量的地址标签(如「家,温暖的家」,「Apt#00,Fake lane,Foo City」)。 用大数据集训练的语言模型与用较小数据集训练的语言模型相比,前者通常具有更高的准确性。覆盖罕见单词(或 N-gram)充分实例的可能性会随着数据集体量的增大而增加。对于具有较大数据集的训练任务,分布式计算框架(如 MapReduce)通常具有更好的可扩展性,可进行并行化模型训练。 早期解决方案 我们最初开发了一个基于 Hive 的解决方案来生成 N-gram 语言模型。N-gram 计数由最后两个字的历史记录分割,使用基于 C ++的 TRANSFORM 来判断局部语言模型,并将它们保存在 Hive 中。单独的子模型建立在不同的数据源上,每个都由 Hive 查询触发。随后,每个子模型被插值算法计算权重,最后所有子模型被组合输出。以下是管道的概述: 基于 Hive 的解决方案在构建语言模型中获得了一定程度的成功:当使用几百万 N-gram 训练时,我们能用它轻松地构建 5-gram 语言模型。然而一旦我们试图增加训练数据集的大小,运行管道的端到端时间就会达到不可接受的程度。 Hive 提供了一个基于 SQL 的引擎,可以轻松地编写查询,这些查询会自动转换为 MapReduce 作业。对于训练语言模型而言,将计算表示为 SQL 查询是不自然的,原因如下: 管道代码,包括每个子模型训练的几个 SQL 查询。这些查询大部分是相似的,只有细微的差别。为模型训练而编写新的管道会导致这些 SQL 查询重复。 当越来越多的子句被添加到查询中时,系统会越来越难以理解查询的意图。 更改查询的一部分需要重新运行整个管道,以确保不会导致回归。无法测试隔离变化使得开发周期变长。 作为替代方法,编写 Hadoop 作业在表达计算方面为开发人员提供了更多的自由,但这也需要更多的时间,需要我们具有 Hadoop 的专业知识。 基于 Spark 的解决方案 (责任编辑:本港台直播) |