介紹如何編譯 EGL 版本的 ParaView 繪圖伺服器,在 Slurm 排程系統的 GPU HPC 中以 OpenMPI 執行平行 3D 繪圖。
編譯 ParaView 伺服器
下載 ParaView 5.8.0 版的原始碼,使用以下參數設定進行編譯與安裝:
#!/bin/sh
module purge
module load cmake compiler/gnu/7.3.0 openmpi3 nvidia/cuda/10.1
# 安裝目錄
PARAVIEW_INSTALL_PATH=/opt/paraview-5.8.0
cmake -DCMAKE_INSTALL_PREFIX=$PARAVIEW_INSTALL_PATH \
-DPARAVIEW_USE_QT=OFF \
-DPARAVIEW_USE_MPI=ON \
-DVTK_SMP_IMPLEMENTATION_TYPE=OpenMP \
-DVTK_OPENGL_HAS_EGL=ON \
-DOPENGL_egl_LIBRARY=/usr/lib64/libglvnd/libEGL.so.1 \
-DOPENGL_gl_LIBRARY=/usr/lib64/libglvnd/libGL.so.1 \
-DOPENGL_gles2_LIBRARY=/usr/lib64/libglvnd/libGLESv2.so.2 \
-DOPENGL_glu_LIBRARY=/usr/lib64/libGLU.so \
-DOPENGL_glx_LIBRARY=/usr/lib64/libglvnd/libGLX.so.0 \
-DOPENGL_opengl_LIBRARY=/usr/lib64/libglvnd/libGL.so.1 \
-DCMAKE_BUILD_TYPE=Debug \
-DPARAVIEW_PLUGIN_ENABLE_pvNVIDIAIndeX=ON \
../ParaView-v5.8.0
# 建立安裝目錄
mkdir -p $PARAVIEW_INSTALL_PATH
# 編譯與安裝
make -j64 install
Slurm 排程執行 ParaView 伺服器
若要透過 Slurm 排程系統執行平行化的 ParaView 伺服器,可以參考以下這個 Slurm 的工作指令稿:
#!/bin/bash
#SBATCH -J paraview_server # 工作名稱
#SBATCH -o paraview_server.log.%j # 輸出檔案名稱(%j 為 Job ID)
#SBATCH -t 00:30:00 # 執行時間(hh:mm:ss)
#SBATCH --account=ACCOUNT # 記帳編號
#SBATCH --nodes=2 # 節點數量
#SBATCH --ntasks-per-node=16 # 每節點 MPI 行程數量
#SBATCH --gres=gpu:8 # 每節點 GPU 數量
echo "Start ParaView Server"
# 載入必要模組
module purge
module load cmake compiler/gnu/7.3.0 openmpi3 nvidia/cuda/10.1
PVSERVER="/opt/paraview-5.8.0/bin/pvserver --force-offscreen-rendering --disable-xdisplay-test --multi-clients"
mpirun -np 4 $PVSERVER --egl-device-index=0 :\
-np 4 $PVSERVER --egl-device-index=1 :\
-np 4 $PVSERVER --egl-device-index=2 :\
-np 4 $PVSERVER --egl-device-index=3 :\
-np 4 $PVSERVER --egl-device-index=4 :\
-np 4 $PVSERVER --egl-device-index=5 :\
-np 4 $PVSERVER --egl-device-index=6 :\
-np 4 $PVSERVER --egl-device-index=7
echo "Stop ParaView Server"
將指令稿儲存為 pvjob.sh,使用 sbatch 將此指令稿送入 Slurm 排程系統執行:
# 送入 Slurm 排程系統執行
sbatch pvjob.sh
當 ParaView 工作指令稿在 Slurm 中被執行之後,就會建立一個檔案名稱為 paraview_server.log.JOB_ID 的輸出檔案,從檔案中可以得知 ParaView 伺服器的主要執行節點以及傾聽連接埠號。
由於 ParaView 伺服器位於後端計算節點中,從外部無法直接連線,因此必須透過登入節點建立一個 SSH 通道(SSH tunnel),讓外部的 ParaView client 可以連線至計算節點上的 ParaView 伺服器。
# 登入節點
HEAD_NODE=12.34.56.78
# 主計算節點
COMPUTE_NODE=192.168.0.1
# 建立 SSH Tunnel
ssh -L 11111:${COMPUTE_NODE}:11111 ${HEAD_NODE}
SSH 通道建立好之後,就可以在本機使用 ParaView client 連接 localhost:11111 透過 SSH 通道轉接至計算節點中的 ParaView 伺服器,進行平行繪圖了。
Slurm 互動執行 ParaView 伺服器
在程式開發階段,可以使用 Slurm 的互動式節點來執行 ParaView 伺服器,方便查看 ParaView 伺服器的輸出訊息以及除錯。
NVIDIA IndeX
從 ParaView dependencies 下載 nvidia-index-libs-2.4.20200424-linux.tar.bz2,解壓縮之後放在適當的位置,並在執行 ParaView 之前以 LD_LIBRARY_PATH 指定 NVIDIA IndeX 函式庫位置:
#!/bin/bash
#SBATCH -J paraview_server # 工作名稱
#SBATCH -o paraview_server.log.%j # 輸出檔案名稱(%j 為 Job ID)
#SBATCH -t 00:30:00 # 執行時間(hh:mm:ss)
#SBATCH --account=ACCOUNT # 記帳編號
#SBATCH --nodes=2 # 節點數量
#SBATCH --ntasks-per-node=16 # 每節點 MPI 行程數量
#SBATCH --gres=gpu:8 # 每節點 GPU 數量
echo "Start ParaView Server"
# 載入必要模組
module purge
module load cmake compiler/gnu/7.3. openmpi3 nvidia/cuda/10.1
# NVIDIA IndeX 函式庫
export LD_LIBRARY_PATH=/opt/nvidia-index-libs-2.4.20200424_CUDA_101-linux/lib
PVSERVER="/opt/paraview-5.8.0/bin/pvserver --force-offscreen-rendering --disable-xdisplay-test --multi-clients"
mpirun -np 4 $PVSERVER --egl-device-index=0 :\
-np 4 $PVSERVER --egl-device-index=1 :\
-np 4 $PVSERVER --egl-device-index=2 :\
-np 4 $PVSERVER --egl-device-index=3 :\
-np 4 $PVSERVER --egl-device-index=4 :\
-np 4 $PVSERVER --egl-device-index=5 :\
-np 4 $PVSERVER --egl-device-index=6 :\
-np 4 $PVSERVER --egl-device-index=7
echo "Stop ParaView Server"
參考資料
- Kitware Blog:Off-screen Rendering through the Native Platform Interface (EGL)
- Kitware GitHub:ParaView and Offscreen Rendering
- CMake:FindOpenGL
- Unige HPC:Applications
- Biowulf:paraview on Biowulf
- NVIDIA NGC:ParaView
- Kitware Blog:Running ParaView on a Supercomputer
- ParaView Documentation:Remote and parallel visualization
待整理資料
- https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglIntro.xhtml
- https://www.itread01.com/content/1541025784.html
- https://secure.cci.rpi.edu/wiki/index.php?title=ParaView
- https://public.kitware.com/pipermail/paraview/2012-April/024683.html
- https://slurm.schedmd.com/mpi_guide.html#open_mpi
- https://slurm.schedmd.com/srun.html
- https://developer.download.nvidia.com/video/gputechconf/gtc/2019/presentation/s9692-nvidia-index-implementing-cloud-services-for-complex-scientific-data-visualization.pdf
- http://on-demand.gputechconf.com/gtc/2018/presentation/s8689-in-situ-visualization-for-novel-earth-system-modeling-framework-using-nvidia-index-paraview-plugin-and-catalyst-v2.pdf
- http://on-demand.gputechconf.com/gtc/2018/presentation/s8704-nvidia-index-advanced-large-scale-data-visualizations-on-the-nvidia-gpu-cloud.pdf
- https://www.mn.uio.no/astro/english/services/it/help/visualization/paraview/nvidia-index-paraview-plugin-users-guide-5.6.pdf
- https://bluewaters.ncsa.illinois.edu/pythonnotebooks
- https://user.cscs.ch/tools/interactive/
