[Python]分散処理フレームワークRayに関する備忘録。

最近Rayによる複数PCでの分散処理をする機会があったので、気がついたことをメモしておく。Windows環境を前提としている。

ノードIPアドレスの指定

通常、ray startコマンドは以下のように実行する。

ray start --head --port=6379 (ヘッドノード側)
ray start --address=192.168.XXX.YYY (ワーカーノード側)

しかしWindowsの場合、ヘッドノード、ワーカーノードともに、自身のIPアドレスを明示的に指定しなければIPが127.0.0.1(つまりlocalhost)になってしまうらしい。
これを回避するには、以下のようにIPアドレスを明示的に与える。

ray start --head --node-ip-address=192.168.XXX.YYY --port=6379 (ヘッドノード側)
ray start --address=192.168.XXX.YYY:6379 --node-ip-address=192.168.AAA.BBB (ワーカーノード側)

ただし、IPアドレスを明示指定すると--portのオプションが機能しなくなるのか、適当な番号のポートを勝手に割り当てようとして失敗することが多発する。何故?
何度か繰り返していればそのうち6379を割り当てて成功するのだが、気持ち悪い。

管理者権限の付与

ワーカーノード側のコマンドプロンプト等は管理者として立ち上げておかないと、ヘッドノードへのアクセスができなかった。本当にそんな仕様になっているのか?

CPU数の指定

ray startの実行時、そのノードの有するCPU数はおそらく自動的にCPUのスレッド数に指定される。が、各ノードにCPUを任意個ずつ宛てがいたい場合もある。
ヘッド、ワーカーノードどちらも、ray start実行時に以下のようにオプションで指定する。

ray start ... --num-cpus=X

調査不足だが、CPU数を指定してもなおノードに処理を均等に分散せず、一部に集中的にあてがわれる場合があった。sleep(3)などで処理時間を稼ぐときちんと分散したので、多分処理時間が短すぎたりしたのでは。

カレントディレクト

スクリプト実行時、各ノードのカレントディレクトリはコマンドプロンプト立ち上げ時のディレクトリとなっていた。

これを変更したい場合は、runtime environmentを使う。

runtime_env = { "working_dir": "C:\hoge\fuga" }
ray.init(runtime_env = runtime_env)

ただしこの方法だと、指定したworking_dirの中身がすべてアップロードされノード間で共有される。大きなファイルがworking_dirに含まれていたりするとエラーを起こす。その場合、runtime_env"excludes": [ "C:\hoge\fuga\piyo.txt" ]など除外したいファイル一覧を追加する必要がある。このexcludesにはgitignoreと同様の記述方法が使える。

もしくは、リモート関数内であればos.chdir(...)などの方法で移動することはできる。