Код: Выделить всё
intermediate_results = []
for source in sources: # (1)
source_data = prepare( load( source ) ) # (2)
for sample in schedule_samples( source_data ): # (3)
sample_data = extract_sample( source_data ) # (4)
for result_data in postprocess_sample( sample_data ):
intermediate_results.append( result_data )
final_results = []
for intermediate_result_group in group_intermediate_results( intermediate_results ):
for final_result in compile_final_result( intermediate_result_group ):
final_results.append( final_result )
Процедуры (2) и (4) требуют очень больших вычислительных затрат. (2) примерно в десять раз дороже, чем (4).
Мне нужно распараллелить весь процесс относительно эффективным способом.
Моя текущая реализация основана на модуле многопроцессорной обработки Python и распараллеливается только в цикле (1). Это просто и работает, но есть проблема. Иногда несколько источников содержат гораздо больше образцов, чем другие, поэтому в конце процесса несколько работников обрабатывают такие большие источники, а другие завершают работу.
Относительно Хорошим решением для этого процесса будет техника запечатывания работ, когда рабочий, завершивший свою работу, пытается получить задачи от других рабочих.
В настоящее время мне нужно масштабировать этот процесс до кластера с 10 узлами. Поэтому я подумываю использовать какую-нибудь среду, например dask или ray, для решения сложных задач по планированию.
Но я обнаружил, что обе они не очень дружелюбны к такого рода несбалансированным вложенным задачам. динамические рабочие процессы.
Очень просто создать десятки независимых заданий, каждое из которых будет независимо загружать исходные данные, но это будет очень медленно, поэтому мне нужно, чтобы задачи можно было повторно использовать загруженные данные, не жертвуя при этом способностью перемещайте работу между ними.
Есть ли какие-нибудь питонические инструменты, которые могли бы помочь решить такого рода проблемы распараллеливания, и как их правильно использовать? Или лучше создать собственную реализацию?
Подробнее здесь: https://stackoverflow.com/questions/793 ... nced-loads