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 :
-
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. -
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.
-
Installé cvxopt 1.1.6, en utilisant le paquet tar.gz d'ici y
sudo python3 ./setup.py install
.