--- tags: HowTo, singularity, HPC, tutorial, TWCC title: HowTo:使用容器跨節點高速運算-AI Benchmark | zh GA: UA-155999456-1 --- {%hackmd @docsharedstyle/default %} {%hackmd @docsharedstyle/twccheader-zh %} # HowTo:容器跨節點高速運算-AI Benchmark :::success <i class="fa fa-star" aria-hidden="true"></i> **適用情境:如何使用超過 8 顆 GPUs 運算?如何建立台灣杉二號的容器?如何提交 Job?** *您是否也有相同的困擾?讓我們手把手帶您組合 TWCC 雲端服務架構,輕鬆解決您的問題!* ::: 本篇文章將教學如何使用 **TWCC 台灣杉二號 (命令列介面) (*TWNIA2 (HPC CLI)*)** 建立容器與執行跨節點高速運算。 TWCC 容器運算服務 (開發型容器與任務型容器)、HPC 高速運算任務,皆採用 [NVIDIA NGC 優化之容器](https://ngc.nvidia.com/catalog/containers),包含`TensorFlow`、`PyTorch` ...等等。本篇文章也將採用 NGC 容器做為操作範例<sup>[1]</sup>。 自 `NGC 19.11` <sup>[2]</sup>版本以後的容器,已[實驗性支援 Singularity 容器](https://developer.nvidia.com/blog/how-to-run-ngc-deep-learning-containers-with-singularity/),適用 HPC 使用情境,因此台灣杉二號 (命令列介面) 用戶可以直接下載 NGC 容器使用,亦可用 NGC 提供的容器為基礎映像檔,疊加自己常用工具<sup>[3]</sup>。 本文將透過 Singularity 容器包裝計算工作需使用的套件,再透過 Slurm 資源調度管理系統,撰寫 job script 依需求索取資源、Queue 排程,並提交計算工作。 :::info <i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** [1] NVIDIA 提供許多 [<ins>Deep Learning 範例</ins>](https://github.com/NVIDIA/DeepLearningExamples)參考,提升操作便利性。 [2] NGC 版號由 「**年分.月份**」組成:`NGC 20.09` 即是 2020 年 9 月發行版本。可參閱 [<ins>NGC Support Matrix</ins>](https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html),詳述 NGC 提供 AI frameworks、套件版號的差異。 [3] 也可下載 Docker Hub 或其他 Container Registry 的容器使用,更多資訊請參考 [<ins>HowTo:建立 TWNIA2 容器</ins>](https://man.twcc.ai/@twccdocs/howto-twnia2-create-sglrt-container-zh)。 ::: ## Step 1. 使用已預載容器或下載 NGC 容器 TWSC 已為使用者預載 [TensorFlow](https://docs.nvidia.com/deeplearning/frameworks/tensorflow-release-notes/)、[PyTorch](https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/) 等常用的 NGC 容器,並放置於路徑 `/work/TWCC_cntr` 之下。 若想使用其他版本或其他容器,TWCC 台灣杉二號已安裝 Singularity,您可以使用 `singularity pull` 指令,下載 Singularity 容器<sup>[4]</sup>。 :::info <i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** [4] 可下載 Docker Hub 或其他 Container Registry 的容器使用,更多使用方式與資訊請參考 [<ins>HowTo:建立 TWNIA2 容器</ins>](https://man.twcc.ai/@twccdocs/howto-twnia2-create-sglrt-container-zh)。 ::: ## Step 2. 在容器裡安裝套件 (可略) 需要 sudo 權限才能在 Singularity 容器裡安裝套件,用戶可以在自己的機器建立客製化容器 (建議使用虛擬機,如 TWCC 的虛擬運算服務),再上傳至台灣杉二號環境使用<sup>[5]</sup>。 例如:以 PyTorch 的容器為基礎映像檔,安裝 [Horovod 分散式訓練框架](https://horovod.ai/)<sup>[6]</sup>: - 建立**容器** ```bash $ sudo singularity build pytorch_20.09-py3_horovod.sif pytorch_20.09-py3_horovod.def ``` - **`pytorch_20.09-py3_horovod.def` 的內容** ```bash BootStrap: docker From: nvcr.io/nvidia/pytorch:20.09-py3 Stage: build %post # source env . /.singularity.d/env/10-docker*.sh # install horovod export HOROVOD_GPU=CUDA export HOROVOD_GPU_OPERATIONS=NCCL export HOROVOD_NCCL_LINK=SHARED export HOROVOD_WITHOUT_GLOO=1 export HOROVOD_WITH_MPI=1 export HOROVOD_WITH_PYTORCH=1 export HOROVOD_WITHOUT_TENSORFLOW=1 export HOROVOD_WITHOUT_MXNET=1 export LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:$LD_LIBRARY_PATH pip install --no-cache-dir horovod==0.20.3 ``` :::info <i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** [5] 更多如何客製化容器的步驟,請參考[<ins>客製化 Singularity 容器</ins>](https://man.twcc.ai/@twccdocs/howto-twnia2-create-sglrt-container-zh#2-%E5%AE%A2%E8%A3%BD%E5%8C%96-Singularity-%E5%AE%B9%E5%99%A8)。 [6] NGC 提供的容器,TensorFlow 有安裝 Horovod,而 PyTorch 則無,因此需額外安裝。 ::: ## Step 3. 啟用混合精度 (可略) NVIDIA 提供的 TensorFlow、PyTorch、MXNet,皆可啟用混合精度 (Automatic Mixed Precision),可以提高運算速度,若有需要請參考 NVIDIA [Automatic Mixed Precision for Deep Learning](https://developer.nvidia.com/automatic-mixed-precision)。 :::info <i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** 也可參考以 TWCC 容器服務[<ins>開啟 TensorFlow 自動混合精度運算與執行效能分析</ins>](https://www.twcc.ai/doc?page=howto_ctn6)。 ::: ## Step 4. 撰寫 Slurm Job Script 當您準備好計算環境後,請按照以下步驟,透過 Slurm 資源調度管理系統,撰寫 job script 依需求索取資源、Queue 排程,並提交計算工作。 `.sh` 檔案為 Slurm 將提交運算的 Job script,內容分為「**兩大部分**」: 1. **Job、計畫、資源資訊**:job 名稱、節點數量、每節點運行的任務數、每節點的 GPU 數量、job 最長的運行時間、計畫 ID、Queue 名稱。 3. **Job 執行的內容** 以下以 Horovod 撰寫的 benchmark script 為編輯和測試的範例: 執行以下編輯指令 > 按下<kbd>i</kbd> > 擇一範例複製貼上 > 按下<kbd>ESC</kbd> > 輸入`:wq!` 存檔離開,即完成 Job script! ```bash $ vim <FILE_NAME>.sh ``` :::info <i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** 您可使用習慣的編輯器撰寫 `.sh` 檔案,範例採用 vim 操作。 ::: ### TensorFlow 1 ```bash #!/bin/bash #SBATCH --job-name=Hello_twcc ## job name #SBATCH --nodes=2 ## 索取 2 節點 #SBATCH --ntasks-per-node=8 ## 每個節點運行 8 srun tasks #SBATCH --cpus-per-task=4 ## 每個 srun task 索取 4 CPUs #SBATCH --gres=gpu:8 ## 每個節點索取 8 GPUs #SBATCH --time=00:10:00 ## 最長跑 10 分鐘 (測試完這邊記得改掉,或是直接刪除該行) #SBATCH --account="PROJECT_ID" ## PROJECT_ID 請填入計畫ID(ex: MST108XXX),扣款也會根據此計畫ID #SBATCH --partition=gtest ## gtest 為測試用 queue,後續測試完可改 gp1d(最長跑1天)、gp2d(最長跑2天)、gp4d(最長跑4天) module purge module load singularity # net export UCX_NET_DEVICES=mlx5_0:1 export UCX_IB_GPU_DIRECT_RDMA=1 # tf 1 SIF=/work/TWCC_cntr/tensorflow_21.11-tf1-py3.sif SINGULARITY="singularity run --nv $SIF" # tf 1 horovod benchmark script from # wget https://raw.githubusercontent.com/horovod/horovod/v0.19.1/examples/tensorflow_synthetic_benchmark.py HOROVOD="python tensorflow_synthetic_benchmark.py --batch-size 256" # enable AUTO MIXED PRECISION export TF_ENABLE_AUTO_MIXED_PRECISION=1 # enable NCCL log export NCCL_DEBUG=INFO srun $SINGULARITY $HOROVOD ``` ### TensorFlow 2 ```bash #!/bin/bash #SBATCH --job-name=Hello_twcc ## job name #SBATCH --nodes=2 ## 索取 2 節點 #SBATCH --ntasks-per-node=8 ## 每個節點運行 8 srun tasks #SBATCH --cpus-per-task=4 ## 每個 srun task 索取 4 CPUs #SBATCH --gres=gpu:8 ## 每個節點索取 8 GPUs #SBATCH --time=00:10:00 ## 最長跑 10 分鐘 (測試完這邊記得改掉,或是直接刪除該行) #SBATCH --account="PROJECT_ID" ## PROJECT_ID 請填入計畫ID(ex: MST108XXX),扣款也會根據此計畫ID #SBATCH --partition=gtest ## gtest 為測試用 queue,後續測試完可改 gp1d(最長跑1天)、gp2d(最長跑2天)、gp4d(最長跑4天) module purge module load singularity # net export UCX_NET_DEVICES=mlx5_0:1 export UCX_IB_GPU_DIRECT_RDMA=1 # tf 2 SIF=/work/TWCC_cntr/tensorflow_21.11-tf2-py3.sif SINGULARITY="singularity run --nv $SIF" # tf 2 horovod benchmark script from # wget https://raw.githubusercontent.com/horovod/horovod/v0.19.5/examples/tensorflow2_synthetic_benchmark.py HOROVOD="python tensorflow2_synthetic_benchmark.py --batch-size 256" # enable NCCL log export NCCL_DEBUG=INFO srun $SINGULARITY $HOROVOD ``` ### PyTorch ```bash #!/bin/bash #SBATCH --job-name=Hello_twcc ## job name #SBATCH --nodes=2 ## 索取 2 節點 #SBATCH --ntasks-per-node=8 ## 每個節點運行 8 srun tasks #SBATCH --cpus-per-task=4 ## 每個 srun task 索取 4 CPUs #SBATCH --gres=gpu:8 ## 每個節點索取 8 GPUs #SBATCH --time=00:10:00 ## 最長跑 10 分鐘 (測試完這邊記得改掉,或是直接刪除該行) #SBATCH --account="PROJECT_ID" ## PROJECT_ID 請填入計畫ID(ex: MST108XXX),扣款也會根據此計畫ID #SBATCH --partition=gtest ## gtest 為測試用 queue,後續測試完可改 gp1d(最長跑1天)、gp2d(最長跑2天)、gp4d(最長跑4天) module purge module load singularity # net export UCX_NET_DEVICES=mlx5_0:1 export UCX_IB_GPU_DIRECT_RDMA=1 # pytorch SIF=/work/TWCC_cntr/pytorch_21.11-py3_horovod.sif SINGULARITY="singularity run --nv $SIF" # pytorch horovod benchmark script from # wget https://raw.githubusercontent.com/horovod/horovod/v0.20.3/examples/pytorch/pytorch_synthetic_benchmark.py HOROVOD="python pytorch_synthetic_benchmark.py --batch-size 256" # enable NCCL log export NCCL_DEBUG=INFO srun $SINGULARITY $HOROVOD ``` :::info <i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** 1. 於腳本檔頭增加以下內容,可以增設 email 取得 Job 狀態的通知: ```bash #SBATCH --mail-type=ALL #SBATCH --mail-user=$Your_email ``` 2. 索取資源的比例,將依您指定的 GPU 數量,並依 1 GPU: 4 CPU: 90 GB Memory 比例分配。 例: > 索取 1 GPU,會自動配置 90 GB Memory 索取 8 GPU,會自動配置 720 GB Memory 3. 請勿指定使用特定運算節點,系統將會自動分配運算資源。 4. 更多 Queue 資訊,請參考 [<ins>Queue 與計算資源使用說明</ins>](https://www.twcc.ai/doc?page=hpc_cli#4-Queue-%E8%88%87%E8%A8%88%E7%AE%97%E8%B3%87%E6%BA%90%E4%BD%BF%E7%94%A8%E8%AA%AA%E6%98%8E)。 ::: ## Step 5. 提交 Job - 執行以下指令即可提交 Job,系統將為您安排 Queue 排程、所需的資源,並依排序啟動運算 ```bash $ sbatch <FILE_NAME>.sh ``` :::info <i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** 提交完成後,將顯示系統派發的 Job ID。 ::: ## Step 6. 查看和取消 - 開始計算後,可使用以下指令查看 log ```bash $ tail -f slurm_<JOB_ID>.out ``` :::info <i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** 其他常用指令如下,更多指令請參考 [<ins>Slurm指令</ins>](https://www.twcc.ai/doc?page=hpc_cli#6-Slurm%E6%8C%87%E4%BB%A4): 1. 使用`squeue -u $USER`:查看正在運行的 job 2. 使用 `sacct -X`:查看今日運行的 job 及狀態,確認是否還在運行或已結束。 ::: - 取消正在運行的 Job。若想停止正在執行的 job,請執行此指令: ```bash $ scancel <JOB_ID> ``` ## <i class="fa fa-backward" aria-hidden="true"></i> 前一主題 - 如何建立 TWNIA2 容器?:point_right: [HowTo:建立 TWNIA2 容器](https://man.twcc.ai/@twccdocs/howto-twnia2-create-sglrt-container-zh)