一、問題背景
-
一個朋友在使用 XGBoost 框架進行機器學習編碼,他們的一個demo, 在筆記本的虛擬機器(4核)執行的時候,只要8s, 但是在一個64核128G 的物理機上面的虛擬機器去跑的時候,發現時間需要更長。
筆記本執行:
二、問題定位和解決
首先看到負載是比較高的,記憶體佔用比較少。因為是計算型的,所以這種狀態是正常的。
一開始我覺得是GIL 鎖,後面詢問是使用了 XGBoost 框架,想去官網看看能不能找到相關內容
XGBoost 多執行緒支援 文件的一段話提醒了我:
我們可以在具有更多核心的機器上執行相同的程式碼。例如大型的 Amazon Web Services EC2 具有 32 個核心。我們可以調整上面的程式碼來計算具有 1 到 32 個核心的模型所需的訓練時間。結果如下圖。
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
發現解決了問題