# Slurm 操作 ## 軟體環境 ### 環境模組管理工具 - Environment Modules - 在 HPC 的系統中,常有同個軟體、需要多個版本的情況 - 例如 MPI 就有 OpenMPI、MPICH、IntelMPI 等等版本 - 如果直接將軟體的路徑資訊,寫死在環境變數中,不利於版本切換 - Environment Modules 是一個環境變數管理工具,可以透過簡單的指令管理目前使用的套件版本 - Environment Modules 會根據設定檔 (Modulefile),自動修改環境變數 - 使用 `module load` 將軟體的資訊載入到環境變數中 ```bash # 查看可用的 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) ![](https://cluster.hpcc.ucr.edu/~jhayes/slurm/16.05.4/arch.gif) ## 在 Linux 中編譯/執行 MPI 程式 - 在 Linux 中,常見的 MPI 版本有 OpenMPI、IntelMPI、MPICH... - 系統中安裝的是 OpenMPI,常用指令如下 - 編譯 C 語言檔案: `mpicc` - 編譯 C++ 檔案: `mpic++`、`mpicxx` - 執行 MPI 程式: `mpirun`、`mpiexec` - MPI 編譯器 (mpicc、mpic++...) 和 gcc/g++ 有相同的使用方式和參數,差別是 mpicc/mpic++ 會自動引入和連結 MPI library,不需要額外參數 - 使用 mpicc 編譯 *hello.c*,且產出執行檔的檔名為 *hello* ```bash mpicc hello.c -o hello ``` - 使用 mpic++ 編譯 *hello.cpp*,且產出執行檔的檔名為 *hello* ```bash mpic++ hello.cpp -o hello # 或是 mpicxx hello.cpp -o hello ``` - 執行 MPI 程式可以用 mpirun 或 mpiexec,`-n <np>` 可以指定要啟動多少 processes,`<np>` 是 processes 的數量 ```bash mpirun -n 4 hello # 或是 mpiexec -n 4 hello ``` :::warning **本系統上需要額外參數** - 因為系統的網路架構特殊,若 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 的提交會被系統拒絕 ### 確認系統狀態 - 可以用下面指令確認系統狀態: ```bash # 目前各節點狀態 sinfo # 目前 queue 中的 job squeue ``` ### 上傳程式碼 - 要執行的程式必須先存在系統中 - 建議將程式碼檔案上傳到系統中,然後用系統上的編譯器編譯 - 下面提出幾個上傳程式碼的方法 - 使用文字編輯器直接在系統中編輯 - 使用 `vim` 或 `nano` 等 Linux 中的文字編輯器直接建立檔案 - 也可以用複製貼上的方式上傳 - 使用 `scp` 將檔案從自己的電腦複製到系統中 ``` scp <src> <dest> ``` - `scp` 的使用方式類似 `cp` 指令,但功能更多,可以透過網路跨節點傳輸檔案 - `<src>` 是要被複製的檔案的路徑 - `<dest>` 是複製的檔案的存檔路徑 - 用 `<user>@<host>:<path>` 表示在遠端的路徑 - `<user>`: 在遠端機器上的使用者名稱 (本系統使用學號) - `<host>`: 遠端機器的 IP、hostname 或 domain name - `<path>`: 遠端機器上的檔案路徑 :::success **E.g.** 複製到遠端機器 (上傳) - 將目前目錄下的 *hello.c*,複製到遠端機器 192.168.10.10 、使用者 acs11034 的 home 目錄下 ```bash scp ./hello.c acs110134@192.168.10.10:~ ``` ::: :::info **E.g.** 複製遠端機器上的檔案 (下載) - 將遠端機器 192.168.10.10、使用者 acs11034 的 home 目錄下的 *output/hello.txt*,複製到目前目錄中 ```bash 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> ``` :::info **如何確定 Job 跑在多節點** - `hostname` 指令會輸出機器的名稱 - 向 Slurm 要求三個節點的資源,運行 `hostname` 指令,會輸出三台不同機器的名稱 ``` salloc -N 3 srun hostname ``` - 因為 `hostname` 本身不是平行執行的程式,所以前面需要加上 `srun` 使其在每個 CPU core 都執行一次 - 或是簡化成下面指令 ``` srun -N 3 hostname ``` ::: ## 參考資料 - [國網中心 salloc 說明](https://man.twcc.ai/@twccdocs/doc-twnia2-main-zh/https%3A%2F%2Fman.twcc.ai%2F%40twccdocs%2Fguide-twnia2-salloc-zh) - [國網 MPI 執行範例](https://docs.twcc.ai/docs/user-guides/twcc/twnia2-hpc-cli/mpi) - [Slurm 官方文件 - salloc 完整參數](https://slurm.schedmd.com/salloc.html)