Kekeの日記

エンジニア、読書なんでも

スーパーコンピュータのPortable Batch System(PBS)の使い方

https://c01.newswitch.jp/cover?url=http%3A%2F%2Fnewswitch.jp%2Fimg%2Fupload%2Fphpzj7PiL_566eaa9f80039.jpg

はじめに

はじめにいくつかの概念や用語について説明します。

スーパーコンピュータとは

スーパーコンピュータは厳密の定義は存在しません。

しかし、抽象的な概念として「大規模な計算機」と私たちは認識しているかと思いますが、そのようなものです。

また、スーパーコンピュータはメモリの構造によって二つに大きく分けることができます。

  • 共有メモリ型
  • 分散メモリ型

共有メモリ型はすべてのノードと呼ばれる計算実行機単位でメモリは共有メモリされていますが、分散メモリ型はMPIをはじめとするメッセージパッシング方式によってメモリを局所的にもっています。

また、局所的にもっているものの、たくさんのプロセスやスレッドを抱えるケースが多いので、計算機クラスタでは一般的に分散メモリですが、ノード単位でみると共有メモリ型ということができます。 

プロセス、スレッドについて

プロセスとスレッドの違いというものはメモリを意識するかしないかにあり、CPU(コア)とは直接的には関係ありません。プロセス、スレッドはソフトウェアで、CPUはハードウェアなのですから。

プログラムの実行単位でメモリを確保されるものをプロセスと呼びます。

Terminalで打つすべてのものも一つ一つがプロセスです。

プロセスは以下のように確認します。

ps -x

=> 
...
PID TTY           TIME CMD
48306 ttys000    0:00.00 ps -a
20760 ttys001    0:00.29 /usr/local/bin/fish -l
...

ここで主なオプションは以下の通りです。

option なにをする
-A すべてのプロセスを表示
-c コマンド名を表示
-x 実行中のプロセスを表示

またプロセスに対して、スレッドというCPUの割り当て実行単位があり、プロセスは一つ以上のスレッドを保有しています。

Job Manegement System(JMS)

スーパーコンピュータなどの大規模計算機クラスタは、複数のユーザーが使用するのでジョブをうまく正しいノード(計算機サーバーの単位)でスケジュールしなければならず、それを自動的に行うシステムのことをジョブ管理システム(Job Manegement System: JMS)です。

Portable Batch System(PBS)

NASA向けに開発されたフリーのJMSでありUNIX環境で動作します。

PBSは4つの主要なコンポーネントで構成されています。

  • コマンド
    • ユーザーコマンド: qsub, qstatなど
    • オペレーターコマンド: qenable, qrunなど
    • アドミニストレータコマンド: qmgr
  • Jobサーバー: バッジジョブの作成、受理や、実際にバッジジョブを実行する。一つのJobサーバにつき、一つ以上のキューを管理している。
    • キューの種類
      • Job Executor: 実際にジョブを実行するデーモン。
      • Job Scheduler: どのジョブを、どこで実行させるかを管理するデーモン。

バージョン

現在、使用できるバージョンは以下の通りである。

  • OpenPBS: 元祖PBS
  • TORQUE: OpenPBSのフォークしたもので、Adaptive Computing Enterpriseによって管理されている
  • PBS Professional: Altair Engineeringによって提供されているPBSでオープンソースと商用利用のデゥアルライセンスである。

実行ファイル

実行ファイルは多くはシェルスクリプト(bashやzsh)で書かれます。

また、大規模な計算機クラスタではユーザーが対話式にリソースを使うことはなく、キューイングによって大規模なプログラムを実行します。

この手順を「バッジ処理」といって、タスクそのものを「バッジジョブ」といいます。 この時に、タスクが記述されたファイルを「バッジスクリプト」と呼びます。

シェルスクリプトとは

バッジスクリプトと、ほぼ同じといってもいいくらいなので最初に一般的なシェルスクリプトを軽く説明します。

シェルスクリプトとは、オペレーティングシステムのシェル向けに書かれたスクリプトのことです。

基礎としては以下のことをまず覚えれば大丈夫です。

  • シェバング#!: インタプリタを指定します
  • オプション#$: 実行時のオプションを指定する

ファイル例

例えばperlのスクリプトをスーパーコンピューターなどの計算機クラスタで実行したければ以下のように、シェルスクリプト内で実行するのが一般的です。

以下のような実行ファイルhogehoges.shがあったとします。

#!/bin/bash

perl hogehoge.pl

バッジスクリプトとは

バッジスクリプトとは、バッジジョブを記述したものです。

基本的には、先ほどのシェルスクリプトと全く同じです。

ファイル例

例えば以下のようなものが、バッジファイルです。

#!/bin/sh
#PBS -l nodes=3:ppn=24

cd $PBS_O_WORKDIR

mpiexec -iface ib0 -launcher rsh -machinefile hoge -ppn 24 hogehoge.sh

書き方としてはシェルスクリプトと全く変わりません。

コマンド

pbsnodes: クラスタ全体の全ノードの状態を表示する

以下のようにすると、全ノードの空き状況がわかります。

pbsnodes

qsub: バッジジョブをサブミットする

先ほどのようなファイルをキューイングシステムにサブミットするには以下のようにする必要があります。

qsub hogehoge.pl

また、オプションは以下の通りです。

オプション 何をする 使用例
-C ジョブへコメントをつける -C "This is a comment"
-l 使用するリソースを指定する -l nodes=1:ppn=16
-M メール通知のメールアドレスを指定する -M hogehoge@gmail.com
-m メール通知の設定をする(a:中止時、b:ジョブ開始時、e:ジョブ終了時、n:通知しない) -m e
-q キューイングするキュー名を指定 -q todays-queue

計算リソースの指定方法

-lで計算リソースを指定したと思います。

実際に何を指定するかを言うと以下の表が主な指定項目です。

項目 何か 必須
nodes ノード数の指定
ppn ノード内のコア数
ncpus 使用したい全ノードのコア数の指定。
:[ノード名] 使用したいノードを指定。

qstat: ジョブ状況の確認

qstatコマンドを実行すると、実行中や実行待ちのジョブ状態を表示します。

また、オプションは以下の通りです。

オプション 何をする
-a システムのすべてのジョブを表示する
-r システムの実行中のジョブを表示する

qlogf: バッジジョブの結果確認

[ジョブスクリプト].o[ジョブID]のフォーマットで結果(標準出力)が表示されます。

Message Passing Interface(MPI)

これは、並列コンピューティングを行うための標準化された規格です。

しかしながら、プログラマに大きな負担がかかるというデメリットもあります。

mpirun

mpirunは初期のMPI標準(MPI-1)を使われている。

mpiexec

mpiexecとは、MPI-2といせ定められているmpirunの進化版である。

mpirunでコマンドラインうオプションが多種多様になっていたのを、最大公約数のように一つに共通オプションをまとめたものとなっています。

並列処理と並行処理の違い

並列処理は完全にCPUがそれぞれスレッドをもって実行するのに対して、並行処理はCPUより数の多いスレッドを、あたかも並行して同時にこなしているようにOSがスケジュールするような処理なので、これらは留意するべきです。

つまり、どのように処理をしているかという「実行状態」が異なるということができます。

まず、プロセッサ(命令を実行するもの)の基本というものはランダムアクセスマシン(RAM)です。

一方で、並列アルコリズムの設計には並列ランダムアクセスマシン(PRAM)を使用します。

CPU間でメモリを共有して、スレッドは複数のCPU上で実行されるもので、これが逐次処理だのRAMとは異なります。

性能評価指標

1. 台数効果

もっとも性能評価として使われるものです。

台数を増やすと、どのように処理時間が変わるかです。

仮に、台数倍以上に処理が早くなったときは、スーパーリニア・スピードアップといいます。

この時は、並列化によってキャッシュヒット率が上がっていることが、一番有力な考えですが、要因は他にもたくさん考えられるので注意してください。

1.1 強スケーリングと弱スケーリング

強スケーリングとは、台数効果を見る方法で、全体の処理のサイズを固定し、並列数を増やして台数効果を見る方法です。。並列数を増やすと1プロセスあたりの問題サイズが減っていくので、並列数が増加した時に演算時間より通信時間が占める割合が高くなっていきます。そのため、通信性能やアルゴリズムの評価をする時に使われることが多い。

弱スケーリングとは、1プロセスあたりのサイズを固定して、並列数を増加し、台数効果を見る方法です。並列数が増加しても1プロセスの問題サイズは固定なので、通信時間の割合が減っていくことが期待されます。これは理想的な台数効果がみこめるときに、プログラムや通信ネットワークが正しく動作しているかを見極めたい時に使うことが多い。

2. 並列化効率

何もかも並列化ができれば台数効果は増やした台数になるでしょう。

しかし、実際には並列化ができないアルゴリズムもあるので、並列化効率はいったいプログラムのどれくらいが並列化によって高速化できているのかの割合を示します。

参考文献

http://isotope.iis.u-tokyo.ac.jp/~kei/?plugin=attach&refer=IT%20memo%2Flinuxmemo4&openfile=103-Torque%E5%8F%96%E6%89%B1%E8%AA%AC%E6%98%8E.pdf

バッチ処理(PBS)について