Nabe International | Takeru Boost >> Takeruを回せ! >>

Univa Grid Engine : GPGPUのリソース管理(RSMAP)

GPGPUのリソース管理について

CPUの場合、どのコアが使われるのかのスケジューリングはkernelによって行われるため
ジョブスケジューラーは使用コア数・空きコア数などの数を管理するだけでリソースが適切に配分されますが
GPGPUの場合は、ジョブやジョブスケジューラー側でその配分を行う必要があります。
そうしないと複数のジョブが重複して同じGPUで実行されてしまうケースを回避できません。

Univa Grid EngineのRSMAPというリソースタイプを使うと、各ホストのGPGPUの数(搭載GPU数と使用中のGPU数)の管理だけでなく、
各GPGPUに付けられたIDも含めた数の管理が可能となるため、各GPGPUに適切にジョブを振り分けることができます。

demo script

  • 1ジョブあたりGPUを1つ使用するジョブです。"-l gpu=1"
  • マシンには2枚のGPGPUが搭載されています。
  • IDは、SGE_HGR_[リソース名]の変数として出力されますので、アプリケーション側が要求するデバイス指定の書式に合わせる必要があります。
#!/bin/sh
#$ -N TEST_GPU
#$ -l gpu=1

if [ ${SGE_HGR_gpu} = "0" ]; then
GPU="--gpu 0"
fi

if [ ${SGE_HGR_gpu} = "1" ]; then
GPU="--gpu 1"
fi

time python chainer-2.0.2/examples/mnist/train_mnist.py ${GPU} -o out/out_`date +%y%m%d-%H%M%S-%N`

RSMAPが無い場合の挙動

  • ジョブ投入後の状態は下記のようになっています。
  • 下記例では、数の管理はできているため3つ目以降のジョブは待ち状態(qw)となっていますが nvidia-smiで確認するとジョブは2つともID:1のGPUに投入されてID:0のGPUが使われていない状態です。
$ qstat
job-ID prior name user state submit/start at queue jclass slots ja-task-ID
------------------------------------------------------------------------------------------------------------------------------------------------
5123 0.50617 TEST_GPU beowulf r 08/02/2017 22:37:06 node.q@demo01 1
5124 0.50617 TEST_GPU beowulf r 08/02/2017 22:37:07 node.q@demo01 1
5125 0.50617 TEST_GPU beowulf qw 08/02/2017 22:37:33 1
5126 0.50617 TEST_GPU beowulf qw 08/02/2017 22:37:34

$ qstat -j 5123 | grep resource
hard resource_list: gpu=1

$ nvidia-smi pmon -o T
#Time gpu pid type sm mem enc dec command
#HH:MM:SS Idx # C/G % % % % name
22:37:45 0 - - - - - - -
22:37:45 1 40725 C 14 4 0 0 python
22:37:45 1 40736 C 58 18 0 0 python
22:37:46 0 - - - - - - -
22:37:46 1 40725 C 36 11 0 0 python
22:37:46 1 40736 C 36 11 0 0 python

RSMAPを用いた場合の挙動

  • 投入スクリプトは上と同じものを使用
  • qstat -j の出力に上の例では無かった"resource_map"行が表示されています。
    ホスト名(demo01)の後ろの(0)と(1) がGrid Engine側で認識しているGPUリソースのIDです。
  • 5159のジョブでID:0のGPGPUが使用されているため、5160ではID:1が使用されて重複なく振り分けられていることがわかります。
  • nvidia-smiの出力を見てもそれぞれのGPUにジョブが振り分けられていることがわかります。
$ qstat -j 5159 |grep resource
hard resource_list: gpu=1
resource map 1: gpu=demo01=(0)
$ qstat -j 5160 |grep resource
hard resource_list: gpu=1
resource map 1: gpu=demo01=(1)

$ nvidia-smi pmon -o T
#Time gpu pid type sm mem enc dec command
#HH:MM:SS Idx # C/G % % % % name
23:10:30 0 46000 C 58 20 0 0 python
23:10:30 1 46117 C 74 24 0 0 python
23:10:31 0 46000 C 77 28 0 0 python
23:10:31 1 46117 C 54 16 0 0 python
23:10:32 0 46000 C 55 19 0 0 python
23:10:32 1 46117 C 56 18 0 0 python

RSMAPその他の活用法

RSMAPはGPGPUやXeon Phiなどのコプロセッサ向けに開発されたものなのでそれらのデバイスを使う際には必要な機能となりますが、
RSMAP自体は、1台のホスト内に搭載されている複数のデバイスそれぞれにIDを付けてリソース管理が行えるというものなので
それ以外にも使いみちがありそうです。

例えば、Dual CPUのサーバーに2本のNVMe SSDが搭載されていて、それぞれがそれぞれのCPUのPCIeバス上にあるという構成の場合、
コアバインディングと組み合わせて近い方のBUSのNVMeをスクラッチ領域として使うことができ、アプリケーションによっては効果がありそうです。