2013-06-11 15 views
22

So che questa potrebbe sembrare una domanda ridicola, ma devo eseguire i lavori regolarmente sui server di calcolo che condivido con gli altri nel reparto e quando avrò 10 lavori, mi piacerebbe davvero prendere solo 10 core e non di più; Non mi interessa se ci vuole un po 'più di tempo con un singolo core per corsa: semplicemente non voglio che invaderi il territorio degli altri, il che richiederebbe di rinominare i lavori e così via. Voglio solo avere 10 core solidi e basta.Python: come si fa a fermare il numpy dal multithreading?

In particolare, sto usando Enthought 7.3-1 su Redhat, che è basato su Python 2.7.3 e numpy 1.6.1, ma la domanda è più generale. Ho cercato su google per una specie di risposta a questa domanda per ore senza successo, quindi se qualcuno sa di un passaggio in numpy che potrebbe disattivare il multi-threading, per favore fatemelo sapere.

+1

Sono abbastanza sicuro che Numpy non esegue alcun multithreading, non c'è nulla da spegnere. –

+2

impostare l'affinità della cpu per i processi – jfs

+8

@WinstonEwert: errato. Prova 'np.dot' con una matrice grande su CPU multicore.Le librerie che utilizza possono utilizzare più di una CPU – jfs

risposta

10

Impostare la variabile di ambiente MKL_NUM_THREADS su 1. Come si può intuire, questa variabile di ambiente controlla il comportamento della libreria del Kernel Math che è inclusa come parte della build di Enthought numpy.

Faccio questo nel mio file di avvio, .bash_profile, con export MKL_NUM_THREADS=1. Dovresti anche essere in grado di farlo dal tuo script per farlo essere specifico del processo.

+0

Grazie. Ciò rende la vita molto più semplice rispetto al compito di ogni processo. – MasDaddy

5

Avrei lasciato questo come commento sulla risposta di Bi Rico ma non ho il privilegio richiesto. Nelle versioni più recenti di numpy ho trovato necessario impostare anche NUMEXPR_NUM_THREADS = 1

Nelle mie mani, questo è sufficiente senza impostare MKL_NUM_THREADS = 1, ma in alcune circostanze potrebbe essere necessario impostare entrambi.

+1

Fwiw, avevo bisogno di impostare 'OMP_NUM_THREADS (cf https://stackoverflow.com/a/31622299/1666398) – dtk

-3

Per me, la soluzione è stata semplice come ho smesso di usare numpy.dot:

import numpy as np 

a = np.random.rand(1e6) 
b = np.random.rand(1e6, 10) 

# potentially uses multiple threads 
dotted = np.dot(a, b) 

# single-thread 
summed = np.sum(a[:, np.newaxis] * b, axis=0) 

assert np.all(dotted == summed) 
2

Nel caso in cui si desidera impostare il numero di thread in modo dinamico, e non a livello globale tramite una variabile di ambiente, si può anche fare:

import mkl 
mkl.set_num_threads(2) 
1

Spero solo che questo risolva tutti gli scenari e il sistema in cui ci si può trovare.

  1. Usa numpy.__config__.show() per vedere se si utilizza OpenBLAS o MKL

Da questo punto in poi ci sono alcuni modi si può fare questo.

2.1. Il percorso terminale export OPENBLAS_NUM_THREADS=1 o export MKL_NUM_THREADS=1

2,2 (Questo è il mio modo preferito) Nello script python import os e aggiungere la riga os.environ['OPENBLAS_NUM_THREADS'] = '1' o os.environ['MKL_NUM_THREADS'] = '1'.

NOTA quando si imposta os.environ[VAR] il numero di thread deve essere una stringa!

Probabilmente ci sono altre opzioni oltre a openBLAS o MKL ma il passaggio 1 ti aiuterà a capirlo.

Problemi correlati