RSMAP未対応のGridengineでGPUの管理をさせる方法

GPU搭載サーバー (Ubuntu20.04) にGridengineを導入した際に、GPUの管理ができないかと調べていたところRSMAPに対応していないためかなり苦戦しました。
そこで本記事ではGridengineでGPUを管理できるようにした設定方法について記載していきます。

目次

前提

本記事ではクラスターサーバーではなくサーバー1台でマスターホストと実行ホストを担当する構成を前提とします。

Gridengineのインストール方法

Ubuntu20.04へのGridengineのインストール方法についてはK-labさんのこちらの記事「Gridengine の Ubuntu 18.04LTS へのインストール方法」で丁寧に解説されてますので、参考にしてインストール作業をしてください。
慣れないうちはqconfコマンドが何をしてるかわからず不安になるかと思いますが、ヘルプを開いてそれぞれのオプションの意味を調べながら実行していくと命名規則の雰囲気もわかり慣れていくと思います。

GridengineのGPU管理設定

GPUの管理方法に関してはこちらのGitHubレポジトリ「kyamagu/sge-gpuprolog」を参考にさせていただきました。
実際にどのようにGPUを管理しているのかというと「Jobを投入すると空いているGPUを探してロックファイルを作成し、Jobが終了したらそのロックファイルを削除する」ということをしています。
Gridengineにはジョブの実行前後に実行したい処理がある場合にプロローグ・エピローグスクリプトを設定することができるので、この機能を利用して上記の設定をしていきます。
これ以降は基本的にGitHubレポジトリのREADMEを参考に実際どうやったかを解説していきます。

GPUをconsumable complexとして設定

qconf -mc

と実行し、以下の行を追加してください。

1
2
3
#name               shortcut   type        relop   requestable consumable default  urgency
#----------------------------------------------------------------------------------------------
gpu gpu INT <= YES JOB 0 0

その後、実行ホストにgpuのcomplexを追加します。

qconf -aattr exechost complex_values gpu=1 node01

ここで、gpu=1のところはサーバーに積んでいるGPUの数、node01 は自身で設定してる実行ノードの名前に置き換えてください。

プロローグ・エピローグスクリプトの設定

まずGitHubレポジトリをクローンしてサーバーのユーザー全員が利用可能な場所(例:/usr/local, /opt)に配置します。
今回は/opt以下に配置することにした場合を例に進めます。

git clone git@github.com:kyamagu/sge-gpuprolog.git
chmod 755 sge-gpuprolog
sudo mv sge-gpuprolog /opt
cd /opt
sudo chown -R root:root sge-gpuprolog/

フォルダの中に prolog.shepilog.sh というファイルがありますが、それのシバンを /bin/bash に変更してください。

次にGPU用のキューを gpu.q という名前で新しく作成します。
まずは以下のコマンドを実行してください。

qconf -aq gpu.q

そしてprolog, epilogとshell_start_modeの行を以下のように修正してください。

1
2
3
shell_start_mode      unix_behavior
prolog sgeadmin@/opt/sge-gpuprolog/prolog.sh
epilog sgeadmin@/opt/sge-gpuprolog/epilog.sh

ファイルのパスの前に sgeadmin とありますが、これは各スクリプトをどのユーザーとして実行するかを指定してることになります。
なので上記のように記載するとsgeadminユーザーとして各スクリプトを実行してくださいと指定していることになります。
この指定を忘れるとエラーが出ますので注意してください。

また、slotsはGPUの枚数に合わせて修正してください。
デフォルトでは1となっています。

最後に作成したGPU用のキューをホストグループに追加します。
インストール方法の記事を参考にしていた場合は @allhosts という名前にしているはずですので、以下のように実行します。

qconf -aattr queue hostlist @allhosts gpu.q

以上で設定は完了です。

ジョブスクリプトの例

gpuというリソース名で設定したので、以下のように指定すればGPUを指定した分利用できます。

1
2
3
4
5
6
7
8
9
#!/bin/bash
#$ -q gpu.q
#$ -l gpu=1
#$ -cwd
#$ -j y

echo $CUDA_VISIBLE_DEVICES

sleep 30

今回の実装ですと $CUDA_VISIBLE_DEVICES にすでに値が入った状態でジョブが流れますので、別途値を代入する必要はありません。

おわりに

Gridengineは便利なのでよく使っていたのですが、aptで入るものはRSMAPに対応しておらずGPUの管理がうまくできずもやもやしながら利用していました。
Gridengineは調べても情報があまりなく、今回の方法にたどり着くのとそれを理解するのにかなり時間を浪費しました。
この記事が他の方の時間の節約になれば嬉しいです。

それでは。

参照

RSMAP未対応のGridengineでGPUの管理をさせる方法

https://sishida21.github.io/2022/12/17/manage-gpu-in-sge-on-ubuntu2004/

Author

Shoichi Ishida

Posted on

2022-12-17

Updated on

2022-12-22

Licensed under