• ライフサイエンス分野の研究をIT技術で支援します

    Microsoft AzureのMarketplaceでCentOS7のサーバーを借りてslurm(ジョブスケジューラー)とmpich(MPIの実装)とcuda(GPGPU用ツールキット)の設定方法について調査を行った。
    この設定がうまくいけば、myPrestoのpsygene-G(GPU+MPIを使った分子動力学プログラム)を、ジョブスケジューラーをから実行できる。

    実行環境: Microsoft Azure
    インスタンスの詳細
    地域: (アジア太平洋) 東日本
    イメージ: CentOS 7.6 (使用開始後に7.7にアップデートして使用)
    サイズ: NV6_Promo (6vcpu, 1GPU(Tesla M60),メモリ56GB)

    ここでは、1ノードのみのシステムでslurmを使用・設定する。

    CentOSのアップデート

    アップデート前のバージョン確認。

    uname -a
    Linux bmr191104 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
    
    cat /etc/redhat-release 
    CentOS Linux release 7.6.1810 (Core) 

    アップデート手順。

    sudo yum update
    sudo yum install epel-release
    sudo yum update
    sudo reboot

    アップデート後のバージョン確認。

    uname -a
    Linux bmr191104 3.10.0-1062.4.1.el7.x86_64 #1 SMP Fri Oct 18 17:15:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
    
    cat /etc/redhat-release
    CentOS Linux release 7.7.1908 (Core)

    認証サービスの設定

    sudo yum install munge munge-libs
    sudo -i
    /usr/sbin/create-munge-key
    systemctl enable munge
    systemctl enable munge
    exit

    cudaの設定

    最新版はver.10だが、今回は諸事情により9.2をインストールした。次のコマンドで使用するURLは事前に調べておく。
    https://developer.nvidia.com/cuda-toolkit
    にアクセスし、Dowload NOW, Legacy Releases, CUDA TOOLKIT ver. 9.2, LINUX, x86_64, CentOS 7, rpm(local)を選択していくと、以下のコマンドが表示される。

    sudo rpm -i http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-repo-rhel7-9.2.148-1.x86_64.rpm
    sudo yum clean all
    sudo yum install cuda-9-2

    (パッチがあるので、ここで当てるといいだろう。)

    GPUの動作状況の確認

    nvidia-smi
    NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

    この段階で、ドライバが正常に設定されていないので、ドライバを入れる必要がある。

    GPUドライバの設定

    次のURLのページで、GPUの型、OS、Cuda toolkit のバージョンにあったドライバのインストール用ファイルのURLを調べる。
    https://www.nvidia.co.jp/Download/index.aspx?lang=jp

    sudo yum install kernel-devel
    curl -OL http://jp.download.nvidia.com/tesla/396.82/NVIDIA-Linux-x86_64-396.82.run

    ここでは、上で調べたドライバーのインストール用ファイル(ここでは、NVIDIA-Linux-x86_64-396.82.run)のURL( http://jp.download.nvidia.com/tesla/396.82/NVIDIA-Linux-x86_64-396.82.run )を使用する。このURLは、ドライバーのインストール用ファイルのダウンロードボタンのリンク先のURLで、ダウンロードボタンの上にマウスカーソルを置いて右クリックすると、リンクをコピーするためのメニューが出てくるので、それを選択し、コマンド行にペーストすると良い。今回は、Tesla M60のGPU、Linux 64-bit、CUDA TOOLKIT 9.2のものを選択した。

    ダウンロードしたファイルを使って次のコマンドでドライバーをインストールする。

    sudo sh NVIDIA-Linux-x86_64-396.82.run --no-drm

    以下の確認・選択画面が出てくるので、適切に選択をしてEnterを押していく。

    WARNING: The nvidia-drm module will not be installed. As a result, DRM-KMS will not function with this installation of the NVIDIA driver.
    OK
    
    Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later.
    Yes/No
    カーソルキーでNoを選択してEnterを押す。
    
    Install NVIDIA's 32-bit compatibility libraries?
    Yes/No
    カーソルキーでNoを選択してEnterを押す。
    
    Would you like to run the nvidia-xconfig utility to automatically update your X configuration file so that the NVIDIA X driver will be used when you restart X?  Any pre-existing X configuration file will be backed up.
    Yes/No
    カーソルキーでNoを選択してEnterを押す。
    
    Installation of the NVIDIA Accelerated Graphics Driver for Linux-x86_64 (version: 396.82) is now complete.  Please update your XF86Config or xorg.conf file as appropriate; see the file     
      /usr/share/doc/NVIDIA_GLX-1.0/README.txt for details.
    OK

    GPUの動作状況の確認

    nvidia-smi
    Mon Nov  4 15:25:42 2019       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 396.82                 Driver Version: 396.82                    |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla M60           Off  | 00003130:00:00.0 Off |                  Off |
    | N/A   33C    P0    36W / 150W |      0MiB /  8129MiB |      1%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+

    今回は正常にGPUが正常に認識されていることを確認できた。

    slurmのインストール前準備

    必要なプログラムをインストールしておく。

    sudo yum install rpm-build
    sudo yum install munge-devel
    sudo yum install readline-devel
    sudo yum install perl-ExtUtils-MakeMaker
    sudo yum install pam-devel
    sudo yum install mysql-devel

    slurmのインストール

    curl -OL https://download.schedmd.com/slurm/slurm-19.05.3-2.tar.bz2

    ダウンロードするファイルのURLは、事前に調べておく。
    次のURLのページで、ダウンロード用URLを確認する。

    https://www.schedmd.com/downloads.php

    rpmbuild -ta slurm-19.05.3-2.tar.bz2
    cd rpmbuild/RPMS/x86_64

    次のコマンドは1行で入力して実行する。

    sudo yum localinstall slurm-19.05.3-2.el7.x86_64.rpm slurm-slurmctld-19.05.3-2.el7.x86_64.rpm slurm-slurmd-19.05.3-2.el7.x86_64.rpm slurm-torque-19.05.3-2.el7.x86_64.rpm slurm-example-configs-19.05.3-2.el7.x86_64.rpm slurm-perlapi-19.05.3-2.el7.x86_64.rpm

    slurmの設定

    sudo useradd -s /sbin/nologin -M slurm
    sudo mkdir -p /var/spool/slurm
    sudo chown -R slurm:slurm /var/spool/slurm
    echo AutoDetect=nvml | sudo tee /etc/slurm/gres.conf
    sudo cp /etc/slurm/slurm.conf.example /etc/slurm/slurm.conf

    slurmユーザーを作成して使用する。また作業用ディレクトリー、環境設定ファイルを用意する。

    /etc/slurm/slurm.confを編集する。
    emacsを使用する場合にはインストールする必要がある。

    sudo yum install emacs

    /etc/slurm/slurm.confの編集。
    事前に、ホスト名を調べる。次のコマンドでホスト名が表示される。

    hostname

    このコマンドで表示されたホスト名を、次の行の(hostname)の箇所に記入する。

    ControlMachine=(hostname)

    次に

    #SelectType=

    の後に次の2行を挿入する。

    SelectType=select/cons_tres
    SelectTypeParameters=CR_CPU

    ファイル末尾の次の2行を編集して、以下に示す3行にする。

    NodeName=linux[1-32] Procs=1
    PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP

    ここでは、GPUが1個ついた状況で以下のように編集する。

    (修正部分の1行目) GresTypes=gpu
    (修正部分の2行目) NodeName=(hostname) CPUs=6 Boards=1 SocketsPerBoard=1 CoresPerSocket=6 ThreadsPerCore=1 RealMemory=56347 Gres=gpu State=UNKNOWN
    (修正部分の3行目) PartitionName=all Nodes=ALL Default=YES MaxTime=INFINITE State=UP

    修正部分の2行目に記述する情報は、次のコマンドを参考にして記述する。

    slurmd -C

    このコマンドの出力例:

    NodeName=(hostname) CPUs=6 Boards=1 SocketsPerBoard=1 CoresPerSocket=6 ThreadsPerCore=1 RealMemory=56347

    この行の末尾に、Gres=gpu State=UNKNOWNを追加する。

    修正部分の3行目には、キュー名を設定する。debugのままでも使えるが、ここではallに変更した。defaultという名前を使ってみたが、これはうまく動作しなかった。

    slurmサービスの起動

    sudo systemctl start slurmctld
    sudo systemctl status slurmctld
    sudo systemctl enable slurmctld
    
    sudo systemctl start slurmd
    sudo systemctl status slurmd
    sudo systemctl enable slurmd

    slurmの動作確認

    scontrol show node
    NodeName=(hostname) Arch=x86_64 CoresPerSocket=6 
       CPUAlloc=0 CPUTot=6 CPULoad=0.25
       AvailableFeatures=(null)
       ActiveFeatures=(null)
       Gres=gpu:1(S:0)
       NodeAddr=(hostname) NodeHostName=(hostname) 
       OS=Linux 3.10.0-1062.4.1.el7.x86_64 #1 SMP Fri Oct 18 17:15:30 UTC 2019 
       RealMemory=56347 AllocMem=0 FreeMem=49995 Sockets=1 Boards=1
       State=IDLE ThreadsPerCore=1 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
       Partitions=all 
       BootTime=2019-11-04T14:53:46 SlurmdStartTime=2019-11-04T15:41:37
       CfgTRES=cpu=6,mem=56347M,billing=6
       AllocTRES=
       CapWatts=n/a
       CurrentWatts=0 AveWatts=0
       ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s

    ここでState=IDLEとなっていれば、正常に動作している。

    mpichの設定

    sudo yum install gcc-gfortran
    wget http://www.mpich.org/static/downloads/3.3.1/mpich-3.3.1.tar.gz
    tar -xzvf mpich-3.3.1.tar.gz
    cd mpich-3.3.1
    mkdir build
    cd build
    ../configure --prefix=/usr/local/mpich-3.3.1 CC=gcc CXX=g++ F77=gfortran FC=gfortran
    make -j8
    sudo make install
    

    cudaとmpichの環境変数設定

    .bashrcに以下の行を追加

    export CUDA_HOME="/usr/local/cuda-9.2"
    export PATH="${CUDA_HOME}/bin:${PATH}"
    PREFIX=/usr/local/cuda-9.2
    LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH}
    export PATH LD_LIBRARY_PATH
    export CPATH="/usr/local/include:$CUDA_HOME/include:$CPATH"
    export INCLUDE_PATH="$CUDA_HOME/include"
    
    MPIROOT=/usr/local/mpich-3.3.1
    export PATH=$MPIROOT/bin:$PATH
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MPIROOT/lib
    export MANPATH=$MANPATH:$MPIROOT/share/man

    .bashrcの設定変更を有効にするには次のコマンドを実行する。

    source ~/.bashrc

    以上で、設定完了。

    memo:
    Marketplaceのイメージを使って設定した環境を、汎用化したイメージにすることはできないようだ。ある程度設定した環境を、再利用することができるイメージにできないのは不便。
    cudaとGPUドライバーが設定済みのイメージを借りるともっと簡単にセットアップできるかも。例えば、AWSのMarketplaceで借りることができる"Amazon Linux AMI with NVIDIA TESLA GPU Driver"は、以前に使ったことがあるが、確かcudaとGPUドライバーが設定済みだったはずである。 今回は、CentOS7での設定手順を調べたかったので、CentOS7のイメージを借りて使用した。