2013-08-29 6 views
1

Я пытаюсь запустить симуляцию Python несколько раз одновременно, но с немного разными параметрами в каждом прогоне. Я пытаюсь использовать модуль multiprocessing для этого. Я начинаю свой код, как это, где у меня есть основное моделирование определяется как функция, с параметрами в качестве аргументов:многопроцессорных одновременных скриптов python эффективно

import multiprocessing 
from math import * 

def sim_seq(output_name,input_name,s_val...#more arguments): 
    #do work here 
    output.write(#data) 
    output.close() 
    return 

Я также создал текстовый файл с параметрами, которые будут использоваться для каждого прогона моделирования , который я прочитал и использовать в качестве аргументов в следующем цикле, где я пытаюсь использовать мультипроцессирование:

input_batch=('batch_file.txt') 
if __name__ == '__main__': 
    jobs=[] 
    with open(input_batch) as f: 
     for line in f: 
      line=line.split(' ') 
      for i in line: 
       if i[0]=='o': 
       output_name=str(i[2:]) 
       #read in more parameters from batch_file.txt 
     p = multiprocessing.Process(
      target=sim_seq, 
      args=(output_name,input_name,s_val...#more arguments)) 
     jobs.append(p) 
    for i in jobs: 
     i.start() 

Это по существу выполняет то, что я хочу, чтобы это сделать, он запускает три моделирования сразу, каждый с различными параметры. Тем не менее, машина, которую я использую, имеет 16 вычислительных узлов с 32 процессорами на узел. Я хочу знать, как я могу контролировать, где выполняется каждая симуляция. Например, могу ли я сказать, что каждый процессор запускает отдельную симуляцию? Я новичок в использовании многопроцессорности, и я хочу знать, как я могу сказать, какой процессор или какой узел делать что. Могу ли я иметь 32 отдельных параметра и запускать каждые 32 экземпляра симуляции на своем собственном процессоре, но все работает одновременно? Используя многопроцессорную обработку, каков был бы самый быстрый способ вычислительной работы одной и той же функции python несколько раз одновременно, но с разными аргументами для каждого запуска? Заранее благодарим за любой вклад/совет.

ответ

1

(Я предполагаю, что каждый из ваших вычислительных узлов является отдельной машиной с собственным набором ядер. Если ваш вычислительный кластер имеет своего рода ОС, который виртуализирует ядра, чтобы все они были локальными, тогда вы может игнорировать «несколько узлов» бит ниже.)

на одном узле

модуль multiprocessing изначально обрабатывает несколько процессов внутри одного экземпляра операционной системы. Если вы запустили top или похожий список процессов на одном узле и отобразили N ядер, то это число ядер, доступных для вашего моделирования на Python.

В этом ограничении, однако, вы можете создавать и обрабатывать столько процессов, сколько хотите, и операционная система будет размещать их на доступных ядрах, используя обычный планировщик процессов. Таким образом, в вашей ситуации это звучит так, как будто вы должны одновременно запускать 32 отдельных моделирования параллельно на одном узле. Все, что вам нужно сделать, это настроить цикл для создания 32 процессов, дать им параметры для запуска и подождать, пока они все не закончатся.

Если у вас более 32 симуляций для запуска, вы можете настроить multiprocessing.Pool, содержащий 32 рабочих, а затем использовать pool.map по списку параметров моделирования, чтобы распределить работу по каждому из ваших ядер.

Несколько узлов

Если у вас есть более чем 32 моделирования, и вы хотите, чтобы начать пользоваться преимуществами ядер на отдельных узлах (где вы, возможно, потребуется войти в отдельные узлы, используя SSH или т.п.), то в теории вы могли бы использовать «Удаленный менеджер» из многопроцессорного модуля для его обработки.

Однако я бы рекомендовал взглянуть на удивительные возможности IPython.parallel - он позволяет запускать «обрабатывающие механизмы» на нескольких узлах, а затем вы можете распространять работу на узлы с использованием оболочки IPython. Это в конечном итоге будет очень похоже на пул процессов, описанный выше, только он будет использовать все ядра на всех вычислительных узлах вашего кластера.

В качестве альтернативы вы можете настроить или использовать любое из нескольких существующих планировщиков кластера (Condor, Sun GridEngine и т. Д.), Чтобы запустить вашу симуляцию один раз (или даже 32 раза) на каждом обрабатывающем узле.

Смежные вопросы