我在2017年的MacBook Pro上使用XGBoost 0.7和Python 3.6。我跑:
sysctl -n hw.ncpu
然后回来
8
所以我测试多线程是否正常工作,几乎所有东西看起来都很正常。我看到改进多达8个核心。但是,当我使用numthreads=-1
时,我的表现很糟糕。
具体来说,我使用Kaggle中的Otto train.csv
文件运行:
from pandas import read_csv
from xgboost import XGBClassifier
from sklearn.preprocessing import LabelEncoder
import time
from matplotlib import pyplot
# load data
data = read_csv('train.csv')
dataset = data.values
# split data into X and y
X = dataset[:,0:94]
y = dataset[:,94]
# encode string class values as integers
label_encoded_y = LabelEncoder().fit_transform(y)
# evaluate the effect of the number of threads
results = []
num_threads = [2, 4, 8, 16, -1]
for n in num_threads:
start = time.time()
model = XGBClassifier(nthread=n)
model.fit(X, label_encoded_y)
elapsed = time.time() - start
print(n, elapsed)
results.append(elapsed)
我回来了:
2 48.96274280548096
4 26.73108983039856
8 24.160531997680664
16 24.71382975578308
-1 91.67938613891602
根据xgboost文档,numthreads=-1
应该使用您计算机上的所有可用内核。因此,我不应该获得最佳性能,至少与8核一样好吗?
谢谢!
答案 0 :(得分:2)
根据xgboost文档,numthreads = -1应该使用您计算机上的所有可用内核。
不知道你在哪里,但在XGB source code中,nthread< = 0表示None
,internally use the single threaded implementation。这就是为什么你的速度几乎是2线程执行时间的两倍。