我正在尝试在 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 个核心在运行。还需要其他配置吗?
最佳答案
sklearn 中的大多数算法仅支持拟合级别的并行性(意思是:每次拟合都使用一个核心)。这尤其有助于交叉验证和网格搜索。
幸运的是,您正在使用一些易于并行化的算法(集成方法的自然特征),并获得了一些比拟合级别方法更精细的特殊多处理处理。
在您的情况下,创建 RandomForestRegressor(n_jobs=-1)
使用默认值:
n_estimators:整数,可选(默认=10)
。
由于 sklearn 对于 RandomForestRegressor
的并行化能力仅限于不同的树(内部组件),因此您只能使用10 个核心(因为您使用的是 10 x 树 = 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)。
我对 sklearn 仅在 #-trees
级别使用多处理的猜想可以通过查看文档来推断(同时知道 RandomForest 是什么):
- DecisionTreeRegressor不支持参数
n_jobs
。 (某个 RandomForestRegressor 的每个估计量都是 DecisionTreeRegressor)
关于python - scikit learn 中不能使用超过 10 个内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41770471/