使用预编译的Vowpal Wabbit - Downsides?

时间:2017-01-14 02:20:15

标签: vowpalwabbit precompiled

由于在RHEL机器上编译大众的困难,我选择使用Ariel Faigon提供的大众版的编译版本(谢谢!)here。我正在用Python调用VW,所以我打算使用Python的subprocess模块(我也无法编译python包)。我想知道这种方法是否会有任何缺点。我会看到任何性能滞后吗?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

通过Python subprocess提供实时的vowpal wabbit进程是可以的(快速)。只要您不为每个示例启动新进程并避免过多的上下文切换。根据我的经验,在这个设置中,您可以预期在典型的双核硬件上每秒吞吐量约为500k。这并不像(不超过10倍)~5M功能/秒vw通常在不与任何其他软件(从文件/缓存读取)交互时处理一样快,但对于大多数实际目的而言足够好。请注意,此设置中的瓶颈很可能是附加进程的处理,而不是vowpal-wabbit本身。

建议分批输入vowpal-wabbit(一次N个例子,而不是一次一个)输入(喂食大众)和输出(读取大众响应)。如果您使用subprocess.Popen连接到进程,请确保传递大bufsize,否则默认情况下Popen迭代器将进行行缓冲(一次一个示例),这可能会导致每个示例上下文 - 在示例生产者和消费者(vowpal wabbit)之间切换。

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

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

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

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

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