Subprozesse funktionieren perfekt, bis mehr als 1 vorliegtPython

Python-Programme
Guest
 Subprozesse funktionieren perfekt, bis mehr als 1 vorliegt

Post by Guest »

Ich arbeite an einem Job -Einreichungsskript, das eine parallelisierte Modellanpassung (mit scipy.optimizes) auf Drehmoment- und Slurm -Clustern sowie auf der lokalen Hardware übernimmt. Die ersteren arbeiten gut, aber letztere gibt mir einige Probleme. Ich muss M -Antwortvariablen (RVs) enthalten, ich muss m -Modelle anpassen. Die M -RVs. Sagen wir n = 2 und M = 100, also bekomme ich zwei Stücke mit 50 Wohnmobilen. Ich speichere die Stücke mit CloudPickle. Ich speichere den Callable mit CloudPickle. Auf den Daten aufgerufen

Code: Select all

def unpickle_and_execute(callable_path, data_path):
callable = pickle.load(callable_path)
data = pickle.load(data_path)
callable(data)

def make_executable_for_local_job(job_index, python_path, callable_path, data_path):
fn = """
#!/bin/bash
python -m my_module.unpickle_and_execute {callable_path} {data_path}
"""
with open(f"/path/to/executable_{job_index}.sh") as file:
file.write(fn)
return "/path/to/executable_{job_index}.sh"

def get_callable(model):
# More logic
def callable(data):
model_copy = copy.deepcopy(model)
model_copy.fit(data)
model_copy.save()
return callable

def main():
data = get_data()
model = get_model()
callable = get_callable(model)
callable_path = save_callable_with_cloudpickle(callable)
all_processes = []
for i, chunk in enumerate(data.chunks()):
data_path=save_data_with_cloudpickle(chunk)
executable = make_executable_for_local_job(i, callable_path, data_path)
command = ["bash", executable]
process = subprocess.Popen(command)
all_processes.append(process)

# Wait for processes to finish
< /code>
Das Problem liegt nur auf der lokalen Maschine und nur dann, wenn n> 1. Wenn n == 1 dies perfekt funktioniert. Wenn n> 1, verlangsamen sich die Prozesse um mehrere Größenordnungen und verwenden meine gesamte CPU. Dies lässt mich glauben, dass es eine gemeinsame Ressource gibt, für die sie sich befassen, aber ich kann mir nicht vorstellen, was das sein könnte, weil ich alle Ressourcen separat auf der Festplatte gespeichert habe, und wenn ich richtig verstehe Das Skript hat seinen eigenen Gil. mit dem Bash -Skript. Außerdem funktioniert dies auch nicht (aber aufgrund von unverzichtlichisierbaren Objekten oder Arbeitsplätzen, die scheinbar ohne Ergebnis verschwinden), möchte ich mich an den Job-Skript-Ansatz halten, da es die Wiederholung fehlgeschlagener Modelle erleichtert und es besser übereinstimmt und mit Wie die Batch -Jobs ausgeführt werden. Job mit einem benutzerdefinierten preexec_fn 
führte auch zu einem fehler: 'gabel' ressource nicht verfügbar. Ich habe viele andere Fragen besucht und gelesen, die ich noch nicht verstanden habe, was das Besondere an meinem Fall ist. Wenn jemand hier einen Einblick geben könnte, wäre es sehr hilfreich. Disk. Was tatsächlich entstand:
Eine Verlangsamung von etwa 5 Größenordnungen. BR /> Wenn n == 1, dauert das Anpassung von 2 Modellen weniger als eine Sekunde < /li>
Wenn n == 2, nehmen 2 Modelle die ganze Nacht an < /li>
< /ul>
Bearbeiten: < /p>
Dieses Problem tritt auf einem MacBook mit M3 -Prozessor und auf einem Lenovo ThinkPad mit Ubuntu Linux auf. Ich habe versucht, das gleiche Skript auf einem HPC -Rechenknoten auszuführen (aber die Modelle nicht als separate Jobs einreichen, nur lokale parallele Jobs aus einem interaktiven Job ausführen), und dort wird es ohne Probleme abgeschlossen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post