4

ipython 並列ライブラリから並列計算を使用しようとしています。しかし、私はそれについてほとんど知識がなく、並列コンピューティングについて何も知らない人からドキュメントを読むのは難しいと思います.

おかしなことに、私が見つけたすべてのチュートリアルは、私の観点からは役に立たない同じ説明で、ドキュメントの例を再利用しているだけです.

基本的に私がやりたいことは、バックグラウンドでいくつかのスクリプトを実行して、それらが同時に実行されるようにすることです。bash では次のようになります。

for my_file in $(cat list_file); do
    python pgm.py my_file &
done

しかし、Ipython ノートブックの bash インタープリターはバックグラウンド モードを処理しません。

解決策は、ipython の並列ライブラリを使用することだったようです。

私は試した :

from IPython.parallel import Client
rc = Client()
rc.block = True
dview = rc[:2] # I take only 2 engines

しかし、私は立ち往生しています。同じスクリプトまたは pgm を同時に 2 回 (またはそれ以上) 実行する方法がわかりません。

ありがとう。

4

2 に答える 2

6

1年後、やっと欲しいものを手に入れることができました。

1)別のCPUでやりたいことで関数を作成します。ここでは、!魔法の ipython コマンドを使用して bash からスクリプトを呼び出すだけです。私はそれがcall()関数で動作すると思います。

def my_func(my_file):
    !python pgm.py {my_file}

{}ご利用の際はお忘れなく!

へのパスは絶対パスである必要があることにも注意してくださいmy_file。クラスターは、ノートブックを開始した場所 (jupyter notebookまたはを実行するときipython notebook) であり、必ずしも現在の場所であるとは限りません。

2)必要な CPU の数で ipython ノートブック クラスターを起動します。2 秒待ってから、次のセルを実行します。

from IPython import parallel
rc = parallel.Client()
view = rc.load_balanced_view()

3)処理するファイルのリストを取得します。

files = list_of_files

4)viewすべてのファイルを含む関数を、作成したばかりのエンジンに非同期的にマップします。(言葉遣いに自信がない)。

r = view.map_async(my_func, files)

実行中は、ノートブックで他のことを行うことができます (「バックグラウンド」で実行されます!)。r.wait_interactive()処理されたファイルの数、これまでにかかった時間、および残っているファイルの数を対話的に列挙するを呼び出すこともできます。これにより、他のセルを実行できなくなります (ただし、中断することはできます)。

また、エンジンよりも多くのファイルがある場合でも、エンジンが 1 つのファイルで終了するとすぐに処理されます。

これが他の人に役立つことを願っています!

このチュートリアルが役立つかもしれません:

http://nbviewer.ipython.org/github/minrk/IPython-parallel-tutorial/blob/master/Index.ipynb

IPython 2.3.1私はまだ を持っていることにも注意してくださいJupyter

編集: 引き続き Jupyter で動作します。相違点と発生する可能性がある潜在的な問題については、こちらを参照してください。


関数で外部ライブラリを使用する場合は、次のように別のエンジンにインポートする必要があることに注意してください。

%px import numpy as np

また

%%px
import numpy as np
import pandas as pd

変数やその他の関数と同様に、それらをエンジンの名前空間にプッシュする必要があります。

rc[:].push(dict(
                foo=foo,
                bar=bar))

于 2015-07-30T14:10:08.037 に答える
1

いくつかの外部スクリプトを並行して実行しようとしている場合、IPython の並行機能を使用する必要はありません。次のように subprocess モジュールを使用すると、bash の並列実行を複製できます。

import subprocess

procs = []
for i in range(10):
    procs.append(subprocess.Popen(['ls', '/Users/shad/tmp/'], stdout=subprocess.PIPE))

results = []
for proc in procs:
    stdout, _ = proc.communicate()
    results.append(stdout)

サブプロセスが大量の出力を生成すると、プロセスがブロックされることに注意してください。出力 (結果) を印刷すると、次のようになります。

print results

['file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n']
于 2014-06-19T19:07:39.950 に答える