Распараллеливание функций с использованием многопроцессорной обработки в Jupyter NotebookPython

Программы на Python
Anonymous
Распараллеливание функций с использованием многопроцессорной обработки в Jupyter Notebook

Сообщение Anonymous »

Изменить: я обновил вопрос тривиальным повторяемым примером для ipython, PyCharm и кода Visual Studio. Все они терпят неудачу по-разному.
Я выполняю задачи, интенсивно использующие процессор, в Jupyter Notebook. Распараллелить задачу тривиально, и я уже могу сделать это в блокноте через потоки. Однако из-за GIL Python это неэффективно, поскольку GIL не позволяет эффективно использовать несколько ядер ЦП для параллельных задач.
Очевидным решением будет многопроцессорный модуль Python, и у меня есть это работа с кодом приложения Python (а не с блокнотами). Однако из-за особенностей работы Jupyter Notebook многопроцессорная обработка не выполняется из-за отсутствия точки входа __main__.
Я не хочу создавать отдельные модули Python, поскольку они не позволяют цель использования блокнотов в первую очередь для исследования данных.
Вот минимально повторяемый пример.
Я создаю блокнот с одной ячейкой :

Код: Выделить всё

# Does not do actual multiprocessing, but demostrates it fails in a notebook
from multiprocessing import Process

def task():
return 2

p = Process(target=task)
p.start()
p.join()
Выполнение этого с помощью IPython дает:

Код: Выделить всё

ipython notebooks/notebook-multiprocess.ipynb

Код: Выделить всё

Traceback (most recent call last):
File "", line 1, in 
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/spawn.py", line 125, in _main
prepare(preparation_data)
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/spawn.py", line 236, in prepare
_fixup_main_from_path(data['init_main_from_path'])
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/spawn.py", line 287, in _fixup_main_from_path
main_content = runpy.run_path(main_path,
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py", line 289, in run_path
return _run_module_code(code, init_globals, run_name,
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py", line 96, in _run_module_code
_run_code(code, mod_globals, init_globals,
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/Users/moo/code/ts/trade-executor/notebooks/notebook-multiprocess.ipynb", line 5, in 
"execution_count": null,
NameError: name 'null' is not defined
Запуск этого с помощью PyCharm дает:

Код: Выделить всё

Traceback (most recent call last):
File "", line 1, in 
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
AttributeError: Can't get attribute 'task' on 
Запуск этого с помощью Visual Studio Code дает:

Код: Выделить всё

Traceback (most recent call last):
File "", line 1, in 
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/opt/homebrew/Cellar/python@3.10/3.10.13/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
AttributeError:  Can't get attribute 'task' on 
Мое текущее распараллеливание с использованием пула потоков работает:

Код: Выделить всё

results = []

def process_background_job(a, b):
# Do something for the batch of data and return results
pass

# If you switch to futureproof.executors.ProcessPoolExecutor
# here it will crash with the above error
executor = futureproof.executors.ThreadPoolExecutor(max_workers=8)
with futureproof.TaskManager(executor, error_policy="log") as task_manager:

# Send individual jobs to the multiprocess worker pool
total_tasks = 0
for look_back in look_backs:
for look_forward in look_forwards:
task_manager.submit(process_background_job, look_back, look_forward)
total_tasks += 1

print(f"Processing grid search {total_tasks} background jobs")

# Run the background jobs and read back the results from the background worker
# with a progress bar
with tqdm(total=total_tasks) as progress_bar:
for task in task_manager.as_completed():
if isinstance(task.result, Exception):
executor.join()
raise RuntimeError(f"Could not complete task for args {task.args}") from task.result

look_back, look_forward, long_regression, short_regression = task.result
results.append([
look_back,
look_forward,
long_regression.rsquared,
short_regression.rsquared
])
progress_bar.update()
Как я могу использовать распараллеливание на основе процессов в блокнотах?
Python 3.10, но с радостью обновлю, если это поможет.>

Подробнее здесь: https://stackoverflow.com/questions/774 ... r-notebook

Вернуться в «Python»