2013-06-17 4 views
5

Po prostu napotkałem problem z cvxopt package dla optymalizacji wypukłej, której nie znalazłem w documentation. Zastanawiam się, czy ktokolwiek wie, co go powoduje i jak najlepiej go obejść.Używanie wieloprocesorowego modułu Pythona razem z pakietem cvxopt

Problem polega na tym, że po import cvxopt w programie Python, który korzysta z instancji multiprocessing.Process, procesy nie mogą już działać równolegle. Wydają się automatycznie synchronizować. Zauważ, że dzieje się tak niezależnie od tego, czy którakolwiek z funkcji cvxopt jest rzeczywiście używana przez program. Po prostu importowanie pakietu powoduje ten efekt.

przykład:

# import cvxopt 
from multiprocessing import Queue, Process 

def compute(queue): 
    """ 
    Pick integers from a queue and perform some useless 
    calculations on them just to keep the CPU busy. 
    """ 
    total = 0 
    while True: 
     item = queue.get() 
     if item is None: 
      break 
     for i in range(item): 
      total += i 

if __name__ == '__main__': 
    queue = Queue() 
    procs = [] 
    for i in range(4): 
     proc = Process(target = compute, 
         args = (queue,)) 
     proc.start() 
     procs.append(proc) 

    for i in range(100000): 
     queue.put(i) 
    for proc in procs: 
     queue.put(None) 
    for proc in procs: 
     proc.join() 

skrypt powyżej rozpoczyna się cztery procesy, rozciągających się równolegle do głównego programu. Na maszynie z czterema rdzeniami otrzymałem cztery procesy, z których każdy zajmuje 100% mocy procesora.

Jednak po odkomentowaniu instrukcji import cvxopt na początku każdy proces kończy się, biorąc tylko 25% procesora, tak jakby był zsynchronizowany z innymi.

Jestem zainteresowany objaśnieniami i obejściami. Przepraszam, jeśli istnieje oczywiste wyjaśnienie w dokumentacji, którą przeoczyłem.


Szczegóły dotyczące sposobu odtworzenia problemu

Środowisko używam jest to pod Linux 3.5.0 (Ubuntu 12.10 dystrybucja) oraz Python 3.2.3. Jest to jak zainstalowałem cvxopt:

  1. Install matplotlib 1.2.1 (Zrobiłem to, ponieważ zawiera pylab, który jest używany w wielu przykładowych skryptów cvxopt jestem pewien, czy to jest rzeczywiste zapotrzebowanie.). Użyłem this tar.gz package i zrobiłem sudo python3 setup.py install, aby go zainstalować.

  2. Zainstalowane BLAS i ATLAS

    sudo apt-get install libblas-dev libblas3 libatlas-base-dev libatlas3-base libblas-test libopenblas-base libopenblas-dev 
    

    Powyższe jest prawdopodobnie bardziej niż jest to konieczne, ale byłbym zaskoczony, gdyby to powodowało problemy.

  3. Zainstalowano cvxopt 1.1.6, używając pakietu tar.gz from here i sudo python3 ./setup.py install.

+1

To może być pomocne wspomnieć systemu operacyjnego i czy używasz żadne dodatkowe zależności wymienionych w https://github.com/cvxopt/cvxopt/blob/master/INSTALL –

+0

@ JanneKarila Jeszcze raz dziękuję za notatkę. Dodałem teraz więcej szczegółów do pytania. – jogojapan

Odpowiedz