Skip to content
Masahiro TANAKA edited this page May 25, 2016 · 7 revisions

並列・分散実行が可能なRakeです。従来の非並列プログラムを多数の計算機を用いて並列に実行することにより、Hadoopのような大規模データ処理をお手軽に実現できます。

特徴

  • Rakefileに記述されたワークフローを並列に実行する。
    • Rakefileの仕様は、Rakeと全く同じ。
    • 依存関係がないタスクを自動で並列に実行。
    • Rakeの並列タスク定義である multitask は不要。
  • 複数の計算ノードからなる計算機クラスタを用いて、並列分散実行が可能。
    • 分散実行に必要なクラスタの設定は、SSHでログインできること、および、NFS,Gfarm等でディレクトリが共有されていること。
    • Pwrakeが起動時に自動でリモートホストにSSHで接続する。デーモンの起動は不要。
    • オプションにより、リモートホスト名、並列数を指定。
  • Gfarmファイルシステムによる、計算ノードのストレージを活用した高性能な並列I/O
    • 計算ノードのストレージへの並列アクセスにより、I/O性能がスケーラブルに向上する。
    • 出力ファイルの格納先は、Gfarmのスケジューリング機能により、ローカルストレージが選択される。
    • Pwrakeのスケジューリング機能により、タスクを実行する計算ノードとして、入力ファイルが保存されているノードを選択する。
    • その他、Gfarmファイルシステムの自動マウント機能など。

インストール

RubyGems によるインストール:

$ gem install pwrake

または、ソースコード(tgz/zip)をダウンロードし、サブディレクトリに移って次のコマンドを実行 (この場合、Parallel を手動でインストールする必要があります):

$ ruby setup.rb

rbenvを使っている場合などは、インストール後、pwrakeコマンドを検索パスに反映させる必要があります。

$ rbenv rehash

使い方

ローカルホストで最大4プロセスで並列実行:

$ pwrake -j 4

ローカルホストのコア数を最大プロセス数として並列実行:

$ pwrake -j

リモートホストを用いて並列実行:

  1. 実行ホスト間で、Rakefileのあるディレクトリを、NFSやGfarmのような分散ファイルシステムで共有する。
  2. 次のいずれかの方法で、実行ホストにSSHでパスフレーズなしでログインできるようにする。
  • ssh-keygen でパスフレーズを入力せずに作成した鍵を登録する
  • ssh-add でエージェントにパスフレーズを登録する
  1. 実行ホスト名と使用コア数を、ホストファイルに記述する:

     $ cat hosts
     host1 2
     host2 2
    
  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|gfarm)
    --gfarm                      [Pw] FILESYSTEM=gfarm
-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 configuation file in YAML
    --show-conf, --show-config   [Pw] Show Pwrake configuration options
    --report LOGDIR              [Pw] Report workflow statistics from LOGDIR to HTML and exit.
    --clear-gfarm2fs             [Pw] Clear gfarm2fs mountpoints left after failure.

pwrake_conf.yaml

  • 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
      SHELL_COMMAND     default=$SHELL
      SHELL_RC          Run-Command when shell starts
      PASS_ENV          (Array) Environment variables passed to SSH
      HEARTBEAT         defulat=240 - Hearbeat interval in seconds 
      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          LIHR(default)|FIFO|LIFO|RANK
      NOACTION_QUEUE_PRIORITY FIFO(default)|LIFO|RAND
      SHELL_START_INTERVAL    default=0.012 (sec)
      GRAPH_PARTITION         false(default)|true
    
  • 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_OPTION     default=""
      GFARM2FS_DEBUG      default=false
      GFARM2FS_DEBUG_WAIT default=1
    

Taskプロパティ

  • 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     - タスクが使用するコア数
exclusive=no|yes  - ノード内で排他的にタスクを実行
allow=hostname    - 実行を許可するホスト名 (ワイルドカード使用可)
deny=hostname     - 実行を拒否するホスト名 (ワイルドカード使用可)
order=deny,allow|allow,deny - 評価の順序
steal=yes|no      - タスクスチール(入力ファイルが存在するホスト以外での実行)を許可

Gfarm 関連

  • Gfarmファイルシステムとは

  • Gfarmを使用する場合、Pwrakeに含まれる gfwhere-pipe というコマンドを起動する。 このスクリプトは、Ruby/FFI (https://github.com/ffi/ffi) を用いるため、 下記のように Ruby/FFI のインストールしておく:

    gem install ffi
    

グラフ分割スケジューリング

  • 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
    

Tested Platform

  • Ruby 2.2.2
  • Rake 10.4.2
  • CentOS 6.7

謝辞

このソフトウェアは、以下の支援を受けて開発されました。

  • JST CREST: 研究領域「ポストペタスケール高性能計算に資するシステムソフトウェア技術の創出」における研究課題「ポストペタスケールデータインテンシブサイエンスのためのシステムソフトウェア」
  • 文部科学省の科学技術試験研究委託事業による委託業務: 次世代IT基盤構築のための研究開発「e-サイエンス実現のためのシステム統合・連携ソフトウェアの研究開発(RENKEI)」