問題タブ [ipython-parallel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - ipython 並列エンジンで %autoreload を使用するにはどうすればよいですか?
魔法のコマンド %autoreload をリモートの ipengine で動作させることは可能ですか?
以下の作品:
次に、blah を変更して 8 を返します。
しかし、私ができるようにしたいのは次のとおりです。
リロード手順をスキップします。ただし、これを試しても変更は反映されず、blah.test() はまだ古いバージョンのコードを使用しています。execute コマンドで何か間違ったことをしていないことを確認するために、マジック関数も使用してみました。
それでも自動リロード機能が得られません。
ありがとう。
ipython - Sun Grid Engine での IPython Parallel の使用
Sun Grid Engine を実行しているクラスターでシミュレーションを実行したいという非常に一般的なシナリオで IPython Parallel を使用しようとしていますが、これを行うための信頼できる方法が見つかりません。
これが私がやろうとしていることです:
いくつかの異なるパラメーター値を使用して (Numpy 配列を使用して) 数値シミュレーションを実行したい - タスクは明らかに/「恥ずかしいほど」並列です。Grid Engine を実行しているクラスターのヘッド ノードに (ssh 経由で) アクセスできます。今までは、QSUB コマンドでシェル スクリプトを実行していましたが、これは非常に扱いにくく (ノード クラッシュの処理など)、Python でこれらすべてを実行する方法を探していました。
IPython はこのシナリオに理想的に適しているように見えますが、セットアップをスムーズに機能させるには面倒であることが判明しています。ヘッド ノードで IPCLUSTER を使用して n 個 (たとえば 20 個) のエンジンを起動し、IPython.parallel.Client を使用して接続したローカル コンピューターに .json ファイルをコピーします。
私は設定 IPClusterStart.controller_launcher_class = 'SGEControllerLauncher'
し、IPClusterEngines.engine_launcher_class = 'SGEEngineSetLauncher'
IPCLUSTER は正常に動作しているようです。ssh ターミナルのヘッド ノードから次の出力を取得します。
ただし、次の問題があります。
多くの場合、エンジンが正常に起動したという上記のメッセージが表示された後でも、多くのエンジンがコントローラーへの登録に失敗します。20 個のエンジンで IPCLUSTER を開始すると、10 ~ 15 個のエンジンが Grid Engine キューに表示されます。他のエンジンがどうなるかわかりません。出力ファイルがありません。これらの 10 ~ 15 個のエンジンのうち、一部のみを開始するエンジンがコントローラーに登録され、出力ファイルに次のように表示されます。
他の人にはこれが見えます:
なぜこれが起こるのか分かりますか?
時々、エンジンは正常に起動して登録されますが、次のような非常に単純なものを実行するとエンジンが停止し始め
view.execute('%pylab')
ます。返される唯一の例外は次のとおりです。[エンジン例外] トレースバック (最新の呼び出しが最後): ファイル "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/parallel/client/client.py"、708 行目、_handle_stranded_msgs で error.EngineError("タスク %r の実行中にエンジン %r が停止しました"%(eid, msg_id)) EngineError: タスク 'b9601e8a-cff5-4037-b9d9-a0b93ca2f256' の実行中にエンジン 1 が停止しました
このようにエンジンを起動すると、エンジンが実行されている限り、たとえ何も実行していなくても、ノードとキューが占有されます。エンジンを起動して、スクリプトを実行したいときにのみ生成され、計算結果が返されるとエンジンが閉じられるようにする簡単な方法はありますか?
Grid Engine は毎回異なるノードでコントローラを起動するように見えるため、IPCLUSTER 構成ファイルの --ruse フラグは役に立ちません。IPCLUSTER を使用するたびに JSON ファイルをコピーする必要があります。これを回避する方法はありますか?
IPython 並列を使用して、SSH 接続を介して明らかに並列ジョブを SGE クラスターに送信するという、この一般的なシナリオの簡単なワークフローを誰かが提供できれば、非常に役に立ちます。エンジン クラッシュの再送信を処理する何らかの方法が必要です。また、シミュレーション中にのみクラスター リソースを使用する方法があると便利です。
python - 事前定義されたメモリ プール オブジェクトを使用してスレッドをコアに固定する方法は? (80 コア Nehalem アーキテクチャ 2Tb RAM)
2Tb DRAM を搭載した 80 コア (160HT) nehalem アーキテクチャでいくつかのテストを実行した後、軽度の HPC 問題に遭遇しました。
2 つ以上のソケットを持つサーバーは、各スレッドが「間違った」ソケット上のオブジェクトに関する情報を要求し始めるため、多くのストール (遅延) を開始します。つまり、要求は、1 つのソケット上のいくつかのオブジェクトで作業しているスレッドから情報をプルします。それは実際には他のソケットの DRAM にあります。
リモート ソケットが要求を返すのを待っていることはわかっていますが、コアは 100% 使用されているように見えます。
ほとんどのコードは非同期で実行されるため、コードを書き直すのははるかに簡単です。そのため、一方のソケットのスレッドから他方のスレッドへのメッセージを解析できます (ロックされた待機はありません)。さらに、各スレッドをメモリ プールにロックしたいので、ガベージ コレクターで時間 (~30%) を浪費する代わりにオブジェクトを更新できます。
したがって、質問:
Pythonで所定のメモリプールオブジェクトを使用してスレッドをコアに固定する方法は?
もう少しコンテキスト:
ZeroMQ を中間に配置し、各 ZMQworker が管理するメモリ プール間でメッセージをやり取りする技術を作成すると、Python はマルチコアを問題なく実行できます。ZMQ の 8M メッセージ/秒では、オブジェクトの内部更新に、パイプラインを満たすよりも時間がかかります。これはすべてここで説明されています: http://zguide.zeromq.org/page:all#Chapter-Sockets-and-Patterns
したがって、少し単純化しすぎて、80 個の ZMQworkerprocesses と 1 個の ZMQrouter を生成し、コンテキストに大量のオブジェクト (実際には 5 億 8400 万個のオブジェクト) をロードします。この「開始点」から、オブジェクトは相互作用して計算を完了する必要があります。
これがアイデアです:
- 「オブジェクト X」が「オブジェクト Y」と対話する必要があり、Python スレッドのローカル メモリ プールで利用できる場合、対話は直接行う必要があります。
- 「オブジェクト Y」が同じプールで利用できない場合は、ZMQrouter を介してメッセージを送信し、ルーターが後で応答を返すようにします。私のアーキテクチャはノンブロッキングであるため、特定の python スレッドで行われていることは、zmqRouters の応答を待たずに続行されます。同じソケット上にあるが異なるコア上のオブジェクトであっても、2 つのスレッドで同じメモリ オブジェクトを操作するよりも、クリーンなメッセージ交換を行うことを好むため、対話しないことをお勧めします。
これを行うには、次のことを知る必要があります。
- 特定の python プロセス (スレッド) が実行されているソケットを特定する方法。
- その特定のソケットのメモリ プールを Python プロセスに割り当てる方法 (メモリ プールの合計がメモリ プールをあるソケットから別のソケットにプッシュしないようにするための malloc 制限など)
- 私が考えていないこと。
しかし、これを行う方法についてのPythonドキュメントで参照を見つけることができず、Googleで間違ったことを探しているに違いありません。
アップデート:
「なぜ MPI アーキテクチャで ZeroMQ を使用するのですか?」という質問については、次のスレッドをお読みください: Spread vs MPI vs zeromq? 私が取り組んでいるアプリケーションは、MPI の方が適しているアーキテクチャでテストされていますが、分散展開用に設計されているためです。
更新 2:
質問について:
「Python(3) で所定のメモリ プールを使用してスレッドをコアに固定する方法」 答えはpsutilsにあります。
ワーカーをコアにペグすることで、NUMA を効果的に活用できます (CPU タイプを調べて、それが NUMA アーキテクチャであることを確認してください!)
2 番目の要素は、メモリ プールを決定することです。これは、psutilsまたはリソース ライブラリでも実行できます。
ipython - IPython並列のエンジンからのリアルタイム出力?
IPython の優れた並列化機能を使用して、実行時間の長いタスクを多数実行しています。
IPython クライアントで ipengines の stdout からリアルタイム出力を取得するにはどうすればよいですか?
たとえば、私は実行dview.map_async(fun, lots_of_args)
していfun
て、stdout に出力しています。出来上がりの様子を見ていきたいと思います。
については知っていますが、すべてのタスクが完了した後にAsyncResult.display_output()
のみ使用できます。
python - 関数への入力としてジェネレーターで IPython.parallel map() を使用する方法
IPython.parallel マップを使用しようとしています。並列化したい関数への入力はジェネレーターです。サイズ/メモリのため、ジェネレーターをリストに変換することはできません。以下のコードを参照してください。
database - IPython 並列ハブ データベースからの結果の取得
IPython 並列を使用して、SGE クラスターで並列ジョブを実行しています。ジョブを送信し、後ですべてのジョブが終了したときに、ジョブ メッセージ ID を使用してハブ データベース (SQlite) から結果を取得します。これは、コントローラーがクラッシュするまで問題なく機能しました。コントローラーを再起動すると、古いコントローラーに送信されたジョブを取得できませんでした。このエラーが発生しました:
データベース ファイル (tasks.db) はまだ存在し、ハブがクラッシュする前と同じサイズです。だから、結果はデータベースにあると確信しています。新しいコントローラーを使用してそれらを取得できますか? また、bd_query コマンドを使用すると、次のようになります。
空の結果が得られます。
python - IPython の sum() に基づく実行時間差
IPython の ipcluster エンジンを使用して、簡単なモンテカルロ シミュレーションの演習を行っています。関数の定義方法によって実行時間に大きな違いがあることに気付きました。その理由を尋ねています。詳細は次のとおりです。
以下のようにタスクを定義すると、高速です。
並行して実行する場合:
しかし、関数を次のように変更すると:
私が得る:
3.141232 1 ループ、ベストオブ 1: ループあたり 3.81 秒
...これは 71 倍遅いです。この理由は何ですか?
python - sync_imports() を使用して IPython.parallel エンジンにカスタム モジュールをインポートする
私は IPython.parallel をいじっていて、独自のカスタム モジュールを使用したかったのですが、Cookbook usingで説明されているようにそれを行うことができませんでしたdview.sync_imports()
。私のために働いた唯一のことは、次のようなものでした
そして、主にただ
これを行う正しい方法は、私の意見では次のようになります
しかし、これは、という名前のモジュールがないというエラーをスローしますmy_module
。
それで、それを使用してそれを行う正しい方法は何dview.sync_imports()
ですか??