2013-06-11 13 views
22

Wiem, że to może wydawać się absurdalnym pytaniem, ale muszę regularnie wykonywać zlecenia na serwerach obliczeniowych, które udostępniam innym w dziale, a kiedy zaczynam 10 prac, naprawdę chciałbym, żeby po prostu wziął 10 rdzeni i nie więcej; Nie dbam o to, czy potrwa to trochę dłużej z jednym rdzeniem na jeden bieg: po prostu nie chcę, żeby wkraczał on na terytorium innych, co wymagałoby ode mnie ponownego przeniesienia zadań i tak dalej. Chcę tylko mieć 10 solidnych rdzeni i to wszystko.Python: Jak powstrzymać numpy przed wielowątkowością?

Dokładniej, używam Entuzjazmu 7.3-1 na Redhacie opartego na Pythonie 2.7.3 i numpy 1.6.1, ale pytanie jest bardziej ogólne. Szukałem jakiejś odpowiedzi na to pytanie przez wiele godzin, więc jeśli ktoś zna zmianę numpy, która może wyłączyć wielowątkowość, proszę dać mi znać.

+1

Jestem prawie pewny, że numpy nie wykonuje wielowątkowości, nie ma nic do wyłączenia. –

+2

Ustaw podobieństwo procesora do procesów – jfs

+8

@WinstonEwert: niepoprawny. Wypróbuj 'np.dot' z dużą macierzą na procesorze wielordzeniowym.Biblioteki, których używa, mogą wykorzystywać więcej niż jeden procesor – jfs

Odpowiedz

10

Ustaw zmienną środowiskową MKL_NUM_THREADS na 1. Jak można się domyślić, ta zmienna środowiskowa kontroluje zachowanie biblioteki jądra Math, która jest zawarta w kompilacji Enthought's numpy.

Po prostu robię to w moim pliku startowym, .bash_profile, z export MKL_NUM_THREADS=1. Powinieneś również móc to zrobić z poziomu swojego skryptu, aby był on specyficzny dla procesu.

+0

Dzięki. To sprawia, że ​​życie jest o wiele łatwiejsze niż ustawianie każdego procesu. – MasDaddy

5

Zostawiłbym to jako komentarz do odpowiedzi Bi Rico, ale nie mam wymaganych przywilejów. W nowszych wersjach programu numpy stwierdziłem, że konieczne jest ustawienie również NUMEXPR_NUM_THREADS = 1

W moich rękach wystarczy to bez ustawienia MKL_NUM_THREADS = 1, ale w pewnych okolicznościach może być konieczne ustawienie obu.

+1

Fwiw, musiałem ustawić 'OMP_NUM_THREADS' (cf https://stackoverflow.com/a/31622299/1666398) – dtk

-3

Dla mnie rozwiązanie było proste, jak ja przestałem używać 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

W przypadku, gdy chcesz ustawić liczbę wątków dynamicznie, a nie globalnie za pośrednictwem zmiennej środowiskowej, można również zrobić:

import mkl 
mkl.set_num_threads(2) 
1

Mam tylko nadzieję, że naprawi to wszystkie scenariusze i system, w którym może być.

  1. Zastosowanie numpy.__config__.show() aby sprawdzić, czy używasz OpenBLAS lub MKL

Od tej chwili istnieje kilka sposobów można to zrobić.

2.1. Trasa Terminal export OPENBLAS_NUM_THREADS=1 lub export MKL_NUM_THREADS=1

2,2 (To jest mój preferowany sposób) w skrypcie Pythona import os i dodaj linię os.environ['OPENBLAS_NUM_THREADS'] = '1' lub os.environ['MKL_NUM_THREADS'] = '1'.

UWAGA przy ustawianiu os.environ[VAR] liczba wątków musi być ciągiem!

Prawdopodobnie istnieją inne opcje oprócz openBLAS lub MKL, ale krok 1 pomoże Ci to rozgryźć.

Powiązane problemy