view software/Torque.md @ 119:254063df7e73

backup 2023-05-02
author autobackup
date Tue, 02 May 2023 00:10:03 +0900
parents b6c284fd5ae4
children
line wrap: on
line source

# Torque
## Torqueとは
Torqueは、Job Schedulerである。Job Schedulerは、クラスターに次々と投入されるジョブを、キューなどを用い、スケジューリングを行って管理してくれる。  
クラスターを利用して、実験を行う際には、Job Schedulerを用いる必要がある。  
それは、他のクラスターユーザーが存在する場合に、同時に別スレッドで処理を実行してしまうならば、CPUなどのリソースを取り合うことになるため、台数効果などの実験結果が正確に得られないからである。  

まず、[Torqueのインストール](./Torque/install)をする。
それでは、Torqueの使い方を見てみよう。  

## Torqueがインストールされたserverにログインする

```
ssh ie-user@tino-vm1.ads.ie.u-ryukyu.ac.jp 
```

このvmはシス管か, 誰かに頼んで上げてもらう(自分のときは名嘉村研の先輩に頼みました

## queueの作成(サーバー側)
テストとして"tqueue"という名前のqueueを作る。
```
 Qmgr: create queue tqueue queue_type = execution
 Qmgr: set queue tqueue enabled = true
 Qmgr: set queue tqueue started = true
 Qmgr: set server default_queue = tqueue
 Qmgr: set server scheduling = true
 Qmgr: set queue tqueue resources_max.ncpus = 2
 Qmgr: set queue tqueue resources_max.nodes = 2
```
各コマンドの意味を以下に示す。
- `create queue <queue名> queue_type = <queueのタイプ>`
  - 指定された名前、タイプのqueueを作成する。
  - タイプはE,executionを指定するとexecution queueになりR,routeを指定するとrouting queueとなる。
- `set queue <queue名> <Attributes>`
  - 指定したqueueの指定したAttributesを設定する。
例で設定したAttributesについて
- `enabled = <true or false>`
  - trueにすると新しいjobを受け付ける。
- `started = <true or false>`
  - trueにするとqueueの中のjobの実行を許可する。
- `resources_max.ncpus = <cpu数>`
  - queueに割り当てるcpu数を設定する。
- `resources_max.nodes = <node数>`
  - queueに割り当てるnode数を設定する。
- `set server <Attributes>`
  - 指定したqueueの指定したAttributesを設定する。
例で設定したAttributesについて
-  `default_queue = <queue名>`
  - 指定したqueueをデフォルトqueueとする。
- `scheduling = <true or false>`
  - Schedulingを可能にする。
    
ここまでの設定の確認を行う。
    
```
 Qmgr: print server
```
これでサーバーの設定が確認できる。作成したqueueが表示されればうまくいっている。また、以下のコマンドqueueの確認ができる。
    
```
 Qmgr: list queue <queue名>
```
    
### 設定の保存
以下のようにリダイレクトして保存する。
    
`#echo "p s" | <torqueのインストール先>/bin/qmgr > <ファイル名>`
    
次回以降はこのファイルを与えることで設定が楽になる。

ファイルの与え方もリダイレクト

` # <torqueのインストール先>/bin/qmgr < <ファイル名>`

# Torque チュートリアル


## Torqueを使用する前に
Torqueは、naha.ie.u-ryukyu.ac.jp上で使用することができる。  
実験を行うためには、パスワードを使用せずにsshできるように、鍵認証の設定を行わなくてはならない。しかし、mauiユーザーでは既に設定が行われているため、Torqueをすぐに使用することができるようになっている。

```
 % ssh ie-user@tino-vm1.ads.ie.u-ryukyu.ac.jp
```

尚、パスワードはサーバー班が管理しているので、サーバー班から教えてもらうことができる。

ログインすると、ホームディレクトリにProjectフォルダがあるので、その中に自分の学籍番号のフォルダを作成し、その中で作業を行うようにする。

```
 % mkdir student/eXX57XX
 % cd student/eXX57XX
```

追記
ただし, Projectフォルダは分散環境上で共有されていないため, ファイルを共有したい場合は /mnt/data/* の中にworkspaceを作り, その中で作業を行うのが望ましい.


## Torque上でジョブを実行する
### ジョブを実行するための準備
jobs.shを作成する。

```
- jobs.sh
 #!/bin/sh
 echo hello
 hostname
```

### ジョブの実行
Torqueのジョブは、qsubコマンドによって投入される。

 `% qsub jobs.sh`
 
このように実行すると、1台のクラスターでのみ処理が行なわれる。

### ジョブの実行結果
スクリプトの実行が終わると、jobs.sh.oXXX, jobs.sh.eXXXという2つのファイルが生成される。XXXは、Torqueによって割り振られたジョブ番号である。
ファイルにはそれぞれ、標準出力と、標準エラー出力の内容が出力されている。

```
 % cat jobs.sh.oXXX
 hello
 cls001.cs.ie.u-ryukyu.ac.jp
```

### 複数のノードを用いた実験
また10台で実験を行うには次のように、実行すれば良い。

```
 % qsub -l nodes=10 jobs.sh
 % cat jobs.sh.oXXX
 hello
 cls010.cs.ie.u-ryukyu.ac.jp
```

10台のノードを指定しても、実際には10台が使用可能になっただけであり、10台で実行された訳ではない。  
このcls010.csは、親ノードである。この親ノード(cls010.cs)から、他のノード(cls001-cls009)に対して、命令を行うようにプログラミングする必要がある。

例えば、以下のような処理を行う必要がある。

```
- jobs.sh
 #!/bin/sh
 #PBS -N ExampleJob
 #PBS -l nodes=10,walltime=00:01:00
 for serv in `cat $PBS_NODEFILE`
 do
   ssh $serv hostname &
 done
 wait
```

#PBSを用いてコメントをつけると、その部分が、qsubコマンドのオプションとして認識される。
- -N: ExampleJob.oXXXのように、ジョブに名前を付けることができるようになる。
- -l: ジョブのオプション。nodes=ノード数、walltime=処理制限時間のように設定できる。

親ノードのシェルには、$PBS_NODEFILEという、環境変数が準備されている。

```
- (例)
 % echo $PBS_NODEFILE
 /var/spool/torque/aux/XXX.naha.ie.u-ryukyu.ac.jp
 % cat $PBS_NODEFILE
 cls010.cs.ie.u-ryukyu.ac.jp
 cls009.cs.ie.u-ryukyu.ac.jp
 ...(略)...
 cls001.cs.ie.u-ryukyu.ac.jp
```

$PBS_NODEFILEの先頭行のホストが親ノードである。

このスクリプトを実行してみると、以下のようになった。

```
 % qsub jobs.sh
 % cat ExampleJob.oXXX
 cls003.cs.ie.u-ryukyu.ac.jp
 cls009.cs.ie.u-ryukyu.ac.jp
 cls008.cs.ie.u-ryukyu.ac.jp
 cls010.cs.ie.u-ryukyu.ac.jp
 cls007.cs.ie.u-ryukyu.ac.jp
 cls006.cs.ie.u-ryukyu.ac.jp
 cls004.cs.ie.u-ryukyu.ac.jp
 cls005.cs.ie.u-ryukyu.ac.jp
 cls002.cs.ie.u-ryukyu.ac.jp
 cls001.cs.ie.u-ryukyu.ac.jp
```

このように、10台のノードで、hostnameコマンドを実行した結果が表示されていることが分かる。
これらの他に、mpiを用いて、他のノードにジョブを割り振ることもできる。

## 1ノード2CPUを用いた実験方法
クラスターはCoreDuoを搭載しているため、CPUを2つまで使用することができる。つまり、1ノードで、2つの処理を行なうことができる。  
その場合は、以下のように実行する。
```
 % qsub -l nodes=10:ppn=2 jobs.sh
```
この場合、$PBS_NODEFILEには、同じホストが2つずつ登録されていることになる。

## 1ジョブでマルチタスクの実行
また、1つのジョブで、複数の同じタスクを実行することもできる。
その場合は、以下のように実行する。
```
 % qsub -t 1-3 -l nodes=10 jobs.sh
```
この場合、出力結果も3つのタスクごとに出力される。


## その他、便利なコマンド
```
- jobs.sh
 #!/bin/sh
 #PBS -N ExampleJob
 #PBS -l nodes=1,walltime=00:01:00
 sleep 10
 echo hello
```

```
 % qsub jobs.sh
```
sleepを行って、ジョブを長引かせてテストする。
```
 % qstat
 Job id                    Name             User            Time Use S Queue
___
 XXX.naha                  ExampleJob       maui                   0 R batch
```

このように、ジョブの状態を確認することができる。

## Error 対処メモ
Nodeの数を4  9台に設定するとなぜかjobがうまく動かない。以下のようなエラーがでる。
```
 qsub: Job exceeds queue resource limits MSG=cannot satisfy queue max nodes requirement  
```

対処法はNodeの数の設定時に、一桁だった場合は 05 といったように0をつけることで解決する。
```
 % qsub -l nodes=05 test.sh
```

全体で登録しているNodeの数が二桁になるとこうする必要がある。
また、Nodeの数を間違っていなくても、上のエラーがでるときがある。その時は今使っているqueueの設定をみる。
```
 % qmgr -c "p s"
 :
 create queue cqueue
 set queue cqueue queue_type = Execution
 set queue cqueue resources_max.ncpus = 184
 set queue cqueue resources_max.nodes = 46
 set queue cqueue enabled = True
 set queue cqueue started = True
```

ncpus の値やnodesの値を確認する。resource_max.nodes でなく、 resource_max.nodect も設定したほうがいいかもしれない。
```
 % sudo qmgr
 set queue cqueue resources_max.nodect = 46
```


## crとcsの両方のtorqueクラスタを1つで使う
crで作成したtorqueのクラスタをcsの方でまとめて使うための方法。

以下の2つの設定変更により行える
- クライアント側のserver_nameファイルとconfigファイルをmass00.cs(親)の設定に変更する。
- 親のtorqueのnodesの設定にcrのクラスタの情報を付け加える。

上記の変更をpbsをstopさせて変更を行う。
```
 % sudo /etc/init.d/torque stop
```
### クライアント側のserver_nameファイルとconfigファイルをmass00.cs(親)の設定に変更する
変更するファイルは以下の2つ
```
 /var/spool/torque/server_name
 /var/spool/torque/mom_priv/config
```
それぞれの中身をみてみる
```
 mass01(cr) % cat /var/spool/torque/server_name 
 mass00.cr.ie.u-ryukyu.ac.jp
 mass01(cr) % cat /var/spool/torque/mom_priv/config
 $logevent 0x1fff
 $max_load 1.2
 $ideal_load 1.0
 $pbsserver mass00.cr.ie.u-ryukyu.ac.jp
 $restricted mass00.cr.ie.u-ryukyu.ac.jp%
```
上記のmass00.crをmass.csに変更すればよい

###親のtorqueのnodesの設定にcrのクラスタの情報を付け加える
変更するファイルは以下のもの
 /var/spool/torque/server_priv/nodes

中にはクライアントとなるサーバのドメインと使用するcpuの数の記述がある。
```
 % sudo cat /var/spool/torque/server_priv/nodes 
 mass02.cs.ie.u-ryukyu.ac.jp np=4
 mass03.cs.ie.u-ryukyu.ac.jp np=4
 mass04.cs.ie.u-ryukyu.ac.jp np=4
 :略
 mass46.cs.ie.u-ryukyu.ac.jp np=4
 mass47.cs.ie.u-ryukyu.ac.jp np=4
```

これにmass01.cr.ie.u-ryukyu.ac.jp といったcr側のクライアントの情報を追加してあげればよい。

設定が終わったら
```
 % sudo /etc/init.d/torque start
```
をして起動させる。
クライアント全部を手作業でやるのは面倒臭いのでcapistrano を使ってください。

## workspaceの作り方
### 力技(rootのゴリ押し)

例えばie-user@tino-vm1.ads.ie.u-ryukyu.ac.jp で
```
 mkdir /mnt/data/fuga
```

と作成しようとしてもPermmision Errorになる. また, rootで作成しても
```
 sudo mkdir /mnt/data/fuga
 ls -l /mnt/data 
 合計 48
 ...
 drwxr-xr-x  2 ie-user   ie-user    4096  8月  9  2016 examples
 drwxr-xr-x  2 nfsnobody nfsnobody     6  1月 24 06:08 fuga
 ...
```

となり, usernameとgroupが違うため, 他のvmがfugaにアクセスできない. (そもそも, このvmでもsudoがないとファイルが書き込めないはず.

このファイルを管理しているのはtino-vm2の方なので, そこにアクセスしてファイル権限を書き換える
```
 ssh tino-vm2.ads.ie.u-ryukyu.ac.jp
 # /exports/data がmountされていたため, この中のfugaを変える
 sudo chown -R ie-user:ie-user /exports/data/fuga
 exit
```

その後ファイルを見てみると書き換わっている
```
 ls -l /mnt/data 
 合計 48
 ...
 drwxr-xr-x  2 ie-user   ie-user    4096  8月  9  2016 examples
 drwxr-xr-x  2 ie-user   ie-user     6  1月 24 06:08 fuga
 ...
```

ただゴリ押しなので他の方法もあるかも. (というか普通は管理者に言うべきなんだろうなぁ....

## Christie用メモ
@tinovm1:/mnt/data/christie-workspace/の中で作業を行う。
christieを更新した際はjarファイルを置き換えること。(Jenkinsで自動化できるらしい。)



## 参考文献
http://docs.adaptivecomputing.com/torque/6-1-2/adminGuide/torque.htm#topics/torque/0-intro/introduction.htm%3FTocPath%3DChapter%25201%253A%2520Introduction%7C_____0