Я пытаюсь выполнить некоторую параллельную оптимизацию с помощью PyOpt. Сложная часть заключается в том, что в рамках моей целевой функции я хочу запустить код C++, используя mpi.Python со встроенным вызовом mpirun
Мой питон скрипт выглядит следующим образом:
#!/usr/bin/env python
# Standard Python modules
import os, sys, time, math
import subprocess
# External Python modules
try:
from mpi4py import MPI
comm = MPI.COMM_WORLD
myrank = comm.Get_rank()
except:
raise ImportError('mpi4py is required for parallelization')
# Extension modules
from pyOpt import Optimization
from pyOpt import ALPSO
# Predefine the BashCommand
RunCprogram = "mpirun -np 2 CProgram" # Parallel C++ program
#########################
def objfunc(x):
f = -(((math.sin(2*math.pi*x[0])**3)*math.sin(2*math.pi*x[1]))/((x[0]**3)*(x[0]+x[1])))
# Run CProgram
os.system(RunCprogram) #where the mpirun call occurs
g = [0.0]*2
g[0] = x[0]**2 - x[1] + 1
g[1] = 1 - x[0] + (x[1]-4)**2
time.sleep(0.01)
fail = 0
return f,g, fail
# Instantiate Optimization Problem
opt_prob = Optimization('Thermal Conductivity Optimization',objfunc)
opt_prob.addVar('x1','c',lower=5.0,upper=1e-6,value=10.0)
opt_prob.addVar('x2','c',lower=5.0,upper=1e-6,value=10.0)
opt_prob.addObj('f')
opt_prob.addCon('g1','i')
opt_prob.addCon('g2','i')
# Solve Problem (DPM-Parallelization)
alpso_dpm = ALPSO(pll_type='DPM')
alpso_dpm.setOption('fileout',0)
alpso_dpm(opt_prob)
print opt_prob.solution(0)
Я бегу этот код с помощью:
mpirun -np 20 python Script.py
Однако, я получаю следующее сообщение об ошибке:
[user:28323] *** Process received signal ***
[user:28323] Signal: Segmentation fault (11)
[user:28323] Signal code: Address not mapped (1)
[user:28323] Failing at address: (nil)
[user:28323] [ 0] /lib64/libpthread.so.0() [0x3ccfc0f500]
[user:28323] *** End of error message ***
я сообразить, что 2 разных вызова mpirun
(тот, который вызывает скрипт python и тот, который находится внутри сценарий) противоречат друг другу. Любые выводы о том, как это решить?
спасибо !!
ли вы обмен данными между процессами питона с помощью МПИ связи или вы просто используете 'mpi4py' для запуска нескольких изолированных экземпляров. Если это так, вы можете использовать модуль 'subprocess' в python для создания нескольких потоков, каждый из которых может вызывать экземпляр' mpirun' (используя 'subprocess.Popen'). Я делаю это часто и не испытываю никаких проблем. Если вы используете 'Script.py' на нескольких машинах, это может быть невозможно ... –