5 votes

Utilisation du module multiprocesseur de Python avec le paquet cvxopt

Je viens de rencontrer un problème avec le paquet cvxopt pour l'optimisation convexe, que je n'ai pas trouvé mentionnée dans la documentation . Je me demande si quelqu'un en connaît la cause et la meilleure façon de la contourner.

Le problème est que lorsque vous import cvxopt dans un programme Python qui fait usage de multiprocessing.Process les processus ne peuvent plus fonctionner en parallèle. Ils semblent se synchroniser automatiquement. Notez que cela se produit indépendamment du fait que l'une des instances de cvxopt sont effectivement utilisées par le programme. Le simple fait d'importer le paquetage provoque cet effet.

Ejemplo:

# 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()

Le script ci-dessus lance quatre processus fonctionnant en parallèle du programme principal. Sur une machine à quatre cœurs, j'ai obtenu quatre processus, chacun prenant 100% d'un CPU.

Cependant, lorsque l'on décommente l'option import cvxopt déclaration au départ, chaque processus finit par ne prendre que 25% d'un CPU, comme s'il était synchronisé avec les autres.

Je suis intéressé par les explications et les solutions de rechange. Je m'excuse s'il y a une explication évidente dans la documentation que j'ai négligée.


Détails sur la façon de reproduire le problème

L'environnement sous lequel je l'exécute est Linux 3.5.0 (distribution Ubuntu 12.10), et Python 3.2.3. Voici comment j'ai installé cvxopt :

  1. Installez matplotlib 1.2.1 (je l'ai fait parce qu'il inclut pylab, qui est utilisé dans de nombreux exemples de cvxopt scripts. Je ne suis pas sûr que ce soit une exigence réelle). J'ai utilisé ce paquet tar.gz et a fait sudo python3 setup.py install pour l'installer.

  2. Installé BLAS et ATLAS

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

    Ce qui précède est probablement plus que nécessaire, mais je serais surpris si cela causait des problèmes.

  3. Installé cvxopt 1.1.6, en utilisant le paquet tar.gz d'ici y sudo python3 ./setup.py install .

1voto

rparent Points 495

Peut-être est-ce lié au fait que le GIL Python n'est pas encore disponible ?

Voir : http://comments.gmane.org/gmane.comp.python.scientific.user/15678

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X