2012-02-09 11 views
12

シミュレーションのいくつかのインスタンスを並列に実行したいが、それぞれのシミュレーションは独自の独立したデータセットを持つ。次のようにプロセスごとに異なるランダムシードを持つPythonマルチプロセッシングを使用する

現在、私はこれを実装:

simadatom1latticeは、シミュレーションを開始機能 runに渡されたオブジェクトである
P = mp.Pool(ncpus) # Generate pool of workers 
for j in range(nrun): # Generate processes 
    sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp) 
    lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp) 
    adatom1 = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp)   
    P.apply_async(run,(j,sim,lattice,adatom1),callback=After) # run simulation and ISF analysis in each process 
P.close() 
P.join() # start processes 

しかし、私は最近、それぞれのバッチを同時に実行していることを知りました(すなわち、ncpusは、シミュレーション実行の合計がnrunです)、全く同じ結果が得られます。

ここで誰かがこれを修正する方法を教えてもらえますか?

+0

で見つけることができますか? –

+0

これに乱数が含まれていますか?どのようにシードを設定していますか?なぜこれらは違うのですか?同じプロセスを2回実行すると、同じ結果が2回発生するはずです。なぜ彼らは違うべきだと思いますか? –

+0

関数 'run'はシミュレーションを開始し、すべての結果を統合するために関数 'After'に向けられた結果を返します。それぞれのシミュレーションはランダムな初期条件を持っているため、私は異なる結果を期待しています。 私は考えている種子は使用しません。 'apply_async'を直接呼び出しで置き換えた場合、異なる結果になるかどうかを調べるには、次のコードを使用してください: randshift = np.random.rand(a、b)-0.5 * np.ones((a、b)) –

答えて

15

ちょうど私が実際の回答を追加して他の人にはっきりさせると思っていました。 AIX in this questionからの回答を引用

何が起こるかは、Unix上で、すべてのワーカープロセスは親プロセスから乱数生成器の同じ 状態を継承していることです。なぜ彼らは同じ擬似ランダムシーケンスを生成するのですか? です。

適切にシードを設定するrandom.seed()方法(またはnumpyの/ scipyのダウンロード同等)を使用。 this numpy threadも参照してください。問題の

+1

これは、新しいプロセスごとに乱数を使用するライブラリが新しい乱数で正しく開始されることを保証しますか?あるいは、各ライブラリの乱数を別々に設定する必要がありますか? –

0

溶液runから呼び出さランダム関数のための新たなシードを割り当てる機能runscipy.random.seed()を使用することでした。 (私は解決策を求めているから)

同様の問題は、あなたが結果を得るにはどうすればよいmultiprocessing.Pool seems to work in Windows but not in ubuntu?

+0

乱数を使用するプロセスごとに乱数を設定する方法はありませんか?モジュールランダム、numpy、scipy、tensorflowを使用し、他に何がわかっているとします。プロセスがそれぞれのランダムなシードを持っていることを確認する唯一の方法は、これらのそれぞれを通過して手動で状態を設定することですか? –

関連する問題