Skip to content
Masahiro TANAKA edited this page Nov 26, 2019 · 13 revisions

並列・分散実行が可能な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

使い方

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

$ pwrake -j 4

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

$ pwrake -j

リモートマシンを用いて並列実行:

  1. Pwrake を実行するマシン間で、Rakefileを置いた作業ディレクトリを、NFSやGfarmのような分散ファイルシステムで共有する。
  2. Pwrake を起動するマシンからワーカーノードへ、SSH でパスフレーズなしでログインできるようにする。
  • 接続の想定:
    • 手元のPC --(SSH)--> (計算機クラスタ)[ pwrake実行マシン --(SSH)--> ワーカーノード ]
  • 手元のPCで秘密鍵・公開鍵のペアを作成し、クラスタに公開鍵を登録。
  • 手元のPCで ssh-agent を起動し、ssh-add でパスフレーズを登録。
  • 手元のPCからクラスタにSSHでログインする際、次のいずれかの方法で agent forward を有効にする:
    • ssh に -A オプションをつける、
    • .ssh/configForwardAgent yes と書く
  • pwrake実行マシンからワーカーノードへの接続でも同様に agent forward を有効にする。これにより、手元のPCのagentがforwardされる。
  • 以上の方法が適用できない場合は、クラスタで ssh-keygen を用いてパスフレーズなしで鍵を作成して登録し、クラスタ内でのリモート接続を可能にする。作成した鍵は外部にコピーせず厳重に管理すること。
  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|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_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プロパティは、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ファイルシステムとは
  • 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)」