OCI - HPC Cluster: ユーザーが投入できるジョブ数を制限する

:::note info
本ページは [OCI: HPC Cluster](https://qiita.com/itokazu/items/63d2e3cebdcdda5afce0) のサブページになります。
:::

# 実現したいこと
HPC ClusterのAutoscaling環境にてユーザーが投入できるジョブ数の制限設定を実現例について解説します。

**例: 以下のパーティションに対して以下のユーザーが投入できるジョブ数を4ジョブまでに制限したい。ジョブの同時実行数は2ジョブとしたい。**
- パーティション: partition-a
- ユーザー: user-a, user-b

設定内容を図解すると以下のようになります。
- ユーザーが投入できるジョブ数についてはSLURMのQoSで実現します
- ジョブの同時実行数についてはAutoscalingを構成している関係上、Autoscaling側で該当のパーティションで作成できるクラスタ数を制限して実現します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/0839a76c-065f-ee3f-f10f-60051ff1fc78.png)


# 前提となる設定状況
### LDAPユーザー
以下のLDAPユーザーに対してジョブの制限を設定します。
```
$ cluster user list
DN: cn=user-a,ou=People,dc=local - STATUS: Read - READ TIME: 2024-04-12T09:00:16.174386
    cn: user-a
    displayName: User A
    gecos: User A
    gidNumber: 10006
    homeDirectory: /home/user-a
    loginShell: /bin/bash
    sn: user-a
    uid: user-a
    uidNumber: 10001

DN: cn=user-b,ou=People,dc=local - STATUS: Read - READ TIME: 2024-04-12T09:00:16.174560
    cn: user-b
    displayName: User B
    gecos: User B
    gidNumber: 10006
    homeDirectory: /home/user-b
    loginShell: /bin/bash
    sn: user-b
    uid: user-b
    uidNumber: 10006
```

### Autoscaling設定

```
    - name: partition-a
      default: false
      instance_types:
        - name: bm-cluster
          default: true
          shape: BM.Optimized3.36
          instance_keyword: optimized3
          permanent: false
          cluster_network: false
          compute_cluster: false
          max_number_nodes: 16
          max_cluster_size: 8
          max_cluster_count: 2
          region: ap-tokyo-1
          ad: xxxx:AP-TOKYO-1-AD-1
          private_subnet: 172.16.4.0/22
          private_subnet_id: ocid1.subnet...
          image: ocid1.image.oc1..
          targetCompartment: ocid1.compartment.oc1...
          boot_volume_size: 100
          use_marketplace_image: true
          use_compute_agent: true
          instance_pool_ocpus: 1
          instance_pool_memory: 8
          instance_pool_custom_memory: true
          marketplace_listing: HPC_OL8
          hyperthreading: true
```

# 設定手順

## SLURMのアカウントを作成する
このアカウントというのはSLURMにおけるグループのような概念です。
ここでは`abc-group`という名前のアカウントを作成します。

```
$ sudo sacctmgr add account abc-group
 Adding Account(s)
  abc-group
 Settings
  Description     = Account Name
SlurmctldHost=eval-slurm-controller
  Organization    = Parent/Account Name
 Associations
  A = abc-group  C = cluster
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
```

アカウントが作成されたことを確認します。
```
[opc@eval-slurm-controller ~]$ sacctmgr list account
   Account                Descr                  Org
---------- -------------------- --------------------
 abc-group            abc-group            abc-group
      root default root account                 root
```

## アカウントにLDAPユーザーを割り当てる

LDAPユーザーである`user-a`と`user-b`を`abc-group`に割り当てます。
```
$ sudo sacctmgr add user user-a account=abc-group
 Adding User(s)
  user-a
 Associations =
  U = user-a    A = abc-group  C = cluster
 Non Default Settings
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y

$ sudo sacctmgr add user user-b account=abc-group
 Adding User(s)
  user-b
 Associations =
  U = user-b    A = abc-group  C = cluster
 Non Default Settings
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
```

## QoSの設定を有効にする

任意のエディタで管理者権限で`slurm.conf`を開いて変種します。
```
sudo vi /etc/slum/slurm.conf
```
　
以下の記述を追加します。
```
AccountingStorageEnforce=limits
```

## QoSを作成する

ここでは`submit-qos`という名前のQoSの定義を作成します。
```
$ sudo sacctmgr add qos submit-qos
 Adding QOS(s)
  submit-qos
 Settings
  Description    = submit-qos
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
```


## QoSの定義にMaxSubmitJobsPerAccountを設定する
作成したQoSに対して、`MaxSubmitJobsPerAccount`パラメーターに`=4`の設定を追加します。
これにより、「ユーザーが投入できるジョブ数を4ジョブまでに制限」が実現されます。

:::note info
MaxSubmitJobsPerAccount:
The maximum number of jobs an account (or sub-account) can have running and pending at a given time.
:::

```
$ sudo sacctmgr modify qos submit-qos set MaxSubmitJobsPerAccount=4
 Modified qos...
  submit-qos
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
```
　
設定されたことを確認します。
```
$ sacctmgr show qos format="Name,MaxSubmitJobsPerAccount"
      Name MaxSubmitPA
---------- -----------
    normal
limited_j+
submit-qos          4
```

## QoSとパーティションを関連づける
設定したQoSとパーティションを紐づけます。

管理者権限でslurm.confを修正します。
```
sudo vi /etc/slurm/slurm.conf
```
　
対象のパーティションの行の文末に`QOS=submit-qos`を追加して保存します。
```
PartitionName=partition-a Nodes=<node>-[1-1024] Default=NO MaxTime=INFINITE State=UP QOS=submit-qos
```

## slurmctldをrestartする
slurm.confの変更を適用させるためにslurmctldをretartさせる。
```
sudo systemctl restart slurmctld
```

設定が反映されていることを確認します。
```
$ scontrol show partition partition-a | grep QoS
   AllocNodes=ALL Default=NO QoS=submit-qos
```

# 動作確認
動作確認として`user-a`や`user-b`で設定した制限以上のジョブを投入してみます。
上限に達すると以下のエラーにてジョブが投入できなくなることを確認します。
```
$ sbatch job.sh
sbatch: error: MaxSubmitJobsPerAccount
sbatch: error: Batch job submission failed: Job violates accounting/QOS policy (job submit limit, user's size and/or time limits)
```

# :warning: 注意点
本設定にあたりslurm.confを修正していますが、HPC-Clusterのqueues.confの変更を適用するslurm_config.shを実行すると記載した以下の内容が消えてしまうのでご注意ください。
- `AccountingStorageEnforce=limits`の記述
- Partition= で始まる行の文末に設定した`QOS=submit-qos`の記述

HPC-Clusterの仕様上の問題がありますので、本設定は以下のの流れで実施をするように注意してください。
1. queues.confの編集
1. slurm_config.shの実行
1. 本パーティション設定

# 参照資料
本手順の作成にあたり以下のURLを参考にさせていただきました。
- https://qiita.com/Masataka_N/items/90db5e7bf79e1650f25d