最近在使用國網中心台灣杉三號上花了點時間研究跟嘗試才成功送出訓練任務,雖然國網的說明已經有寫到大部份資訊了,但相對比較分散而且有些小細節沒有提到,我便整理一下寫成筆記免得自己以後忘記,也順便分享給大家,希望大家少遇到一些問題XD

此筆記情境為使用台灣杉三號生醫專用節點進行影像分類的訓練任務,以 Python 為程式語言,Pytorch 為深度學習套件,過程中需要調用 GPU 資源。

1. 登入

如同一般的登入方式,使用ssh連線至台灣杉三號生醫專用節點,並輸入帳號密碼。
生醫專用節點主機位置:t3-c4.nchc.org.tw

比較特別的是台灣杉三號多了一層 MOTP 驗證,MOTP可以在計算資源服務網中:會員中心>會員資訊>主機帳號資訊>OTP 認證碼中找到。

2. 載入 Conda 環境

台灣杉三號中有預載許多常用的環境,可以使用 module avail 查看。

其中也包含 miniconda3,我們可以使用 module load miniconda3ml miniconda3 指令載入 miniconda3 環境,載入後使用方式就與一般conda相同。

3. GPU 環境 / Pytorch 安裝

在 Conda 環境中安裝套件就和平常的操作方式一樣,比較不同的是 Pytorch,因為台灣杉三號的 CUDA 版本較舊,如果直接安裝最新版會導致 Pytorch 找不到 GPU,因此我們要先使用 nvidia-smi 指令查看 CUDA 版本。

截至今日(2023/11/19),CUDA版本為 11.0,因此我們要到 Pytorch 網站 找適用 CUDA 小於 11.0 的版本安裝,到目前適合的安裝指令為:

1
2
# CUDA 10.2
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=10.2 -c pytorch

另外,透過這樣的環境安裝方式不需要去考慮 cuDNN 的問題,他會自動處理好。

安裝好後可以用下列指令測試是否成功安裝並且 Pytorch 可以順利使用 GPU。

1
2
#應回應 True
python -c "import torch; print(torch.cuda.is_available())"

4. 其餘套件安裝

到此我們應該已經順利安裝好 Pytorch 並設定好 GPU 了,我列出一些在影像處理與深度學習常用的套件安裝指令。

1
2
3
4
5
6
conda install -c conda-forge seaborn #DO NOT USE 0.12.*. IT HAS A BUG IN HEATMAP
conda install -c anaconda scikit-learn pillow pandas
conda install -c conda-forge matplotlib
conda install scikit-learn-intelex
conda install -c conda-forge tqdm
conda install -c conda-forge opencv

安裝完後環境設定就完成了!

5. 儲存空間

根據國網中心的說明文件,我們有這些地方可以儲存我們的資料,一般建議執行檔相關或環境檔案才儲存於 /home/$USER,其餘 Data 儲存在有10TB額度的 /staging/biology/$USER

空間 容量 刪除期限
/home/$USER 100G
/staging/biology/$USER 10T
/work/$USER 1500GB 一個月不動檔案刪除
/staging/reserve/PI_folder 付費空間需另外申請
巨量資料儲存服務 付費空間需另外申請

6. 提交任務

台灣杉三號屬於高速運算資源,也就是俗稱的超級電腦,使用 slurm 作為資源管理工具管理資源的分配,簡單來說就是當你要執行運算時,你得先向 slurm 提交你的運算要求,等 slurm 將資源分配給你進行運算。

千萬不要在登入節點直接進行運算作業

slurm 常用的指令有:

  • sbatch job.sh:將 job.sh 提交給 slurm 申請資源,他會回應一串 job id。
  • scancel $job_id:中止特定任務。
  • scontrol show jib $job_id:顯示特定任務狀態。

比較要注意的是我們必須在 job.sh 中定義一些 slurm 的設定(你也可以在命令列用參數輸入,但偏麻煩我就不介紹了) 我直接參考國網中心的說明文件範例。

job.sh CPU 任務

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/sh
#SBATCH -A MST109178        # project number
#SBATCH -J Job_name         # Job name
#SBATCH -p ngs53G           # Partition Name 等同PBS裡面的 -q Queue name
#SBATCH -c 8                # 使用的core數 請參考Queue資源設定 
#SBATCH --mem=53g           # 使用的記憶體量 請參考Queue資源設定
#SBATCH -o out.log          # Path to the standard output file 
#SBATCH -e err.log          # Path to the standard error ouput file
#SBATCH [email protected]    # email
#SBATCH --mail-type=BEGIN,END              # 指定送出email時機 可為NONE, BEGIN, END, FAIL, REQUEUE, ALL

echo 'Hello world!'  ##這邊寫入你要執行的指令

裡面的 Partition Name 請參考說明中 Partition(Queue) 資源設定 表格,依自己所需要的運算資源選擇,其中 Partition Name, memory size, core number,需要和表格中的一樣,如果設定錯誤的話會無法執行任務。

例如表格中

Partition 記憶體配置(–mem) 核心數搭配(-c)
ngs7G 7G 1

我們在設定檔中就應該要設定為:

1
2
3
#SBATCH -p ngs7G   
#SBATCH -c 1            
#SBATCH --mem=7g     


GPU 任務的設定方式類似,只是多了一行GPU核心數的設定,一樣用國網中心說明文件的範例說明:

job.sh GPU 任務

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/sh
#SBATCH -A MST109178        # Account name/project number
#SBATCH -J Job_name         # Job name
#SBATCH -p ngs1gpu           # Partition Name 等同PBS裡面的 -q Queue name
#SBATCH -c 6               # 使用的core數  請參考Queue資源設定 
#SBATCH --mem=90g           # 使用的記憶體量 請參考Queue資源設定
#SBATCH --gres=gpu:1        # 使用的GPU數 請參考Queue資源設定
#SBATCH -o out.log          # Path to the standard output file 
#SBATCH -e err.log          # Path to the standard error ouput file
#SBATCH [email protected]    # email
#SBATCH --mail-type=BEGIN,END              # 指定送出email時機 可為NONE, BEGIN, END, FAIL, REQUEUE, ALL

nvidia-smi  ##這邊寫入你要執行的指令

主要就是多了 #SBATCH --gres=gpu:1 這行而已。
其他相關設定如 log file path、email 通知等等就看後面註解的說明。

7. 實際執行

到這一步我們應該可以順利撰寫 script file 並提交給 slrum 執行了,完整的 job.sh 範例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/sh
#SBATCH -A MST109178        # Account name/project number
#SBATCH -J Job_name         # Job name
#SBATCH -p ngs1gpu           # Partition Name 等同PBS裡面的 -q Queue name
#SBATCH -c 6               # 使用的core數  請參考Queue資源設定 
#SBATCH --mem=90g           # 使用的記憶體量 請參考Queue資源設定
#SBATCH --gres=gpu:1        # 使用的GPU數 請參考Queue資源設定
#SBATCH -o out.log          # Path to the standard output file 
#SBATCH -e err.log          # Path to the standard error ouput file
#SBATCH [email protected]    # email
#SBATCH --mail-type=BEGIN,END              # 指定送出email時機 可為NONE, BEGIN, END, FAIL, REQUEUE, ALL

module purge
ml miniconda3
conda activate myenv #進入 conda 環境

python -u /path/to/script.py

以上有一個重點!! python 後面要加上 -u,這個參數的意思是強迫 STDOUT、STDERR 不要使用 buffer(force the stdout and stderr streams to be unbuffered),如果不這樣做的話會發現在執行過程中 log file 都不會有輸出,要等到執行結束或緩衝滿了才會被輸出到 log file,這樣對於監控程式的執行很不方便。

8. 預載模型

這是一個坑,感謝學長幫我解決這問題。說明文件中沒有提到但很重要的一點是運算節點沒有網路連線,因此需要網路的python指令無法執行,例如深度學習常用的下載 Pre-trained 模型

1
resnet34 = models.resnet34(pretrained=True)

這段程式就會執行失敗,因為在節點裡無法下載。解決方法是我們先在登入節點的終端機手動用 python下載想要的模型,等到送入運算節點時就會自動包含我們曾經下載過的 pre-trained 模型了。

手動執行以下程式碼:

1
2
from torchvision import models
resnet34 = models.resnet34(pretrained=True) #換成你要用的模型 ResNet, VGG, etc...

9. 其他指令

其他有一些實用的指令

1. 查詢剩餘空間額度

1
/usr/lpp/mmfs/bin/mmlsquota -u $USER_ID --block-size auto fs01 fs02
  • fs01: /work
  • fs02: /home

2. 查詢工作記憶體使用狀況

1
sacct -j $jobid -o JobID,JobName,Partition,User,NCPUS,AllocNodes,maxrss,Start,End,Elapsed,State

參考資料