一次XGBoost性能優(yōu)化-超線程影響運算速度
一、問題背景
-
一個朋友在使用 XGBoost 框架進(jìn)行機(jī)器學(xué)習(xí)編碼,他們的一個demo, 在筆記本的虛擬機(jī)(4核)運行的時候,只要8s, 但是在一個64核128G 的物理機(jī)上面的虛擬機(jī)去跑的時候,發(fā)現(xiàn)時間需要更長。

筆記本執(zhí)行:

二、問題定位和解決
首先看到負(fù)載是比較高的,內(nèi)存占用比較少。因為是計算型的,所以這種狀態(tài)是正常的。
一開始我覺得是GIL 鎖,后面詢問是使用了 XGBoost 框架,想去官網(wǎng)看看能不能找到相關(guān)內(nèi)容
XGBoost 多線程支持 文檔的一段話提醒了我:
我們可以在具有更多核心的機(jī)器上運行相同的代碼。例如大型的 Amazon Web Services EC2 具有 32 個核心。我們可以調(diào)整上面的代碼來計算具有 1 到 32 個核心的模型所需的訓(xùn)練時間。結(jié)果如下圖。
XGBoost 在 1 到 32 個核心上訓(xùn)練模型所需的時間
值得注意的是,在多于 16 個線程(大約 7 秒)的情況下,我們沒有看到太多進(jìn)步。我想其原因是 Amazon 僅在硬件中提供 16 個內(nèi)核,而另外的 16 個核心是通過超線程提供額外。結(jié)果表明,如果您的計算機(jī)具有超線程能力,則可能需要將 num_threads 設(shè)置為等于計算機(jī)中物理 CPU 核心的數(shù)量。
示例: https://github.com/dmlc/xgboost/blob/master/demo/guide-python/sklearn_parallel.py
我們通過示例將 n_job 的值調(diào)整為 cpu 核心的一半,
n_jobs=multiprocessing.cpu_count()//2
發(fā)現(xiàn)解決了問題



浙公網(wǎng)安備 33010602011771號