スパコン上でGPU Direct対応のOpenMPIをビルドしたのでその方法を記述します。
通常のクラスター計算機でも一部の環境設定を変更すれば、同様の方法でビルドできると思います。
実施した環境
- Cray CS-Storm
- CPU: Xeon Gold 6150 x2 (36core)
- Mem: 768 GiB
- GPU: NVIDIA V100(PCIE) x10
- I/F: Infiniband
- OS: CentOS 7系
スパコン上では下記の環境設定コマンドを実行しました。
通常のクラスターであれば、cuda 10.2とgcc 6.1.0の環境と同等です。
$ module switch cudatoolkit/9.0.176 cudatoolkit/10.2.89
$ module switch intel/17.0.4 gcc/6.1.0
OpenUCXのビルド
高速インターコネクト(Infiniband)のライブラリ。
バージョン1.10.0を使用しました。
ダウンロードと展開。
$ wget https://github.com/openucx/ucx/releases/download/v1.10.0/ucx-1.10.0.tar.gz
$ tar xvfz ucx-1.10.0.tar.gz
$ cd ucx-1.10.0
続いてconfigureおよびmakeを行います。
CUDAのバージョン指定やAVXなどCPUに合わせた最適化とInfinibandのmellanoxドライバに合わせたオプションを追加しています。
$ ./configure --prefix=${HOME}/OpenMPI/ucx-1.10.0 --with-cuda=/usr/local/cuda-10.2 --enable-optimizations --with-avx --with-mcpu --with-march --with-mlx5-dv --with-ib-hw-tm
$ make
$ make install
OpenMPIのビルド
いよいよOpenMPI本体のビルドです。
本記事では、4.1.0を使用しました。
ダウンロード展開
$ wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.0.tar.gz
$ tar xvfz oepnmpi-4.1.0.tar.gz
$ cd oepnmpi-4.1.0
configureの前に先程ビルドしたOpenUCXのパスを設定しておきます。
$ export PATH=${HOME}/OpenMPI/ucx-1.10.0/bin:$PATH
$ export LD_LIBRARY_PATH=${HOME}/OpenMPI/ucx-1.10.0/lib:$LD_LIBRARY_PATH
configureとmakeを実施します。
ジョブ制御PBSの指定(省略可)、ucxの指定、CUDAの指定などを行なっています。
$ ./configure --with-verbs --prefix=${HOME}/OpenMPI/openmpi-4.1.0 --with-tm=/opt/pbs/13.1.3.170747 --with-ucx=${HOME}/OpenMPI/ucx-1.10.0 --enable-orterun-prefix-by-default --with-cuda=/usr/local/cuda-10.2 --with-gnu-ld --enable-mpi-cxx CC=gcc CXX=g++ LDFLAGS=-ldl
$ make -j 4
$ make install
動作確認
ビルドしたOpenMPIを使用するため、下記の環境変数を設定する。
export MPIROOT=${HOME}/OpenMPI/openmpi-4.1.0
export PATH=$MPIROOT/bin:$PATH
export LD_LIBRARY_PATH=$MPIROOT/lib:$LD_LIBRARY_PATH
コンパイラおよびmpirunの確認。
$ mpicc --version
gcc (GCC) 6.1.0 20160427 (Cray Inc.)
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ mpirun --version
mpirun (Open MPI) 4.1.0
Report bugs to http://www.open-mpi.org/community/help/
###mpirun実行時の設定
mpirun実行時にInfinibandの環境変数を設定しないとエラーとなりました。
実行時に必要な環境変数設定をまとめると下記です。
ジョブスケジューラで実行する場合は、PBSジョブスクリプトに下記をまとめて記載します。
# CS-Storm環境の場合のCUDA, GCC設定
module switch cudatoolkit/9.0.176 cudatoolkit/10.2.89
module switch intel/17.0.4 gcc/6.1.0
# UCX環境設定
export PATH=${HOME}/OpenMPI/ucx-1.10.0/bin:$PATH
export LD_LIBRARY_PATH=${HOME}/OpenMPI/ucx-1.10.0/lib:$LD_LIBRARY_PATH
# OpenMPI環境設定
export MPIROOT=${HOME}/OpenMPI/openmpi-4.1.0
export PATH=$MPIROOT/bin:$PATH
export LD_LIBRARY_PATH=$MPIROOT/lib:$LD_LIBRARY_PATH
# Infiniband環境設定
export OMPI_MCA_btl_openib_allow_ib=1
export OMPI_MCA_btl_openib_if_include="mlx5_0:1"
OMPI_MCA_btl_openib_if_includeには、ibstatコマンドを実行してCAの行に表示される値(OFEDのバージョン)を設定する。