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
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.