由于在RHEL机器上编译VW很困难,我选择不使用Ariel Faigon提供的VW编译版本(谢谢!)。我从Python调用VW,所以我计划使用Python的子流程模块(我也无法编译Python包)。我想知道这种方法是否会有任何负面影响。我会看到任何性能滞后吗?
非常感谢你的帮助!
通过Python的subprocess
提供实时的vowpal wabbit进程是可以的(快速)。只要你不按照每个例子启动一个新的过程,并避免过多的上下文切换。根据我的经验,在这种设置中,在典型的双核硬件上,您可以预期每秒约500k个功能的吞吐量。这不如vw在不与任何其他软件交互(从文件/缓存读取)时通常处理的速度(快10倍)~5M功能/秒,但对于大多数实际用途来说已经足够好了。请注意,此设置中的瓶颈很可能是附加进程的处理,而不是vowpal-wabbit本身。
建议在输入(馈送vw)和输出(读取vw响应)时分批馈送木瓜(一次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外部处理过多(例如,首先生成示例,特征转换)
- 每个示例的启动开销(例如读取模型)
因此,在必须与其他进程交互的情况下,避免所有上述陷阱应该会使您获得尽可能快的吞吐量。