Tôi đang cố chạy một số tối ưu hóa song song bằng PyOpt. Phần khó khăn là trong hàm mục tiêu của tôi, tôi cũng muốn chạy một mã C++ bằng cách sử dụng mpi.Python với cuộc gọi được nhúng tới mpirun
script python của tôi là như sau:
#!/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)
tôi chạy mã sử dụng:
mpirun -np 20 python Script.py
Tuy nhiên, tôi nhận được lỗi sau:
[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 ***
Tôi hình dung rằng 2 cuộc gọi mpirun
khác nhau (một cuộc gọi đến tập lệnh python và lệnh gọi bên trong script) đang xung đột với nhau. Bất kỳ khách hàng tiềm năng nào về cách giải quyết điều đó?
Cảm ơn bạn !!
bạn có trao đổi dữ liệu giữa các quá trình python sử dụng thông tin liên lạc Bộ KH & ĐT hoặc là bạn chỉ cần sử dụng 'mpi4py' để chạy nhiều trường hợp cá biệt. Trong trường hợp này, bạn có thể xem xét sử dụng mô đun 'subprocess' trong python để sinh ra nhiều luồng, mỗi thread có thể gọi một cá thể' mpirun' (sử dụng 'subprocess.Popen'). Tôi làm điều này thường xuyên và không có vấn đề gì. Nếu bạn đang chạy 'Script.py' trên nhiều máy, điều này có thể không thực hiện được ... –