Slurm 操作

軟體環境

環境模組管理工具 - Environment Modules

  • 在 HPC 的系統中,常有同個軟體、需要多個版本的情況
    • 例如 MPI 就有 OpenMPI、MPICH、IntelMPI 等等版本
    • 如果直接將軟體的路徑資訊,寫死在環境變數中,不利於版本切換
  • Environment Modules 是一個環境變數管理工具,可以透過簡單的指令管理目前使用的套件版本
    • Environment Modules 會根據設定檔 (Modulefile),自動修改環境變數
  • 使用 module load 將軟體的資訊載入到環境變數中
    ​​# 查看可用的 module
    ​​module avail
    ​​
    ​​# 載入 Open MPI 4.1.6
    ​​module load openmpi/4.1.6
    ​​
    ​​# 查看已載入的模組
    ​​module list
    ​​
    ​​# 從目前環境中移除 Open MPI
    ​​module remove openmpi/4.1.6
    ​​
    ​​# 移除所有已載入的模組
    ​​module purge
    

Job 管理系統 - Slurm

  • Slurm (Simple Linux Utility for Resource Management)是一個運算工作和資源管理系統
    • 常用在高速運算的環境中
    • 預設使用 FIFO、Space Sharing 的方式管理 job
  • 一個 job 可以是一行指令、一個程式的執行或是一個腳本 (shell script)
    • 透過 Slurm 的指令項系統提交 job,指令中包含
      • Job 的執行模式 (interactive/batch)
      • Job 的內容 (要執行的指令或腳本)
      • 需要的硬體資源 (多少個 node、多少顆 CPU)

在 Linux 中編譯/執行 MPI 程式

  • 在 Linux 中,常見的 MPI 版本有 OpenMPI、IntelMPI、MPICH
  • 系統中安裝的是 OpenMPI,常用指令如下
    • 編譯 C 語言檔案: mpicc
    • 編譯 C++ 檔案: mpic++mpicxx
    • 執行 MPI 程式: mpirunmpiexec
  • MPI 編譯器 (mpicc、mpic++) 和 gcc/g++ 有相同的使用方式和參數,差別是 mpicc/mpic++ 會自動引入和連結 MPI library,不需要額外參數
    • 使用 mpicc 編譯 hello.c,且產出執行檔的檔名為 hello
      ​​​​mpicc hello.c -o hello
      
    • 使用 mpic++ 編譯 hello.cpp,且產出執行檔的檔名為 hello
      ​​​​mpic++ hello.cpp -o hello
      ​​​​
      ​​​​# 或是
      ​​​​
      ​​​​mpicxx hello.cpp -o hello
      
  • 執行 MPI 程式可以用 mpirun 或 mpiexec,-n <np> 可以指定要啟動多少 processes,<np> 是 processes 的數量
    ​​mpirun -n 4 hello
    ​​
    ​​# 或是  
    ​​
    ​​mpiexec -n 4 hello
    

本系統上需要額外參數

  • 因為系統的網路架構特殊,若 job 執行在多節點需要額外參數
  • 請在 mpirun 和 mpiexec 中加上
    • -mca mpi_preconnect_all true -mca btl_tcp_if_include ens19
    • 例如:
      ​​​​mpirun -mca mpi_preconnect_all true -mca btl_tcp_if_include ens19 ./hello
      

使用 Slurm 提交 Job

  • 使用者提交 job 時,需要指定要執行的內容和所需的資源數量
  • 每個提交 job,會先被放到 queue 中
    • 當系統已有足夠的資源,就會執行該 job
    • Job 完成後就會被移出 queue
  • 當要求的資源超過系統擁有的資源,job 的提交會被系統拒絕

確認系統狀態

  • 可以用下面指令確認系統狀態:
    ​​# 目前各節點狀態
    ​​sinfo
    ​​
    ​​# 目前 queue 中的 job
    ​​squeue
    

上傳程式碼

  • 要執行的程式必須先存在系統中
    • 建議將程式碼檔案上傳到系統中,然後用系統上的編譯器編譯
    • 下面提出幾個上傳程式碼的方法
  • 使用文字編輯器直接在系統中編輯
    • 使用 vimnano 等 Linux 中的文字編輯器直接建立檔案
    • 也可以用複製貼上的方式上傳
  • 使用 scp 將檔案從自己的電腦複製到系統中
    ​​scp <src> <dest>
    
    • scp 的使用方式類似 cp 指令,但功能更多,可以透過網路跨節點傳輸檔案
    • <src> 是要被複製的檔案的路徑
    • <dest> 是複製的檔案的存檔路徑
    • <user>@<host>:<path> 表示在遠端的路徑
      • <user>: 在遠端機器上的使用者名稱 (本系統使用學號)
      • <host>: 遠端機器的 IP、hostname 或 domain name
      • <path>: 遠端機器上的檔案路徑

E.g. 複製到遠端機器 (上傳)

  • 將目前目錄下的 hello.c,複製到遠端機器 192.168.10.10 、使用者 acs11034 的 home 目錄下
    ​​scp ./hello.c acs110134@192.168.10.10:~
    

E.g. 複製遠端機器上的檔案 (下載)

  • 將遠端機器 192.168.10.10、使用者 acs11034 的 home 目錄下的 output/hello.txt,複製到目前目錄中
    ​​scp acs110134@192.168.10.10:~/output/hello.txt .
    

Job 管理

  • 使用 interactive 的方式提交 job,整個執行過程都會在 terminal 中執行,輸出結果會直接輸出在 terminal 上
    • -n: 指定 CPU core 的數量
      ​​​​salloc -n 3 mpirun ./my_prog
      
    • -N: 指定節點數量
      ​​​​salloc -N 3 mpirun ./my_prog
      
      • 指定節點數量時,每個節點至少會執行一個 process
      • 所以這個例子會要求三個 CPU core
      • -N 可以和 -n 一起使用
  • 查看 queue 的狀況
    ​​squeue
    
  • 取消在 queue 中的 job
    ​​scancel <job id>
    

如何確定 Job 跑在多節點

  • hostname 指令會輸出機器的名稱
  • 向 Slurm 要求三個節點的資源,運行 hostname 指令,會輸出三台不同機器的名稱
    ​​salloc -N 3 srun hostname
    
    • 因為 hostname 本身不是平行執行的程式,所以前面需要加上 srun 使其在每個 CPU core 都執行一次
  • 或是簡化成下面指令
    ​​srun -N 3 hostname
    

參考資料