---
title: HowTo:建立 TWNIA2 容器 | zh
tags: HowTo, TWNIA2, ZH
GA: UA-155999456-1
---
{%hackmd @docsharedstyle/default %}
{%hackmd @docsharedstyle/twccheader-zh %}
# HowTo:建立 TWNIA2 容器
:::success
<i class="fa fa-star" aria-hidden="true"></i> **適用情境:如何建立台灣杉二號的容器?如何客製化容器?**
*您是否也有相同的困擾?讓我們手把手帶您組合 TWCC 雲端服務架構,輕鬆解決您的問題!*
:::
您可透過 「**Singularity**」 包裝您所需的套件與程式,**建立可在 TWCC 台灣杉二號 (命令列介面) (TWNIA2 (HPC CLI)) 服務執行運算工作的容器環境**,並可以快速部署套件、搬移、以及分享。
- 本篇文章將教學:
- 如何在台灣杉二號使用 Singularity 容器,或利用 [TWCC 虛擬運算個體](https://www.twcc.ai/doc?page=vm)客製化容器
- 運行簡易容器指令
- 進階操作:建立容器沙盒測試環境、輕量化容器
:::info
<i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** [<ins>Singularity</ins>](https://sylabs.io/) 工具相當於 Docker,可建立 Rootless 形式的容器。
:::
## 準備工作:容器映像檔
容器來源有多種選擇,您可以使用 TWCC 已預載的容器映像檔、下載容器映像檔,或客製化您的容器環境。
### 1. TWCC 預載的容器映像檔
TWCC 已為使用者預載常用的 NGC 容器,並放置於路徑 `/work/TWCC_cntr` 之下:
| [PyTorch](https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/rel_21-11.html#rel_21-11) | [TensorFlow](https://docs.nvidia.com/deeplearning/frameworks/tensorflow-release-notes/rel_21-11.html#rel_21-11) |[CUDA](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#abstract) |[HPC SDK](https://docs.nvidia.com/hpc-sdk/hpc-sdk-release-notes/index.html)|
| -------- | -------- | -------- | -------- |
| pytorch_21.11-py3 | tensorflow_21.11-tf2-py3 | cuda_11.5.1-cudnn8-devel-ubuntu20.04 | nvhpc_22.1-runtime-cuda11.5-ubuntu20.04
| pytorch_21.11-py3_horovod | tensorflow_21.11-tf1-py3 | cuda_11.5.1-cudnn8-runtime-ubuntu20.04 | nvhpc_22.1-devel-cuda11.5-ubuntu20.04|
| - | - | cuda_11.5.1-cudnn8-devel-centos8 | nvhpc_22.1-runtime-cuda11.5-centos7 |
| - | - | cuda_11.5.1-cudnn8-runtime-centos8 | nvhpc_22.1-devel-cuda11.5-centos7 | - | - | 11.5.1-cudnn8-devel-centos8 |
> TWCC Release Date: 31Mar22
您可以使用以下指令來建立容器並執行指令,而使用後的映像檔快取預設會存放於 `$HOME/.singularity/cache` 內,可快速再次使用容器,省下下載等待的時間:
```
$ singularity exec --nv oras://registry.twcc.ai/singularity/<套件名>:<版本號> <在容器內執行的指令>
```
### 2 下載容器映像檔
熟悉容器技術的進階用戶,若希望映像檔加入其他應用程式、套件,可先使用 [TWCC 虛擬運算個體](https://www.twcc.ai/doc?page=vm)客製化您的容器映像檔,再將映像檔上傳至台灣杉二號 (命令列介面) 使用。
- 本篇以 **[<ins>TWCC 虛擬運算個體</ins>](https://www.twcc.ai/doc?page=vm)** 示範,系統選用 CentOS 7。
:::danger
<i class="fa fa-exclamation-triangle fa-20" aria-hidden="true"></i> **重要:**
由於客製化 Singularity 容器映像檔需使用 sudo 權限,台灣杉二號 (命令列介面, HPC CLI) 服務為保持使用環境的一致性與用戶資料安全的保護,恕無法提供 sudo 權限給用戶,建議使用 **[<ins>TWCC 虛擬運算個體</ins>](https://www.twcc.ai/doc?page=vm)** 環境編譯您的容器映像檔,完成後即可刪除。
:::
:::warning
<i class="fa fa-lightbulb-o fa-20" aria-hidden="true"></i> **提示:**
因為容器映像檔系統多使用 Ubuntu,建議虛擬運算個體環境選用 CentOS,較好判斷環境是容器之內或是之外。
:::
#### Step 1. 在虛擬運算個體安裝 Singularity
安裝步驟截錄自官網文件,詳細步驟或其他版本之 Linux 用戶請查閱 Singularity 官網[最新文件](https://sylabs.io)。
- 虛擬運算個體為 **Ubuntu** 請使用以下指令安裝:
```bash
$ sudo wget -O- http://neuro.debian.net/lists/xenial.us-ca.full | sudo tee /etc/apt/sources.list.d/neurodebian.sources.list && \
sudo apt-key adv --recv-keys --keyserver hkp://pool.sks-keyservers.net:80 0xA5D32F012649A5A9 && \
sudo apt-get update && \
sudo apt-get install -y singularity-container
```
- 虛擬運算個體為 **CentOS** 請使用以下指令安裝:
```bash
$ sudo yum update -y && \
sudo yum install -y epel-release && \
sudo yum update -y && \
sudo yum install -y singularity
```
#### Step 2. 客製化 Singularity 容器
您可以利用撰寫 **Singularity Definition File** 選擇基礎的映像檔 (base image) 來源,並安裝所需的應用程式,建立您專屬的客製化容器。
以下參考 [Singularity Quick Start 範例](https://sylabs.io/guides/3.6/user-guide/quick_start.html#singularity-definition-files),說明如何撰寫 Definition file。 File 內容主要分為 **Header** 和 **Sections** 兩部分:
:::info
- **Header**:定義 base 映像檔的來源 (例:docker, library, yum...等)。
- **Sections**:有多種選項可設定,主要會使用以下 2 個項目:
- `%post`:建立容器後將執行的內容。
- `%environment`:容器建立好後,會將程式的環境變數會放到 /environment 內。
:::
以下示範建立 1 個 CUDA 10.1 映像檔,並編譯 [CUDA Samples](https://github.com/NVIDIA/cuda-samples) deviceQuery 的容器:
- 建立 Singularity definition file
```
$ vim <DEF_FILE_NAME>.def
```
- 修改為符合需求的客製化內容:
```bash
# 使用 docker nvidia/cuda:10.1-devel-ubuntu18.04 做為基礎映像檔
BootStrap: docker
From: nvcr.io/nvidia/cuda:10.1-devel-ubuntu18.04
Stage: devel
%post
# 初始化基礎映像檔的環境變數
. /.singularity.d/env/10-docker*.sh
%post
# 安裝 wget
apt-get update -y
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
wget
rm -rf /var/lib/apt/lists/*
%post
# 下載並編譯 cuda sample 的 deviceQuery 範例
cd /
mkdir -p /var/tmp && wget -q -nc --no-check-certificate -P /var/tmp https://github.com/NVIDIA/cuda-samples/archive/v10.1.tar.gz
mkdir -p /var/tmp && tar -x -f /var/tmp/v10.1.tar.gz -C /var/tmp -z
cd /var/tmp/cuda-samples-10.1/Samples/deviceQuery
make
mkdir -p /usr/local/cuda-samples-10.1/bin
cp deviceQuery /usr/local/cuda-samples-10.1/bin
rm -rf /var/tmp/cuda-samples-10.1 /var/tmp/v10.1.tar.gz
%environment
# 增設容器的環境變數
export PATH=/usr/local/cuda-samples-10.1/bin:$PATH
```
:::info
<i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:**
**Singularity definition file** 和 **Dockerfile** 撰寫語法不同但使用方式相似,使用者皆可透過此種文件執行指令安裝應用程式、建立客製化容器映像檔。
:::
- 執行 definition file 建立容器
```bash
$ sudo singularity build <CONTAINER_NAME>.sif <DEF_FILE_NAME>.def
```
:::warning
<i class="fa fa-lightbulb-o fa-20" aria-hidden="true"></i> **提示**:
推薦您使用 [<ins>HPC Container Maker</ins>](https://github.com/NVIDIA/hpc-container-maker) 撰寫 Singularity definition file ,如寫程式一樣維護方便。
:::
#### Step 3. 下載容器映像檔
請將您的容器映像檔下載至本機。
#### Step 4. 將容器映像檔上傳至高速檔案系統 (HFS)
參考[高速檔案系統](https://www.twcc.ai/doc?page=hfs),將容器映像檔透過資料傳輸節點 `xdata1.twcc.ai` 上傳至台灣杉二號 (命令列介面)的儲存空間,放在 `/home/$USER` 或 `/work/$USER` 目錄下使用。
## 運行容器
容器映像檔準備好後,即可於台灣杉二號 (命令列介面) 環境,運行容器內的指令並執行運算。
以下概略介紹 2 個 Singularity 基礎操作的指令,更多指令資訊請參考:[Singularity- Command Line Interface](https://sylabs.io/guides/3.6/user-guide/cli.html)。
**1. `shell` (Run a shell within a container)**
- 進入容器環境內並啟用 shell 環境,可查看容器內的檔案。
```bash
$ singularity shell --nv <CONTAINER_NAME>.sif
```
**2. `exec` (Run a command within a container)**
- 執行容器內的`cat`指令,例如執行以下指令,os-relase 會顯示容器 OS 為 ubuntu。
```bash
$ singularity exec --nv <CONTAINER_NAME>.sif cat /etc/os-release
```
:::info
<i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:**
- 運行 GPU 資源,指令皆需加上 `--nv`。
:::
## 進階操作
### 1. 建立沙盒容器
若需測試套件是否與容器環境相容時,您可以建立「**沙盒容器**」,既不影響原容器映像檔內容,也無需重建立容器,又可在容器內安裝或進行操作:
- 請先建立沙盒資料夾,放入容器映像檔的所有內容
```bash
$ sudo singularity build --sandbox <FOLDER_NAME> docker://nvidia/cuda:10.1-devel-ubuntu18.04
```
- 使用 `shell` 方式進入沙盒容器內,並具有寫入的權限。
```bash
$ sudo singularity shell --writable <FOLDER_NAME>/
```
- 即可利用 `apt` 使用以下指令更新並安裝套件
```bash
$ apt-get update
$ apt-get install wget
```
- 使用沙盒建立 Singularity 容器映像檔
:::info
<i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:**
由於沙盒未將套件寫入 definition file,您無法紀錄容器內有哪些套件,維護不易,較不推薦使用此方式建立容器映像檔。建議使用[<ins>客製化 Singularity 容器</ins>](#2-客製化-Singularity-容器)之方式。
:::
```bash
$ sudo singularity build <CONTAINER_NAME>.sif <FOLDER_NAME>/
```
### 2. 建立輕量化容器
為將容器最小化,並僅存放編譯好的執行檔、具相依性的 runtime library,您可以參考 [Singularity 官網範例](https://sylabs.io/guides/3.6/user-guide/definition_files.html#multi-stage-builds),使用 **「多階段建立容器 (Multi-Stage Builds)」** 功能,在同份 Singularity definition file 定義 2 階段以上的容器建立過程,將工作分階段進行。
以本文範例為例說明:
- 第 1 階段使用 `nvcc` 編譯,並產生 `deviceQuery` 執行檔
- 再將 deviceQuery 複製到第 2 階段 (**不含編譯所需的內容**),建立輕量化的容器映像檔
- 容器檔案大小從 1.4G 縮小至 664M
```bash
BootStrap: docker
From: nvcr.io/nvidia/cuda:10.1-devel-ubuntu18.04
Stage: devel
%post
# initialize base image environment
. /.singularity.d/env/10-docker*.sh
%post
# install wget
apt-get update -y
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
wget
rm -rf /var/lib/apt/lists/*
%post
# download and compile cuda sample deviceQuery
cd /
mkdir -p /var/tmp && wget -q -nc --no-check-certificate -P /var/tmp https://github.com/NVIDIA/cuda-samples/archive/v10.1.tar.gz
mkdir -p /var/tmp && tar -x -f /var/tmp/v10.1.tar.gz -C /var/tmp -z
cd /var/tmp/cuda-samples-10.1/Samples/deviceQuery
make
mkdir -p /usr/local/cuda-samples-10.1/bin
cp deviceQuery /usr/local/cuda-samples-10.1/bin
rm -rf /var/tmp/cuda-samples-10.1 /var/tmp/v10.1.tar.gz
%environment
export PATH=/usr/local/cuda-samples-10.1/bin:$PATH
BootStrap: docker
From: nvcr.io/nvidia/cuda:10.1-runtime-ubuntu18.04
%post
. /.singularity.d/env/10-docker*.sh
# copy precompiled cuda sample deviceQuery
# from develop stage
%files from devel
/usr/local/cuda-samples-10.1/bin /usr/local/cuda-samples-10.1/bin
%environment
export PATH=/usr/local/cuda-samples-10.1/bin:$PATH
```
<!-- ## 下個主題 <i class="fa fa-forward" aria-hidden="true"></i>
- 如何利用容器完成跨節點高速運算工作?:point_right: [使用容器跨節點高速運算-AI Benchmark]() -->