計算機明明還有空閑資源,但 Python 創建大量線程時,遇上OpenBLAS blas_thread_init報錯怎么辦?
具體看看着報錯信息:
OpenBLAS blas_thread_init: RLIMIT_NPROC 4096 current, 8251551 max
OpenBLAS blas_thread_init: pthread_create failed for thread 122 of 128: Resource temporarily unavailable
里面說到,OpenBLAS 無法創建線程。
用 cat /proc/cpuinfo| grep "processor"| wc -l 查看CPU的邏輯核數,總共有160個:

再用 top 看一下系統資源情況:

還有近 1.8T 的閑置內存,一小半的核數。但用 Python 的 multiprocessing 創建的線程數也小於空閑核數,為什么還會失敗?
再來看看報錯信息,里面提到的 RLIMIT_NPROC 變量控制了用戶可以使用的 CPU 核數。OpenBLAS 創建線程時超過了核它,從而導致失敗。雖然操作時設置的線程數沒有超,但 OpenBLAS 可能嘗試同時啟動多個線程來加速線性代數,導致總的線程數超過可利用的線程數。
簡單來說,可以在 bash 用以下三種方法其中一個控制 OpenBlas 線程數,直接在bash輸入,最后的數字根據自己需要設定:
export OPENBLAS_NUM_THREADS=2
export GOTO_NUM_THREADS=2
export OMP_NUM_THREADS=2
或者在 Python 程序的開頭加入:
import os
os.environ['OPENBLAS_NUM_THREADS'] = '1'

