使用 Vowpal Wabbit 的预编译版本 - 缺点?

Using a precompiled version of Vowpal Wabbit - Downsides?

由于在 RHEL 机器上编译 VW 很困难,我选择不使用 Ariel Faigon 提供的 VW 编译版本(谢谢!)here. I'm calling VW from Python, so I am planning on using Python's subprocess 模块(我无法获得python 要编译的包)。我想知道这种方法是否会有任何缺点。我会看到任何性能滞后吗?

非常感谢您的帮助!

通过 Python 的 subprocess 喂养活的 vowpal wabbit 进程是可以的(快速)。只要您不根据示例启动新流程并避免过多的上下文切换。根据我的经验,在此设置中,您可以预期在典型 dual-core 硬件上每秒约 500k 个特征的吞吐量。这不如(快 10 倍)~5M features/sec vw 通常在不与任何其他软件交互时处理(从 file/cache 读取),但对于大多数实际用途来说已经足够好了。请注意,此设置中的瓶颈很可能是附加进程的处理,而不是 vowpal-wabbit 本身。

建议在输入(提供 vw)和输出(读取 vw 响应)时分批提供 vowpal-wabbit(一次 N 个示例,而不是一次一个)。如果您使用 subprocess.Popen 连接到进程,请确保传递一个大的 bufsize 否则默认情况下 Popen 迭代器将是 line-buffered (一次一个示例)这可能会导致在示例生产者和消费者(vowpal wabbit)之间的每个示例中 context-switch。

假设您的 vw 命令行在 vw_cmd 中,它将类似于:

vw_proc = subprocess.Popen(vw_cmd,
                   stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
                   bufsize=1048576)

一般来说,缓慢可能来自:

  • 上下文切换太多(一次生成和处理一个示例)
  • vw 之外的处理太多(例如首先生成示例,特征转换)
  • 每个示例的启动开销(例如读取模型)。

因此,避免上述所有陷阱应该可以在必须与其他进程交互的情况下为您提供最快的吞吐量。