背景
numpy データ(画像データ, ボリュームデータなどサイズ大きめ)を RPC でやりとりしたい.
IPython, Jupyter-lab で C native module を autoreload するメモ
https://qiita.com/syoyo/items/0c633eda1a0bfdc31e3a
にあるように, 計算モジュールが native module になっており, リロードさせたいために Python プロセスを分けたいとか,
ぱぱっと numpy データを複数 PC に送って分散処理させたいときとか.
yarr がありました.
yarr
ありがとうございます. 普通に pip で入ります.
python -m pip install yarr
pure Python なので Windows でも動きます.
Linux, Windows で動作確認しました.
(ただ, Win server, Linux client の場合だと通信できませんでした. Win 側でポートを開けておかないとだめ?(client 側で connection error 出してくれない))
server
import yarr
import numpy
def proc_numpy(a):
print(a)
# server
yarr.yarr(('localhost', 8000), [proc_numpy])
client
import yarr
import numpy
a = numpy.random.rand(256, 512, 512)
yarr.call(('localhost', 8000), 'proc_numpy', a)
Voila!
さくっと numpy データ送れました.
localhost Threadripper 1950X で試したところ, 256x512x512x8(sizeof(float64)) = 512 MB
で 2 秒くらいでした. ネットワークだと帯域ネックになる(~2.5 G イーサくらいまで)ので, パフォーマンスには問題ないでしょう.
しくみ
中身としては struct
module でエンコード/デコードして, socket 通信で送っているだけです.
コードも 100 行ちょっとなので, 必要に応じて自前で改変できます.
問題点
ライセンスの名前がよくない...(ライセンス自体は Public domain に近いのでよいので残念)