多處理核心親和性問題
在某些情況下,導入NumPy 庫並嘗試使用joblib 模組並行化CPU 密集型循環時,可以觀察到分配給循環的工作進程都局限於單一核心,從而阻礙了效能提升。
這個問題是由於 NumPy 和底層 OpenBLAS 庫之間的交互而產生的,這些庫經常被使用用於多線程操作。預設情況下,這些函式庫可能會幹擾核心親和性設置,導致所有工作進程被分配到相同核心。
解決方案:重置任務親和性
簡單的方法解決方案是在導入受影響的模組後使用os.system() 函數重置任務關聯性。透過執行指令 os.system("taskset -p 0xff %d" % os.getpid()),核心親和力被重置,允許工作進程分佈在所有可用核心上。
停用 OpenBLAS CPU 關聯性重置
或者,可以在運行時或建置時停用 OpenBLAS 的 CPU 關聯性重置行為。執行時,將環境變數 OPENBLAS_MAIN_FREE 設定為 1 可防止程式庫調整核心關聯性。或者,在 OpenBLAS 編譯過程中,將 NO_AFFINITY=1 新增至 Makefile.rule 會永久停用此行為。
以上是為什麼我的 Joblib Workers 在導入 NumPy 後卡在一個核心上?的詳細內容。更多資訊請關注PHP中文網其他相關文章!