在sciki中不能使用超过10个核心学习

时间:2017-01-20 18:49:14

标签: python scikit-learn

我正在尝试在具有32个内核的服务器上使用sciki-learn(0.17.1)。操作系统是Ubuntu 14.04.1,python版本是2.7.12。当我试图运行类似

的东西时
etr_init = RandomForestRegressor(n_jobs = -1)
etr_model = etr_init.fit(trn_x, y)

只运行了10个核心。是否需要其他配置?

1 个答案:

答案 0 :(得分:2)

sklearn中的大多数算法仅支持拟合级别的并行性(意思是:每个拟合使用一个核心)。这尤其有助于交叉验证和网格搜索。

幸运的是,你正在使用一些易于并行化的算法(集合方法的一个自然特征),并得到一些特殊的多处理处理,它比拟合级方法更精细。

在您的情况下,创建RandomForestRegressor(n_jobs=-1)使用默认值:

n_estimators : integer, optional (default=10)

由于关于RandomForestRegressor的sklearn的并行化功能仅限于不同的树(内部组件),因此您只能使用10个核心(因为你正在使用10 x Trees = 10 x DecisionTreeRegressor)。

使用:

etr_init = RandomForestRegressor(n_estimators=32, n_jobs = -1)
etr_model = etr_init.fit(trn_x, y)

可能会使用更多核心。

如果使用32个核心仍然有问题,因为SMT / HT核心并不总是被计算(并且可能存在于您的集群中)。 并不总是并不意味着它在sklearn中是不确定的,但不同的线程/多处理库使用不同的规则,我不知道sklearn或内部组件如何使用= joblib正在工作(不相关的流行示例:我记得x264使用1.5 *总核心(包括HT)。)

关于仅使用#-trees级别的多处理的sklearn的猜想可以从查看文档推断出来(同时知道RandomForests是什么):

  • DecisionTreeRegressor不支持参数n_jobs。 (一些RandomForestRegressor的估算器是DecisionTreeRegressor)