在Docker容器中,Sklearn并行处理无法工作

3
我正在使用sklearn构建和训练一些RandomForestClassifier模型。最近我发现了n_jobs变量,可以用于并行处理训练和预测。然而,它似乎产生了相反的效果。
当n_jobs未指定(默认为1)时,训练/预测将完全使用1个核心。运行"top"时,我可以看到100%的CPU使用率。但是,当我增加到4或-1(核心数,即4)时,CPU使用率降至25%。
有其他人遇到过这种情况吗?或者知道解决方法吗?

你能看到正在运行的4个Python进程吗?我使用Windows,可以从任务管理器中看到。当我设置为1时,我只看到一个Python进程,当我设置为-1时,我看到8个Python进程,因为我有8个核心。百分比取决于其他因素,但重点是要看到并行运行。 - seralouk
1
不是的。我刚刚尝试了n_jobs = 4。只有1个Python进程在28%到40%之间运行CPU。 - cghill
你能将 n_jobs 设置为 -1 并告诉我你看到了什么吗?另外,你使用 Windows 吗? - seralouk
1
我刚刚尝试了n_jobs = -1,结果是一样的,只有一个进程占用25-40%的CPU。我不是在Windows上,而是运行Ubuntu 14.04。 - cghill
你能按照我发布的第二个示例作为答案吗?创建一个类,在其中添加你的代码,最后调用它。 - seralouk
2个回答

0

看起来这是我误解了。显然我的数据集足够小,以至于“拟合”时间实际上相当可忽略(大约60,000个记录)。但是,我正在进行手动交叉验证,并会遍历这些记录并要求在未见测试集上进行预测。这需要几分钟时间,我希望并行化可以缩短那个时间。然而,我认为我的模型足够小,生成新进程的开销显着高于并行化获得的速度提升。

基本上,我生成了一个足够大的(200万行)随机数据集,然后调用了“fit”,我确实看到我的CPU使用率如预期增加。

对于造成的困扰,感到抱歉,感谢那些试图帮助我的人!


0
一般来说,使用 n_jobs=1 时,它会占用一个核心的100% CPU。每个进程在不同的核心中运行。在具有4个核心的Windows系统中,当我使用 n_jobs = 1 运行时,可以清楚地看到CPU使用情况:(100%,〜5%,〜5%,〜5%),而使用 n_jobs = -1 运行时则是(100%,100%,100%,100%)。此外,在最后一种情况下,笔记本电脑会冻结。每个进程都会占用给定核心的100%使用率,但如果您使用 n_jobs = 1,则只使用一个核心。
您还可以尝试添加 if__name__==="__main__":n_jobs =-1 示例1:
from sklearn.ensemble import RandomForestClassifier

if __name__ == '__main__':
    clf = RandomForestClassifier( n_jobs = -1 )
    #more code

或者 示例2:

Class Test(object):
    def __init__(self):
        clf = RandomForestClassifier( n_jobs = -1 )
        ###code here    

if __name__ == '__main__':
    Test()

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