これが、ドキュメントを読んで見逃した簡単な答えであることを願っています。以下は問題です -
- 起動時にすべての ipengine にモジュールをロードしました
- それ以来、モジュールに変更を加えました
- これらの変更をリモート ipengine(s) に反映させたい、つまり、すべてのリモート インスタンスでモジュールをリロードさせたい
これはどのように達成できますか?
これが、ドキュメントを読んで見逃した簡単な答えであることを願っています。以下は問題です -
これはどのように達成できますか?
次のようにして、エンジンで ipython autoreload 機能を有効にすることもできます。
%px %load_ext autoreload
%px %autoreload 2
このソリューションと dview.execute() を使用した reload の呼び出しには、新しいエンジンが後でオンラインになる可能性がある場合 (クラスターでバッチ スケジューラを使用する場合など) に問題があることに注意してください。現在存在するエンジンでのみ実行されます。
もう 1 つの問題: 深い (再帰的な) リロードが必要になる場合があります。ipengine の次のオプションを参照してください。
--ZMQInteractiveShell.deep_reload=<CBool>
Default: False
Enable deep (recursive) reloading by default. IPython can use the
deep_reload module which reloads changes in modules recursively (it replaces
the reload() function, so you don't need to change anything to use it).
deep_reload() forces a full reload of modules whose code may have changed,
which the default reload() function does not. When deep_reload is off,
IPython will use the normal reload(), but deep_reload will still be
available as dreload().
これが私が見つけた答えです。これが最善の方法かどうかはわかりません
from IPython.parallel import Client
rc = Client(profile='ssh')
dview = rc[:]
dview.execute('reload(<module>)', block = True)
リモートエンジンでテストしたいモジュールに取り組んでいたときに同じ問題に遭遇しましたが、変更を git にコミットしてから、各リモートリロードの前にエンジンマシンで変更をプルしたくありませんでした。
これを行うためのより良い方法があるかもしれませんが、私の解決策は、scp を介して進行中のコードをエンジンに簡単にシャトルできるようにする単純なヘルパー モジュールを作成することでした。
ここに使用例をコピーします。
import IPython.parallel
import ishuttle
import my_module as mm
# Create a client for the cluster with remote engines
rc = IPython.parallel.Client(profile='remote_ssh_engines')
dview = rc[:]
# Create a shuttle object; the engines' working directory
# is switched to '/Remote/engine/server/scratch' after its creation
s = ishuttle.Shuttle(rc, '/Remote/engine/server/scratch')
# Make my_module available on all engines as mm. This code scp's the
# module over, imports it as mm, then reloads it.
s.remote_import('my_module', import_as='mm')
# Apply our favourite function from our favourite module
dview.apply_sync(mm.my_func, 'favourite argument for my_func')