使用n_jobs>运行sklearn函数的简单方法1个内部并行池

时间:2016-08-02 18:26:57

标签: python python-2.7 parallel-processing multiprocessing nested-loops

有没有办法在并行循环中运行sklearn(支持n_jobs参数)?当我尝试在multiprocessing.Pool中使用n_jobs> 1运行sklearn函数时,我收到了警告

UserWarning: Multiprocessing-backed parallel loops cannot be nested, setting n_jobs=1
  for s in split_list(seeds, n_jobs))

那么确实存在一些并行库,它允许嵌套并行化吗?

1 个答案:

答案 0 :(得分:0)

此警告来自joblibsklearn中使用的多处理库。 它的并行机制依赖于multiprocessing.Pool,它使用daemonic无法生成子进程的工作符。

我没有看到通过sklearn通过此限制的任何简单方法。 您可能希望手动创建和管理流程。 如果您知道自己在做什么,可以创建Process并使用它们sklearn运行n_jobs > 1个功能。
这将意味着很多关心管理流程而不是一次性运行它们。 不要让他们daemonic也很重要。 例如:

def target(j):
    from time import sleep
    from sklearn.ensemble import RandomForestClassifier
    rf = RandomForestClassifier(n_jobs=2)
    rf.fit(np.random.random(size=(100, 100)), np.random.random(100)> .6)
    print(j, 'done')
pr = [mp.Process(target=target, args=(i,)) for i in range(10)];\
[p.start() for p in pr]
[p.join() for p in pr]

请注意,所有进程都是同时运行的,这可能导致性能低于顺序实现。

话虽这么说,但使用嵌套并行性的一个好主意并不是很多。 所有核心都应该用于完成任务,其他任务是顺序运行的。