由于在RHEL机器上编译大众的困难,我选择使用Ariel Faigon提供的大众版的编译版本(谢谢!)here。我正在用Python调用VW,所以我打算使用Python的subprocess模块(我也无法编译python包)。我想知道这种方法是否会有任何缺点。我会看到任何性能滞后吗?
非常感谢你的帮助!
答案 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)
一般来说,缓慢可能来自:
因此,在必须与其他流程进行交互的情况下,避免上述所有陷阱应该可以为您提供最快的吞吐量。