Skip to main content
Version: Next

Apache Spark上的VowpalWabbit

概述

VowpalWabbit (VW) 是一个机器学习系统,它通过在线学习、哈希、allreduce、reductions、learning2search、主动学习和交互学习等技术推动机器学习的前沿。由于其速度和成本效益,VowpalWabbit 在广告技术领域是一个受欢迎的选择。此外,它还包括强化学习领域的许多进展(例如,上下文强盗问题)。

VowpalWabbit的优势

  • 可组合性: VowpalWabbit 模型可以集成到现有的 SparkML 管道中,并用于批处理、流处理和服务工作负载。
  • 小内存占用: VowpalWabbit 的内存消耗相当小,可以通过 '-b 18' 或 setNumBits 方法进行控制。 此选项决定了模型的大小(在此示例中为 2^18 * 某个常数)。
  • 特征交互:特征交互(例如二次、三次等项)在VW的最内层学习循环中动态创建。 可以通过使用-q参数并传递应交互的命名空间的第一个字符来指定交互。 VW的命名空间概念通过列映射到Spark。列名用作命名空间名称,因此一个稀疏或密集的Spark ML向量对应于单个命名空间的特征。 为了允许传递多个命名空间,VW估计器(分类器或回归)暴露了一个名为additionalFeatures的属性。用户可以传递一个列名数组。
  • 简单部署:所有本地依赖项都打包到一个单一的jar文件中(包括boost和zlib)。
  • VowpalWabbit 命令行参数: 用户可以通过传递 VW 命令行参数来控制学习过程。
  • VowpalWabbit 二进制模型 要开始训练,用户可以提供一个初始的 VowpalWabbit 模型,该模型可以在 VW on Spark 之外生成,通过调用 setInitialModel 并将模型作为字节数组传递。同样,用户可以通过在训练好的模型对象上调用 getModel 来访问二进制模型。
  • 基于Java的哈希 VW的murmur-hash版本已在Java中重新实现(感谢JackDoe),与通过JNI传递输入字符串并在C++中进行哈希相比,提供了显著的性能改进。
  • 跨语言 VowpalWabbit on Spark 可在 Spark、PySpark 和 SparklyR 上使用。

VowpalWabbit在Spark上的限制

  • 仅限Linux和CentOS 发布的jar中包含的原生二进制文件仅适用于Linux和CentOS。 我们正在努力通过静态链接Boost和lib C++来创建一个更具可移植性的版本。
  • 有限的解析 在原生VW解析器中实现的功能(如ngrams、skips等)尚未在VowpalWabbitFeaturizer中实现。

用法

在 PySpark 中,你可以通过以下方式运行 VowpalWabbitClassifier

from synapse.ml.vw import VowpalWabbitClassifier
model = (VowpalWabbitClassifier(numPasses=5, args="--holdout_off --loss_function logistic")
.fit(train))

同样地,你可以运行VowpalWabbitRegressor

from synapse.ml.vw import VowpalWabbitRegressor
model = (VowpalWabbitRegressor(args="--holdout_off --loss_function quantile -q :: -l 0.1")
.fit(train))

您可以通过args参数向VW传递命令行参数,如VW Wiki中所述。

要查看端到端应用程序,请查看VowpalWabbit notebook example

超参数调优

  • 通用参数也可以通过方法设置,从而可以使用SparkML的ParamGridBuilder和CrossValidator(示例)。如果相同的参数通过args属性传递(例如,args="-l 0.2"和setLearningRate(0.5)),则args的值将优先。 参数
  • 学习率
  • numPasses
  • numBits
  • l1
  • l2
  • powerT
  • 交互
  • 忽略命名空间

架构

Spark上的VowpalWabbit使用优化的JNI层来高效支持Spark。 Java绑定可以在VW GitHub仓库中找到。

VW的命令行工具使用双线程架构(1x 解析/哈希,1x 学习)进行学习和推理。 为了将VW流畅地嵌入到Spark ML生态系统中,进行了以下调整:

  • VW 分类器/回归器在 Spark 的密集/稀疏向量上运行

    • 优点:与现有的 Spark ML 组件具有最佳的可组合性。
    • 缺点:由于类型限制(例如,特征索引是 Java 整数),最大模型大小限制为 30 位。可以通过向分类器/回归器添加类型支持来直接操作输入特征(字符串、整数、双精度等)来克服此限制。
  • VW 哈希被分离到 VowpalWabbitFeaturizer 转换器中。它支持将 Spark Dataframe 模式映射到 VW 的命名空间和稀疏特征。

    - 优点:特征化可以扩展到多个节点,扩展独立于分布式学习。
    - 优点:哈希特征可以在执行超参数扫描时缓存并高效重用。
    - 优点:特征化可以用于其他 Spark ML 学习算法。
    - 缺点:由于类型限制(例如,稀疏索引是 Java 整数),哈希空间限制为 30 位。
  • 可以使用'--passes 4'参数或setNumPasses方法启用VW多遍训练。缓存文件会自动命名。

    • 优点:简化了使用。
    • 优点:某些算法(例如,l-bfgs)在多遍节点运行时需要缓存文件。
    • 缺点:由于缓存文件位于Java临时目录中,可能会产生瓶颈,具体取决于节点的I/O性能和临时目录的位置。
  • VW分布式训练是透明设置的,可以通过输入数据帧的分区数来控制。 与LightGBM类似,所有训练实例必须同时运行,因此最大并行度受限于集群中可用的执行器数量。在底层,VW的内置生成树功能用于协调allreduce。 所需的参数会自动确定并传递给VW。生成树协调过程在驱动节点上运行。

    • 优点:无缝并行化。
    • 缺点:目前未实现屏障执行模式,因此如果一个节点崩溃,整个作业需要手动重新启动。