250 likes | 384 Views
並列スクリプト言語 gluepy を用いた InTrigger での活用. 弘中 健 倉沢 央 東京大学. Using InTrigger. It’s a Grid! : 現在 11 拠点 様々利用目的 多数の単体ジョブを並列処理 Grid 上で分散計算 Harness the Power of the Grid! Real Peer-to-Peer applications アプリの並列化 : Cloud Computing “wall-socket Grid” 「自分のアプリを Grid コンセントにつなぐと Grid の計算能力が手に入る」.
E N D
並列スクリプト言語 gluepyを用いたInTriggerでの活用 弘中 健倉沢 央 東京大学 www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Using InTrigger • It’s a Grid! : 現在11拠点 • 様々利用目的 • 多数の単体ジョブを並列処理 • Grid上で分散計算 • Harness the Power of the Grid! • Real Peer-to-Peer applications • アプリの並列化: Cloud Computing • “wall-socket Grid” • 「自分のアプリをGridコンセントにつなぐと Gridの計算能力が手に入る」 www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
But How? www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Because… ? ? ? ? • Task - Interaction • マシン間の通信・協調? • Socket Programming • 何で書くの? • workflow framework scripts • some good choices: Ibis Satin, Hadoop Map-Reduce • NATs/firewall • imade/kyoto クラスタ • 通信もややこしい • 動的な資源 • 途中追加・故障 • Configuration, Configuration, Configuration … • たくさん設定ファイルを書かないと • 何を書けばいいのかわからない • E.g., XML files ? gluepy … www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
But what if? • We take care of… • Socket Communication • Socket APIは触らなくてOK • Programmingでhigh-level interaction • NAT/firewall work arounds • connect() / routingしなくてOK • most configuration done automatically • デフォルトで大抵OK • カスタマイズの時のみ設定ファイル www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
gluepy • 今発表の流れ • gluepyの紹介 (弘中) • gluepyでのプログラミング + DEMO • Mini-Benchmarks • InTriggerで使うには • gluepyの実用例 (倉沢) • 「著者同定システム」の並列化 www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
gluepy (“glue-pii”) object • “glue python” • Python Library • 並列分散計算ライブラリ • 分散オブジェクト指向 • グリッド上にobjectを分散 • objectに対する呼び出し (RMI) で分散計算 • Remote Method Invocation • 並列計算サポート • 非同期呼び出し • 同期 (e.g., sync) • 参加・脱退対応 • NAT / firewall 含めた接続性を自動解決 • Overlay construction obj.f() RMI leave join www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Programming with gluepy • server-client model : クライアントで計算する server.py import glue, time class Server: def __init__(self): self.clients = [] def join(self, c): self.clients.append(c) def run(self): while True: for c in self.clients: try: print c.run() except: print “error:”, c time.sleep(1) s = glue.ro.RemoteObject(Server()) s.register( “server” ) s.run() import library loop and continuous RMI on client wrap as RemoteObject and export object www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Programming with gluepy client.py import glue, time from socket import gethostname class Client: def run(self): for i in xrange(100000000): pass return “hello: ” + gethostname() c = glue.ro.RemoteObject(Client()) s = glue.ro.RemoteRef(“server”) s.join(c) while True: time.sleep(3600) some calculation… Look-up server object RMI and pass ref. to join www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Demo • Let’s see this all in action! www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Quick Recap • 1. startup a bootstrap server • set everyone’s bootstrap url: • 2. start server code • 3. start client code(s) • 4. enjoy the terribly interesting console output :D • $ export GLUE_BOOTSTRAP_URL=tcp://HOST:PORT www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Get Some Parallelism • Serial ⇒ Parallel invocation • 非同期呼び出し • まとめて呼び出す、まとめて集める www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Code for Parallelism • サーバコードを編集 parallel_server.py def run(self): while True: futures = [] for c in self.clients: f = c.run.future() futures.append(f) glue.ro.waitall(futures) for f in futures: try: print f.get() except: print “error:” server.py def run(self): while True: for c in self.clients: try: print c.run() except: print “error:”, c async. RMI on all get placeholder wait forallresults read forallresults www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Better Parallelism • waitall() wait() を使って暇なclientにRMI lb_server.py def run(self): futures = {} while True: while len(self.clients) > 0: c = self.clients.pop() f = c.run.future() futures[f] = c readys = glue.ro.wait(futures.keys()) for f in readys: c = futures.pop(f) try: print f.get() self.clients.append(c) except: print “error:”, c rmi onany idle clients wait foranyresults record idle client www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Parallel deployment • たくさんの資源を使う場合 • 逐一、consoleで叩くのも大変 • 並列 deployerを使う • Batch schedulerを使う • InTriggerの場合:torque, qsub • GXPを使う • gxpc e command で一括投入 • gxpc mw command を使う • bootstrap serverが不要になる $ gxpc export VAR=VALUE が使える • $ gxpc e python client.py • $ gxpc mw python server_client.py www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
gluepy Common Design Patterns “master” lookup • Common Style: Master-Worker • Master: • 1. export object • Workers: • 2. lookup object • 3. join master’s worker set • Master: • 4. master gives jobs • Tree-like: hierarchical MW • do steps similar to MW • Establish parent-child relationship • Each process: • do RMI on children objects using recursion • “P2P-like” • Each process: • 1. create object on few others • 2. do RMIs w.run(args) “master” m.join(w) child.run() child.run() www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Other APIs… • Generally RemoteObject Wrappables • Object instances, class instances, file pointers, functions • SerialObjects • RemoteObjects with implicit mutual exclusion • NodeObjects • Unique object on each process • Useful for remote file open, remote object instanciation • wait() • equivalent to “wait for any” • indispensible for efficient load-balancing • Group : NEW • Group Method Invocation (GMI) • RMI on group of objects with same interface • Documentation available at Home Page www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Connection Workings NAT Global IP • Overlay構築 • 各プロセスは数人に接続 • 連結グラフを作る • ルーティング • Bootstrap • 初期化にbootstrap serverにREQ • 初めてgluepy primitive実行する時に行われる • Contact points を得る • SSH only nodes: • automatic port-forwarding • 対応点 • TCP connectionscalability • NAT/firewall 越え • SSH-only clusters (設定必要) Firewall Attempt connection SSH established connections www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Micro-Benchmarks • Latency • Overlay上でno-opのRMI : ping() • Bandwidth • Overlay上で大きい引数のRMI : send_data() • Data-Intensive Task の Scalability • MW-styleで大きい引数のRMIをN個する: send_data_and_wait() X N • Speedupを測定 www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Latency Overhead • Chiba100 から chiba, imade, hiro, kyoto, mirai のノードのobjectへRMI : ping() • pingで測定したRTTと比較 • overlay, 1 hop = ~1.5 [ms] www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Bandwidth Throughput • 引数 (de)serialization overhead 大 • Full 1Gbit Ethernetで理想最大値: 40[MB/sec] • iperf 測定値から算出される最大値と比較 • overlayでhopをするたびにバンド幅が減少 Overlay hop数 でクラスタ内でもバンド幅が変化 www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
Parallel Data Intensive Processing • 710 workers • method 実行時間: 1[sec] • 入力引数サイズNを変化 • master nodeのbandwidthが bottleneck • 約36[MB/s] 50KB mark www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
InTriggerで使うには • 使う各拠点で • gluepyをダウンロード • install • “glue”モジュールへのパスをPYTHONPATHに通す • もしくは自分のpythonで • $ python setup.py install www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
InTrigger上の注意点 • IGNORE IP address • 10.*.*.* IPMI IP • 172.*.*.* camera IP • 対策: CWD に connect.confを書く • Signalがmaskされることが多い • Python+ threads + signal ⇒ ? ? ? • CTRL + Cでもほぼ必ずゴミが残る • GXPで投入する場合、bombによるごみ回収を忘れずに • 複数のクラスタで全コア使って一斉立ち上げ • 初期化に非常に時間がかかるプロセスもある • connection handshakeでcongestion/packet lossが原因? • 根拠: send()中に“connection timed out” COPY & PASTE #ignore ipmi ips ignore .* 10\. #ignore imade camera ips ignore .* 172\. www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy
まとめ • gluepy: GridProgramming Framework • gluepy • 分散オブジェクト指向 • 並列計算サポート • NAT / firewall 含めた接続性を自動解決 www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy • DEMO programs in package: ./ex/demo • まだまだ開発中です • 要望・コメント・バグレポート承ります www.logos.ic.i.u-tokyo.ac.jp/~kenny/gluepy