一次XGBoost效能優化-超執行緒影響運算速度

自由早晚亂餘生 發表於 2022-05-29

一、問題背景

  1. 一個朋友在使用 XGBoost 框架進行機器學習編碼,他們的一個demo, 在筆記本的虛擬機器(4核)執行的時候,只要8s, 但是在一個64核128G 的物理機上面的虛擬機器去跑的時候,發現時間需要更長。

    image-20220517103920522

    筆記本執行:

    image-20220517104217425

二、問題定位和解決

首先看到負載是比較高的,記憶體佔用比較少。因為是計算型的,所以這種狀態是正常的。

一開始我覺得是GIL 鎖,後面詢問是使用了 XGBoost 框架,想去官網看看能不能找到相關內容

XGBoost 多執行緒支援 文件的一段話提醒了我:

我們可以在具有更多核心的機器上執行相同的程式碼。例如大型的 Amazon Web Services EC2 具有 32 個核心。我們可以調整上面的程式碼來計算具有 1 到 32 個核心的模型所需的訓練時間。結果如下圖。

img

XGBoost 在 1 到 32 個核心上訓練模型所需的時間

值得注意的是,在多於 16 個執行緒(大約 7 秒)的情況下,我們沒有看到太多進步。我想其原因是 Amazon 僅在硬體中提供 16 個核心,而另外的 16 個核心是通過超執行緒提供額外。結果表明,如果您的計算機具有超執行緒能力,則可能需要將 num_threads 設定為等於計算機中物理 CPU 核心的數量。

示例: https://github.com/dmlc/xgboost/blob/master/demo/guide-python/sklearn_parallel.py

我們通過示例將 n_job 的值調整為 cpu 核心的一半,

n_jobs=multiprocessing.cpu_count()//2

發現解決了問題

image-20220517104911783