TL; DR: если я передам объект данных работнику multiprocessing.Process
, будет ли этот объект автоматически скопирован?
Контекст: я делаю проект по науке о данных, в котором обязательно нужно надеть не предсказывать те же данные, на которых я тренируюсь. Для удобства чтения я создал объект перекрестной проверки, в котором хранятся все данные и который позволяет выбрать активную складку в объекте данных. Кроме того, я хочу использовать многопроцессорную библиотеку для одновременного обучения нескольких моделей. В моей голове я могу представить следующий проблемный сценарий c:
- В объекте данных сгиб 0 выбирается процессом 0
- Процесс 0 выбирает данные обучения из объекта данных , который в настоящее время является данными в сгибах 1-4.
- В объекте данных сгиб 1 выбирается процессом 1.
- Процесс 0 прогнозирует модель на активном сгибе, который теперь имеет был изменен на сгиб 1. Это означает, что процесс 0 обучался и предсказывал одни и те же данные.
Чтобы быть абсолютно уверенным, что этого не произойдет, я делаю явную глубокую копию объекта данных перед его отправкой в Процесс. Это делается в следующем коде:
for i_cpu in range(N_CPU):
data_obj_copy = copy.deepcopy(data_obj)
workers.append(multiprocessing.Process(target=gridsearch, args=
(
data_obj_copy,
model_generator,
idc_per_cpu[i_cpu],
results,
X_reals_ground_truth
)
)
)
Но это, в свою очередь, съедает тонну памяти. Это приводит меня к моему вопросу: Нужно ли делать явную копию моего объекта данных? Из того, что я понял, библиотека multiprocessing
делает что-то, называемое травлением, что может означать, что объект данных копируется независимо , Если это правда, тогда мне делать копию не нужно.
Также Если у вас есть предложения о том, как вы могли бы сделать это более эффективно, это также приветствуется.