4

相互に依存する 7 つの関数で構成され、13 の異なるパラメーターを必要とする ipython ノートブックでシミュレーションを実行しています。一部の関数は、1 つの関数でシミュレーション全体を実行できるように、他の関数内で呼び出されます。シミュレーションには、合計で 20,000 回を超える反復で 2 つのパラメーターを操作することが含まれます。2 つのシミュレーションを非同期で実行できます。各反復に約 1.5 秒かかるため、並列処理を調査しています。

最初に ipyparallel を試したとき、グローバル名が定義されていないというエラーが発生しました。ローカル オブジェクトがワーカーで見つからないことは理にかなっています。うさぎの穴にかなりの時間を費やすのを避けるために、すべてのワーカーに大量のオブジェクトを渡す最も簡単な方法は何でしょうか? この方法で ipyparallel を使用する場合に考慮すべき他の落とし穴はありますか?

4

1 に答える 1

8

この関連する質問にはもう少し詳細がありますが、要点は次のとおりです。インタラクティブに定義されたモジュールは__main__、エンジンとクライアントで異なるインタラクティブな名前空間 ( ) で解決されます。を使用して関数をエンジンに送信できますview.push(dict(func=func, func2=func2))。この場合、それらは検出されます。別の方法は、すべてのエンジンに確実にインストールされるモジュールまたはパッケージで関数を定義することです。

たとえば、スクリプトでは次のようになります。

def bar(x):
    return x * x

def foo(y):
    return bar(y)

view.apply(foo, 5) # NameError on bar
view.push(dict(bar=bar)) # send bar
view.apply(foo, 5) # 25

多くの場合、ノートブックまたはより大きなスクリプトから IPython 並列を使用する場合、初期の手順の 1 つはエンジンの名前空間をシードすることです。

rc[:].push(dict(
    f1=f1,
    f2=f2,
    const=const,
))

この方法でプッシュする名前が複数ある場合は、これらの関数をモジュールで定義し、代わりに配布することを検討する時期かもしれません。

于 2015-10-10T16:40:59.637 に答える