介紹如何編譯 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.0 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/