-
Notifications
You must be signed in to change notification settings - Fork 4
Pwrakeとは
並列・分散実行が可能なRakeです。従来の非並列プログラムを多数の計算機を用いて並列に実行することにより、Hadoopのような大規模データ処理をお手軽に実現できます。
- Rakefileに記述したワークフローの「並列」実行が可能。
-
ワークフロー記述言語は、Rake用のRakefileと全く同じ。Rake用に記述したワークフローはPwrakeで実行可能。
-
依存関係がないタスクを「自動で」並列実行する。タスクが次のグラフのような依存関係のとき、タスクA,B,C,Dを同時に実行できる。
A B C D \ / \ / E F \ / G
-
Rakeでも並列実行は可能だが、
multitask
のprerequisiteタスクのみが並列に実行される。つまり並列タスクを明示的に指定する必要がある。
-
- 複数の計算ノードを用いた「分散」実行が可能。
- 必要な計算機クラスタの設定:
- SSHでリモートノードにログイン可能であること。
- 分散ファイルシステム(NFS,Gfarm等)によって作業ディレクトリが共有されていること。
- リモートホスト名、並列数を記述したファイルを pwrake のオプションで指定。
- pwrake を実行すると、自動的にSSHでリモートホストに接続する。あらかじめデーモンを起動しておくなどの準備は不要。
- 必要な計算機クラスタの設定:
-
Gfarmファイルシステムによる、計算ノードのストレージを活用した高性能な並列I/O
- 計算ノードのストレージへの並列アクセスにより、I/O性能がスケーラブルに向上する。
- 出力ファイルの格納先は、Gfarmのスケジューリング機能により、ローカルストレージが選択される。
- Pwrakeのスケジューリング機能により、タスクを実行する計算ノードとして、入力ファイルが保存されているノードを選択する。
- その他、Gfarmファイルシステム自動マウントなど、Gfarm対応機能をPwrakeに実装。
- Ruby バージョン 2.2.3 以降
- Linux
- 複数マシンでの実行に必要:
- SSH command
- 分散ファイルシステム (NFS, Gfarmなど)
RubyGems によるインストール:
$ gem install pwrake
または、ソースコード(tgz/zip)をダウンロードし、サブディレクトリに移って次のコマンドを実行 (この場合、Parallel を手動でインストールする必要があります):
$ ruby setup.rb
rbenvを使っている場合などは、インストール後、pwrakeコマンドを検索パスに反映させる必要があります。
$ rbenv rehash
$ pwrake -j 4
$ pwrake -j
- Pwrake を実行するマシン間で、Rakefileを置いた作業ディレクトリを、NFSやGfarmのような分散ファイルシステムで共有する。
- Pwrake を起動するマシンからワーカーノードへ、SSH でパスフレーズなしでログインできるようにする。
- 接続の想定:
- 手元のPC --(SSH)--> (計算機クラスタ)[ pwrake実行マシン --(SSH)--> ワーカーノード ]
- 手元のPCで秘密鍵・公開鍵のペアを作成し、クラスタに公開鍵を登録。
- 手元のPCで
ssh-agent
を起動し、ssh-add
でパスフレーズを登録。 - 手元のPCからクラスタにSSHでログインする際、次のいずれかの方法で agent forward を有効にする:
- ssh に
-A
オプションをつける、 -
.ssh/config
にForwardAgent yes
と書く
- ssh に
- pwrake実行マシンからワーカーノードへの接続でも同様に agent forward を有効にする。これにより、手元のPCのagentがforwardされる。
- 以上の方法が適用できない場合は、クラスタで
ssh-keygen
を用いてパスフレーズなしで鍵を作成して登録し、クラスタ内でのリモート接続を可能にする。作成した鍵は外部にコピーせず厳重に管理すること。
-
実行ホスト名と使用コア数を、ホストファイルに記述する:
$ cat hosts host1 2 host2 2
-
オプション
--hostfile
か-F
でホストファイルを指定して、pwrake
を実行:$ pwrake --hostfile=hosts
-F, --hostfile FILE [Pw] Read hostnames from FILE
-j, --jobs [N] [Pw] Number of threads at localhost (default: # of processors)
-L, --log, --log-dir [DIRECTORY] [Pw] Write log to DIRECTORY
--ssh-opt, --ssh-option OPTION
[Pw] Option passed to SSH
--filesystem FILESYSTEM [Pw] Specify FILESYSTEM (nfs|gfarm2fs)
--gfarm [Pw] (obsolete; Start pwrake on Gfarm FS)
-A, --disable-affinity [Pw] Turn OFF affinity (AFFINITY=off)
-S, --disable-steal [Pw] Turn OFF task steal
-d, --debug [Pw] Output Debug messages
--pwrake-conf [FILE] [Pw] Pwrake configuration file in YAML
--show-conf, --show-config [Pw] Show Pwrake configuration options
--report LOGDIR [Pw] Generate `report.html' (Report of workflow statistics) in LOGDIR and exit.
--report-image IMAGE_TYPE [Pw] Gnuplot output format (png,jpg,svg etc.) in report.html.
--clear-gfarm2fs [Pw] Clear gfarm2fs mountpoints left after failure.
-
pwrake_conf.yaml
: このファイルが当該ディレクトリに存在すれば、これを読んでオプションを設定する。 これによりPwrakeオプションをコマンドラインに記述する手間を省くことができる。 -
Example (in YAML form):
HOSTFILE: hosts LOG_DIR: true DISABLE_AFFINITY: true DISABLE_STEAL: true FAILED_TARGET: delete PASS_ENV : - ENV1 - ENV2
-
pwrake_conf.yaml オプション一覧:
HOSTFILE, HOSTS nil(default, localhost)|filename LOG_DIR, LOG nil(default, No log output)|true(dirname="Pwrake%Y%m%d-%H%M%S")|dirname LOG_FILE default="pwrake.log" TASK_CSV_FILE default="task.csv" COMMAND_CSV_FILE default="command.csv" GC_LOG_FILE default="gc.log" WORK_DIR default=$PWD FILESYSTEM default(autodetect)|gfarm SSH_OPTION SSH option PASS_ENV (Array) Environment variables passed to SSH HEARTBEAT default=240 - Hearbeat interval in seconds RETRY default=1 - The number of task retry HOST_FAILURE default=2 - The number of allowed continuous host failure (since v2.3) FAILED_TARGET rename(default)|delete|leave - Treatment of failed target files FAILURE_TERMINATION wait(default)|kill|continue - Behavior of other tasks when a task is failed QUEUE_PRIORITY LIFO(default)|FIFO|LIHR(LIfo&Highest-Rank-first; obsolete) DISABLE_RANK_PRIORITY false(default)|true - Disable rank-aware task scheduling (since v2.3) RESERVE_NODE false(default)|true - Reserve a node for tasks with ncore>1 (since v2.3) NOACTION_QUEUE_PRIORITY FIFO(default)|LIFO|RAND SHELL_START_INTERVAL default=0.012 (sec) GRAPH_PARTITION false(default)|true REPORT_IMAGE default=png # Gfarmオプション: DISABLE_AFFINITY default=false DISABLE_STEAL default=false GFARM_BASEDIR default="/tmp" GFARM_PREFIX default="pwrake_$USER" GFARM_SUBDIR default='/' MAX_GFWHERE_WORKER default=8 GFARM2FS_COMMAND default='gfarm2fs' GFARM2FS_OPTION default="" GFARM2FS_DEBUG default=false GFARM2FS_DEBUG_WAIT default=1
- Taskプロパティは、Taskごとに指定するオプションである。
記述箇所は、Rakefileの中で、タスク定義の直前の
desc
の文字列中である。
Rakefileの例:
desc "ncore=4 allow=ourhost*" # Rakeではdescをruleに指定できないが、Pwrakeではタスクプロパティの指定が可能。
rule ".o" => ".c" do
sh "..."
end
(1..n).each do |i|
desc "ncore=2 steal=no" # 直後のタスクにのみ作用するため、ループの中に書く。
file "task#{i}" do
sh "..."
end
end
オプション一覧 (一番左がデフォルト):
ncore=integer|rational - タスクが使用するコア数
exclusive=no|yes - ノード内で排他的にタスクを実行
allow=hostname - 実行を許可するホスト名 (ワイルドカード使用可)
deny=hostname - 実行を拒否するホスト名 (ワイルドカード使用可)
order=deny,allow|allow,deny - 評価の順序
steal=yes|no - タスクスチール(入力ファイルが存在するホスト以外での実行)を許可
- Gfarmファイルシステムとは
- Gfarmを使用する場合、Pwrakeに含まれる
gfwhere-pipe
というスクリプトを起動する。 このスクリプトは、Ruby標準ライブラリの Fiddle 経由でlibgfarm.so.1
を使用する(Pwrake ver.2.2.7 以降)。libgfarm.so.1
を見つけられるように、環境変数LD_LIBRARY_PATH
を正しく設定しておく。
-
Pwrakeではグラフ分割スケジューリングのため METIS (http://www.cs.umn.edu/~metis/) を用いる。 グラフ分割スケジューリングを行う場合、METIS 5.1.0 のソースを取得し、コンパイルおよびインストールする(CMakeが必要)。
-
さらに RbMetis (https://github.com/masa16/rbmetis) を下記のようにインストールする。
gem install rbmetis -- \ --with-metis-include=/usr/local/include \ --with-metis-lib=/usr/local/lib
このソフトウェアは、以下の支援を受けて開発されました。
- JST CREST: 研究領域「科学的発見・社会的課題解決に向けた各分野のビッグデータ利活用推進のための次世代アプリケーション技術の創出・高度化」における研究課題「広域撮像探査観測のビッグデータ分析による統計計算宇宙物理学」
- JST CREST: 研究領域「ポストペタスケール高性能計算に資するシステムソフトウェア技術の創出」における研究課題「ポストペタスケールデータインテンシブサイエンスのためのシステムソフトウェア」
- 文部科学省の科学技術試験研究委託事業による委託業務: 次世代IT基盤構築のための研究開発「e-サイエンス実現のためのシステム統合・連携ソフトウェアの研究開発(RENKEI)」