Я работаю над интенсивной проблемой ML, которая связана с аддитивной моделью.Поскольку сложение является основной операцией, я могу разделить входные данные на части и создать несколько моделей, которые затем объединяются переопределенным методом __add__
.
Код, относящийся к многопроцессорной обработке, выглядит следующим образом:
def pool_worker(filename, doshuffle):
print(f"Processing file: {filename}")
with open(filename, 'r') as f:
partial = FragmentModel(order=args.order, indata=f, shuffle=doshuffle)
return partial
def generateModel(is_mock=False, save=True):
model = None
with ThreadPool(args.nthreads) as pool:
from functools import partial
partial_models = pool.imap_unordered(partial(pool_worker, doshuffle=is_mock), args.input)
i = 0
for m in partial_models:
logger.info(f'Starting to merge model {i}')
if model is None:
import copy
model = copy.deepcopy(m)
else:
model += m
logger.info(f'Done merging...')
i += 1
return model
Проблема заключается в том, что потребление памяти масштабируется экспоненциально по мере увеличения порядка модели, поэтому в порядке 4 каждый экземпляр модели составляет около 4-5 ГБ, что приводит к сбою пула потоков, поскольку промежуточные объекты модели неpickleable.
Я читал об этом немного, и кажется, что даже если травление не является проблемой, все равно крайне неэффективно передавать такие данные, как прокомментировал этот ответ .
Однако очень мало указаний относительно того, как можно использовать разделяемую память для этой цели.Можно ли избежать этой проблемы, не меняя внутреннюю часть модельного объекта?