1. 程式人生 > 實用技巧 >Python建立大量執行緒時遇上OpenBLAS blas_thread_init報錯怎麼辦?

Python建立大量執行緒時遇上OpenBLAS blas_thread_init報錯怎麼辦?

計算機明明還有空閒資源,但 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`