分子シミュレーション関連:環境構築:torque_旧pbs

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
分子シミュレーション関連:環境構築:torque_旧pbs [2016/11/25 12:16] – 削除 mumeiyamibito分子シミュレーション関連:環境構築:torque_旧pbs [2016/11/25 12:17] (現在) – 以前のリビジョンを復元 (2016/10/12 17:14) mumeiyamibito
行 1: 行 1:
 +====== torque (旧OpenPBS) ======
 +===== 概要 =====
 +  * 計算機クラスターのジョブ管理スケジューラ
 +    * 異なるジョブを逐次処理させたい場合に便利 (以下の条件の時とか?)
 +      * メモリや CPU を最大まで使うジョブが複数あり、同時に流すとリソースの取り合いになる。最悪の場合、計算機が落ちる。
 +      * コマンドラインで、 && とか ; で複数のジョブをつなげても実現できるけど、その後に追加のジョブが入った場合は? 
 +      * ジョブの終了時間を予測し、マージンをとって、at コマンドで時間を指定してジョブを実行する方法もあるけど、マージン分の時間がもったいない。予測が外れたらリソースの取り合いになる。
 +    * 要はプリンターの印刷状況画面のキュー (印刷データ) が、ジョブに置き換わっただけ。
 +    * 別に計算機クラスターである必要はなく、自分の PC に入れても問題ない
 +  * Ubuntu (Debianも?)では、torque-server (サーバ用)、torque-scheduler (スケジューラ)、torque-mom (ノード用) の 3 つのパッケージで機能する
 +    * スケジューラを変えるなどすることもあるようだ
  
 +===== 使い方 =====
 +  * ジョブ投入\\ <code bash>$ qsub [オプション] ジョブファイル</code>
 +    * オプション: ジョブファイルのオプションと同じ ([[#ジョブファイル]])
 +  * ジョブ一覧\\ <code bash>$ qstat [オプション]</code><code>
 +
 +Job id                    Name             User            Time Use S Queue
 +------------------------- ---------------- --------------- -------- - -----
 +760.servername            JOB_NAME1        hoge            311:35:2 R F              
 +762.servername            JOB_NAME2        hoge            165:50:2 R F              
 +860.servername            JOB_NAME3        fuga            03:03:40 R F              </code>
 +    * Job id: 投入順に番号が付けられる (job id を指定するコマンドでは、最初の数字だけで十分)
 +    * Name: ジョブ名
 +      * qsub の -N オプションや、ジョブファイルの PBS -N で指定が可能
 +      * オプションなどで指定されていない場合は、ジョブファイル名の先頭から15文字が使われる
 +    * User: ジョブを投入したユーザ名
 +    * Time: ジョブ処理にかかっている時間 (複数の CPU を指定している場合は、CPU 数に合わせて倍になる)
 +    * S: ステータス
 +      * R: Running (処理中)
 +      * Q: Queue (待機中)
 +      * H: Hold (保留中; ジョブの順番が回ってきても処理しない)
 +      * E: Exit (終了; ?)
 +      * T: 移行中(?)
 +      * W: 待機中(?)
 +    * Queue: ジョブが所属しているキュー
 +  * ジョブ削除\\ <code bash>$ qdel ジョブID ...</code>
 +    * ジョブIDは複数指定が可能
 +  * ジョブの順序の入れ替え\\ <code bash>$ qorder ジョブID1 ジョブID2</code>
 +  * ジョブの保留(ジョブ実行の順番が回ってきても実行しない) \\ <code bash>$ qhold ジョブID1 ジョブID2 ...</code>
 +  * ジョブの保留解除\\ <code bash>$ qrls ジョブID1 ジョブID2 ...</code>
 +  * ジョブの実行\\ <code bash>$ qrun ジョブID1 ジョブID2 ...</code>
 +  * キューの変更\\ <code bash>$ qmove 変更後のキュー名 ジョブID1 ジョブID2 ...</code>
 +  * ジョブの属性変更\\ <code bash>$ qalter [投入時の属性オプション] ジョブID1 ジョブID2 ...</code>
 +    * ''投入時の属性オプション'' とは、qsub に与えた ''-l'' や ''-j''、''-m''、''-N'' などのノードやジョブタイトルなどの属性 (詳しくは、[[#ジョブファイル | ジョブオプション]] を参照)
 +    * qhold してから qalter、qrls して使うと良い
 +    * ただし、ジョブ内容は変更できない (例えば、特定のノードでのみ有効なジョブコマンドを属性変更したノード先では使えないし、ジョブが ''mpirun -n 16'' で 16 CPU 使うのに対し、''ppn=4'' で 4 CPU に変更したりするとエラーで落ちるので注意)
 +  * ジョブにシグナルを送信\\ <code bash>$ qsig -s シグナル ジョブID</code>
 +    * STOP: ジョブのサスペンド(ジョブを終了することなく、CPU を空ける; ただし、torque としては CPU が空くわけではないので、次のジョブは実行されない)
 +    * CONT: サスペンドしたジョブの再開
 +
 +===== ジョブファイル =====
 +  * ジョブの内容を書いたシェルスクリプト
 +  * シバン行 (#!/bin/bash など) に続いて、''#PBS ...'' で始まるジョブ指定
 +  * 例 (bash ベースの場合): \\<code bash jobfile.sh>
 +#!/bin/bash
 +#PBS -V
 +#PBS -l nodes=1:ppn=4
 +#PBS -j oe
 +#PBS -N jobname
 +
 +cd ${PBS_O_WORKDIR}
 +
 +実行コマンド
 + :
 +</code>
 +  * ${PBS_O_WORKDIR}: torque が利用する作業ディレクトリ (必ず書く必要がある)
 +  * オプション (qsub のオプションと同じ)
 +
 +^  オプション  ^  意味  ^  値  ^
 +|-V|ジョブを投入した所の環境変数をすべて、ジョブファイルにも適用する| |
 +|-v|ジョブを投入した所の環境変数を指定した分だけ、ジョブファイルにも適用する| |
 +|-q|キューの指定| |
 +|-j|出力ファイルの制御|oe: 標準出力と標準エラーを標準ファイル(*.o__ジョブID__)にまとめる, eo: 標準出力と標準エラーを標準エラーファイル(*.e__ジョブID__)にまとめる, 指定しない場合は、それぞれのファイルが出力される|
 +|-o|標準出力ファイルのパス| |
 +|-e|標準エラーファイルのパス| |
 +|-m|メール送信の方法|次の文字の組み合わせでメールの送信タイミングを指定 a: ジョブが失敗, b: ジョブが開始, e: ジョブが終了, n: 何もしない|
 +|-M|メールの送信先| |
 +|-l|リソースの指定(複数ある場合は、カンマで区切る)|walltime=__24:00:00__ (CPU使用時間制限; CPU数は考慮しない時間)|
 +|:::|:::|nodes=__2__:ppn=__2__ (2CPUずつ2ノードを使う; 計4CPU)|
 +|:::|:::|nodes=__ノード1__:ppn=__3__+__ノード2__:ppn=__2__+__ノード3__:ppn=__1__ (特定のノードを利用する場合はノード名を書いて + で結合する)|
 +|:::|:::|mem, ncpu が使える|
 +|-N|ジョブ名|指定しない場合は、ジョブファイル名の先頭から15文字|
 +
 +  * 参考サイト: [[http://blog.goo.ne.jp/sdpaninf/e/a4dae2ad412788c5ef75094ae6110f40 | PBS 使用時に特定のノードを避ける方法 - 最適化問題に対する超高速&安定計算]]
 +
 +===== 導入方法 =====
 +==== apt-get による導入 ====
 +  * リポジトリにある torque を apt-get で導入する方法
 +  * 利点
 +    * 設定は面倒だが、インストールは楽。
 +    * 依存関係のパッケージも同時にインストールしてくれる
 +  * 短所
 +    * 特定のバージョンしか扱えない (Ubuntu 14.04 で 2.4.16)
 +      * 2016/07/19 現在、最新版は 6.0.1 であるため、相当古い。
 +      * GPU に対応しているのは、2.5.6, 3.0.2 移行のバージョンであるため、リポジトリにあるものでは GPU マシンへジョブを投入できない。(ノードリストに gpus が入っていると segfault する)
 +  - [[分子シミュレーション関連/環境構築/Torque (旧PBS)/apt-getによる導入|導入手順]]
 +  - [[分子シミュレーション関連/環境構築/Torque (旧PBS)/サーバの設定|サーバの設定]]
 +
 +==== コンパイルによる導入 ====
 +  * ソースからコンパイル、インストールする方法
 +  * 長所
 +    * 最新版や特定のバージョンが使える
 +    * 最新バージョンでは GPU マシンへのジョブ投入ができる
 +  * 短所
 +    * インストールが面倒
 +      * 依存関係などを調べる必要がある
 +    * 設定項目が環境に依存する
 +  - [[分子シミュレーション関連/環境構築/Torque (旧PBS)/コンパイルによる導入|導入手順]]
 +  - [[分子シミュレーション関連/環境構築/Torque (旧PBS)/サーバの設定|サーバの設定]]
 +
 +===== キューの設定項目 =====
 +
 +===== ノードの追加 =====
 +/var/spool/torque/server_priv/nodes を編集して、torque サーバプログラムを再起動させて適用する方法もあるが、qmgr でもノードを追加したり削除することができる(ただし、ジョブ実行中のノードでない場合のみ)
 +
 +<code bash>$ sudo qmgr
 +> create node ノード名
 +> set node ノード名 np = CPU数
 +> set node ノード名 properties = 名前
 +> quit</code>
 +  * GPU マシンの場合、さらに ''set node ノード名 gpus = GPU数'' を実行すると GPU の設定ができる (ただし、Torque 2.5.6, 3.0.2 以降に限る)
 +  * この後に、''qnodes -a'' を実行すると、ノードが追加されたことが分かる他、/var/spool/torque/server_priv/nodes を見ると、追記されている。
 +  * これを応用すると、実行中のキュー以外のキューをサーバプログラムを止めることなく、変更することができる。
 +
 +  * 参考サイト: [[http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/3-nodes/managingNodes.htm | Managing nodes]]
 +
 +===== その他 =====
 +  * 長時間ジョブを別々のキューで走らせた時に後方にある一方のキューが動かない
 +    * 例:
 +      - CPU が 2 つある計算機上で、CPU を 1 つのみ使い、1 つずつしか走らせることができないキュー A, B にジョブを 3 つずつ投入する予定である (計6ジョブ)
 +        * ジョブ A1, A2, A3 
 +        * ジョブ B1, B2, B3
 +        * それぞれのジョブは 25 時間以上かかるものとする
 +      - 先にキュー A に 3 ジョブ (A1, A2, A3) 投入する (CPU は 1 つしか使っていない状態)
 +      - 25時間後に、キュー B の 3 ジョブ (B1, B2, B3) を投入する (本来ならば、キュー B のジョブの処理がすぐに開始されるはず…)
 +      - なぜか、キュー B のジョブが開始しない
 +    * 原因: starving job 機構
 +      * ジョブスケジューラはジョブの処理数を上げるため、指定された walltime が短いジョブから順に処理していく。
 +      * しかし、これだと walltime が長いジョブは、短いジョブが後から次々と投入されると、一向に処理されない状態になる
 +      * これを解決するために、starving job 機構があり、待機状態にあるジョブ (walltime が長いジョブ) が一定時間超えると、そのジョブを優先的に処理しようとする。
 +      * torque の starving job 機構のデフォルトの設定時間は 24 時間
 +      * 例で示した場合、A1 の処理中に 24 時間が経過し、A2, A3 が優先的に処理されるように設定されるが、キュー A はそもそも同時に 1 つしか処理できないため、CPU が 1 つ空いたまま、B1, B2, B3 は待機状態となる。
 +      * キューに使用 CPU や同時ジョブ処理数の制限がかかっていると、例のような問題が起こる
 +    * 解決方法 (/var/spool/torque/sched_priv/sched_config の編集)
 +      * starving job 機構の無効化
 +        * ''help_starving_jobs  true  ALL'' の true を false に変える
 +      * 機構が有効になるまでの時間の変更
 +        * ''max_starve: 24:00:00'' の時間を長くする
 +    * job starving 機構の問題の見分け方
 +      * ''$ qstat -f'' でジョブ状態を表示し、その中に ''comment = Not Running: Draining system to allow starving job to run'' とあれば、この問題でジョブが処理されないことになる。
 +
 +===== 参考サイト =====
 +  * [[http://www.nas.nasa.gov/hecc/support/kb/commonly-used-qsub-options-in-pbs-scripts-or-in-the-qsub-command-line_175.html | Commonly Used QSUB Options in PBS Scripts or in the QSUB Command Line - HECC Knowledge Base]] ジョブファイルオプション
 +  * 特定のノードにのみジョブを流す [[http://docs.adaptivecomputing.com/torque/4-1-3/Content/topics/3-nodes/nodeProperties.htm | Node properties]]
 +
 +{{tag>Linux サーバ 分子シミュレーション}}
  • 分子シミュレーション関連/環境構築/torque_旧pbs.1480043805.txt.gz
  • 最終更新: 2016/11/25 12:16
  • by mumeiyamibito