我正在尝试在具有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个核心。是否需要其他配置?
答案 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是什么):
n_jobs
。 (一些RandomForestRegressor的估算器是DecisionTreeRegressor)