Python-Multiprozessing verwendet nicht 100% CPU für perfekt paralleles, cpu-begrenztes Problem
Posted: 06 Sep 2025, 13:50
Ich versuche, die Ausführung eines Python -Codes zu parallelisieren, der ein numerisches Problem löst. Es ist ein relativ komplizierter Code, der Numpy stark benutzt. Ich möchte das numerische Problem für einen großen Satz von Parametern lösen. Dies sollte leicht zu parallelisieren sein: Lassen Sie einfach verschiedene Prozesse das Problem für verschiedene Regionen des Parameterraums lösen.: 1 Prozess verwendet 100% CPU
[*]: 2 Prozesse, die jeweils 100% CPU
[*] verwenden: 4 Prozesse, die jeweils 50% CPU
[*] verwenden: 8 Prozesse, jeweils 25% CPU
Es sieht also so aus, als ob die maximale Gesamtnutzung 200% beträgt. Ich verstehe nicht, warum das passiert. Ich habe bestätigt, dass ich beim Starten des Programms ohne Multiprozessierung in 8 verschiedenen Terminals 8 Prozesse mit jeweils 100%erhalte. Dinge, die ich bisher versucht habe: < /p>
Ändern Sie das Chunkize < /code>; Hilft nicht, dass kleine oder große Stückgrößen die gleiche Leistung geben. Multiplikation langsamer). Also habe ich OS.System (f "taskset -p 0xff {os.getPid ()}") ausprobiert, um die CPU -Affinität nach dem Importieren von Numpy zurückzusetzen, aber es ändert nichts. Wenn ich os.Sched_getaffinity (0) vor und nach dem Importieren von Numphye, erhalte ich die gleiche Ausgabe: {0, 1, 2, 3, 4, 5, 6, 7}.
Dies gibt 8 Prozesse, die alle 100% CPU verwenden, sodass es kein knappes Problem zu sein scheint. Bearbeiten: Nicht immer, ich sehe manchmal das gleiche Verhalten wie oben beschrieben, wobei 8 Prozesse jeweils 25% CPU verwenden. Und das Testen verschiedener Werte von n_processes zwischen 1 und 8, es wird kein Leistungsunterschied ersichtlich. Ich führe all dies in einer virtuellen Konda-Env mit Python 3.11 auf Ubuntu 22.04 aus. 2,80 GHz < /p>
Ausgabe von hwloc -ps -t < /code> Wenn das Programm ausgeführt wird: < /p>
Ausgabe von hwloc-ls : screenshot von hwloc-ls Ausgabe
Code: Select all
import numpy as np
import itertools
from multiprocessing import Pool
import MyNumericalProblemSolver
chunksize = 100
n_values_per_param = 50
n_processes = 8
p1_values = np.logspace(1,2,n_values_per_param)
p2_values = np.logspace(3,5,n_values_per_param)
param_iterator = itertools.product(p1_values,p2_values)
solver = MyNumericalProblemSolver()
def wrapper(params):
p1,p2 = params
solver.set_parameters(p1=p1,p2=p2)
solver.solve()
p = Pool(n_processes)
p.map(wrapper,param_iterator,chunksize=chunksize)
< /code>
Die Ausführung des obigen Code dauert normalerweise einige Minuten. Mein Laptop hat 8 CPUs (Ausgabe von Multiprocessing.cpu_count () < /code>). CPU < /li>
[*]n_processes = 1
[*]
Code: Select all
n_processes = 2
[*] verwenden
Code: Select all
n_processes = 4
[*] verwenden
Code: Select all
n_processes = 8
Es sieht also so aus, als ob die maximale Gesamtnutzung 200% beträgt. Ich verstehe nicht, warum das passiert. Ich habe bestätigt, dass ich beim Starten des Programms ohne Multiprozessierung in 8 verschiedenen Terminals 8 Prozesse mit jeweils 100%erhalte. Dinge, die ich bisher versucht habe: < /p>
Ändern Sie das Chunkize < /code>; Hilft nicht, dass kleine oder große Stückgrößen die gleiche Leistung geben. Multiplikation langsamer). Also habe ich OS.System (f "taskset -p 0xff {os.getPid ()}") ausprobiert, um die CPU -Affinität nach dem Importieren von Numpy zurückzusetzen, aber es ändert nichts. Wenn ich os.Sched_getaffinity (0) vor und nach dem Importieren von Numphye, erhalte ich die gleiche Ausgabe: {0, 1, 2, 3, 4, 5, 6, 7}.
Code: Select all
from multiprocessing import Pool
import numpy as np
matrix_dim = 100
n_processes = 8
def test_function(x):
for i in range(5000):
matrix = np.random.rand(matrix_dim,matrix_dim)
np.linalg.solve(matrix,np.ones(matrix_dim))
n_iter = 100
chunksize = 10
p = Pool(n_processes)
p.map(test_function,range(n_iter),chunksize=chunksize)
Ausgabe von hwloc -ps -t < /code> Wenn das Programm ausgeführt wird: < /p>
Code: Select all
142024 Core:0 python
142025 Core:0 python
142026 Core:0 python
142027 Core:0 python
142028 Core:0 python
142029 Core:0 python
142030 Core:0 python
142031 Core:0 python