LIBSVM是否线程安全?

4
我希望在使用LIBSVM时能够利用今天的CPU多核能力。我想知道/理解的是,我是否可以安全地从多个线程同时调用LIBSVM服务(例如,在参数调整过程中使用不同参数对8个不同模型调用svm_train())。
我唯一找到的参考资料是LIBSVM网站上的这篇文章: Q:如何在多核/共享内存计算机上使用OpenMP并行化LIBSVM? 问题在于它只谈到了训练函数本身的算法(代码)的并行化,而没有提到同时多次调用训练函数 - 我更喜欢这种方式,因为它可以更好地控制交叉验证和参数调整/网格搜索过程。
注意:我正在使用LIBSVM软件包本身(目前是Java实现,可能也会使用Python)。
1个回答

3
我了解您想在8个不同的问题实例和不同的参数上调用svm_train()以获得不同的模型实例!
当我查看Java源代码时,我发现问题和参数实例只是被读取,并没有写入它们。该方法自行创建所有需要修改和存储数据的对象,最后返回所创建的模型。
这意味着从多个线程调用svm_train()应该不会有问题。

谢谢 @fatih 对代码的检查,这个想法没在我脑袋里浮现过。尽管如此,在多线程环境下我进行了测试,并且我的有限测试结果支持你的结论。 我猜最好能确认一下这个库是不是考虑到了并发性。多线程是一个棘手的任务,即使看起来合理,如果没有正确执行,很容易被忽视。 由于我找不到任何这样的确认,或者至少找不到有实际经验在多线程环境中使用它的人,对代码的信任只能凭空产生 :-) - MLearner
我同意你的观点。你能告诉我哪里有代码实现不支持多线程吗? - fatih
我觉得你误解了我的意思 - 我并没有声称代码或其中的某些部分不支持多线程。我找不到证实(甚至是用例)表明LibSvm是按设计进行多线程处理的。这样的确认将会(希望)保证该库:1)已经测试并验证了这种用法2)在未来版本中仍然如此 - 这些问题无法通过代码审查来保证。话虽如此,知道代码不存在并发违规(感谢您的努力)在这种情况下使用它时肯定会让人放心。 - MLearner
是的,看起来我误解了你 :) 谢谢你的解释。特别是第二点真的非常重要。 - fatih
Fatih,我遇到了问题。看起来不是线程安全的:http://stackoverflow.com/questions/33136650/libsvm-attempted-to-read-or-write-protected-memory-this-is-often-an-indicatio - Furkan Gözükara
我们从未谈论过原始的C实现或C#包装器。它们可能不是线程安全的。我们从未与它们一起工作过。 - fatih

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接