在并行池中使用 n_jobs > 1 运行 sklearn 函数的简单方法



有没有办法在并行循环中运行sklearn(支持n_jobs参数(?当我尝试在多处理中使用 n_jobs>1 运行 sklearn 函数时。游泳池,我收到了警告

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

那么是否存在一些允许嵌套并行化的并行库?

此警告来自 joblib,即 sklearn 中使用的多处理库。它的发生是因为它的并行机制依赖于使用无法生成子进程daemonic工作线程的multiprocessing.Pool

我没有看到任何简单的方法可以通过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]

请注意,所有进程同时运行,这可能会导致性能比顺序实现最差。

话虽如此,使用嵌套并行性是一个好主意的用例并不多。所有核心都应该用于耗时较长的任务,其他任务按顺序运行。

最新更新