Python建立大量執行緒時遇上OpenBLAS blas_thread_init報錯怎麼辦?
阿新 • • 發佈:2020-09-03
計算機明明還有空閒資源,但 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
再用 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`