---
tags: HowTo, conda, tutorial, TWCC
title: HowTo:使用 Conda 管理套件與執行 Job | zh
GA: UA-155999456-1
---
{%hackmd @docsharedstyle/default %}
{%hackmd @docsharedstyle/twccheader-zh %}
# HowTo:使用 Conda 管理套件與執行 Job
:::success
<i class="fa fa-star" aria-hidden="true"></i> **適用情境:如何在台灣杉二號 (命令列介面) 安裝套件?如何切換 Python 環境?**
*您是否也有相同的困擾?讓我們手把手帶您組合 TWCC 雲端服務架構,輕鬆解決您的問題!*
:::
本文是關於 TWCC 台灣杉二號 (命令列介面) 安裝的套件管理工具 [Miniconda](https://docs.conda.io/en/latest/miniconda.html) 說明,以及教學如何使用 Conda 創立虛擬環境,安裝套件,並提交 Job。
## Minoconda 簡介
Miniconda 為 Python 環境管理平台,囊括多種 Python 套件,並使用 Conda 作為軟體套件管理器。
使用 Miniconda 可省去一一下載 Python 套件的麻煩,使用簡單的 Conda 指令即可將套件安裝完成,並能切換至指定的虛擬環境,使用不同版本的 Python,解決多版本的相容問題。
## 更新規劃說明
由於套件管理工具 Conda [修正 bugs 頻繁](https://docs.conda.io/projects/conda/en/latest/release-notes.html),近期修正皆已大幅提升使用體驗。
為了加速讓 TWCC 用戶使用新版工具,經多方測試後,TWCC 將會持續更新 Miniconda (Conda 最小化版本),並已移除 Anaconda。
:::info
<i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** 用戶仍可自行安裝 Anaconda 在自己的 `/home/$USER` 或`/work/$USER` 目錄之下)。
:::
## 重新設計 modulefile
一般使用 Aanaconda / Miniconda 皆會使用 `conda init` 設定環境,此時 Conda 將會更動使用者的 `~/.bashrc` 新增如下面內容。
```bash
# >>> conda initialize >>>
...
...
# <<< conda initialize <<<
```
對於初接觸 Linux 系統或 Conda 的用戶,並非友善之設計。當不再使用 Conda 時,有可能因忘記移除在 `~/.bashrc` 的 Conda 參數,造成 Conda 環境影響其他操作。
因此,TWCC 將透過重新撰寫新版 modulefile 的方式,使用 `module load miniconda2` 或 `module load miniconda3` 時,將會自動啟動上述參數;當 `module purge` 時,則將會自動移除這些環境變數。如此一來,可避免讓 Conda 更動用戶的`~/.bashrc`,也能正確使用 Conda,還給使用者單純的環境。
## 如何使用 Miniconda ?
- 透過 `module load miniconda2` / `module load miniconda3` 載入 conda 環境。
- 透過 `module purge` 即可卸載 conda 環境。
- 由於[上述原因](#重新設計-modulefile),使用前**建議移除**之前使用 Conda 產生的 conda initialize 內容 (移除指令 `conda init --reverse` )。
:::info
<i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:**
- miniconda2:預設使用 Python 2 環境
- miniconda3:預設使用 Python 3 環境
:::
請參考以下操作範例。
## Conda 操作範例
以下範例將在使用 Conda 創立一個虛擬環境,並安裝支援 GPU 運算的 TensorFlow,再透過 Slurm 資源調度管理系統,撰寫 job script 依需求索取資源、Queue 排程,並提交計算工作。
:::info
<i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** 參考資料
- [<ins>Anaconda:TensorFlow</ins>](https://docs.anaconda.com/anaconda/user-guide/tasks/tensorflow/)
- [<ins>Conda:Managing environments</ins>](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html)
:::
### Step 1. 載入 Conda 並建立虛擬環境
```bash
# 清除 module 確保環境乾淨
$ module purge
# 載入 Conda 環境,以預設 python3 的 miniconda3 為範例
$ module load miniconda3
# 由於 TWCC 設計的 miniconda module,會自動初始化環境變數,不需要再 conda init。
# 建議移除之前 conda init 產生的內容
$ conda init --reverse
# 創立 Conda 虛擬環境 (範例名稱為 mytf_gpu),並安裝 Anaconda 公司已打包好的 tensorflow-gpu。
# 該環境已經包含 CUDA 和 cuDNN,無須再自行安裝
$ conda create --name mytf_gpu tensorflow-gpu
# 進入此虛擬環境
$ conda activate mytf_gpu
```
:::info
<i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:**
tensorflow-gpu,目前預設安裝 2.2 版。
- 可指定安裝版本 1 或 2,例如 1.15.0 版本的 tensorflow-gpu 則使用
`conda create --name mytf_gpu tensorflow-gpu=1.15.0`
- 其他版本可以參考 [<ins>版本列表</ins>](https://anaconda.org/anaconda/tensorflow-gpu/files)。
:::
#### 離開以及刪除虛擬環境
```bash
# 離開 mytf_gpu 虛擬環境
$ conda deactivate
# 刪除 mytf_gpu 虛擬環境檔案
$ conda remove --name mytf_gpu --all
```
#### 離開 Conda
```bash
# 卸載所有已載入的 module
$ module purge
```
```bash
# 或者,僅卸載 miniconda
$ module unload miniconda3
```
#### 刪除 Conda 殘留檔案
```bash
# 當不再使用 Conda,刪除殘留 Conda 安裝檔/設定檔 (請小心使用,請確定此路徑無需要檔案再使用)
# 先檢查此路徑檔案內容 (通常只有 ~/.conda)
$ ls ~/.condarc ~/.conda ~/.continuum
# 再刪除檔案
$ rm -rf ~/.condarc ~/.conda ~/.continuum
```
### Step 2. Slurm job script with Conda
當您準備好 Conda 環境與計算程式後,請按照以下步驟,透過 Slurm 資源調度管理系統,撰寫 job script 依需求索取資源、Queue 排程,並提交計算工作。
`.sh` 檔案為 Slurm 將提交運算的 Job script,內容分為「**兩大部分**」:
1. **Job、計畫、資源資訊**:job 名稱、節點數量、每節點運行的任務數、每節點的 GPU 數量、job 最長的運行時間、計畫 ID、Queue 名稱。
3. **Job 執行的內容**
撰寫以下內容,並使用上述步驟創立的 `mytf_gpu` 虛擬環境。
執行以下編輯指令 > 按下<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 2 with 1 node / 8GPUs
```bash
#!/bin/bash
#SBATCH --job-name=Hello_TWCC ## job name
#SBATCH --nodes=1 ## 索取 1 節點
#SBATCH --cpus-per-task=32 ## 該 task 索取 32 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天)、p4d(最長跑4天)
module purge
module load miniconda3
conda activate mytf_gpu
# 大部分使用 conda 用戶,程式並沒有透過 MPI 溝通
# 應不需要再添加 srun/mpirun,直接加上需要運行的指令即可
python $(your command)
```
:::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,會自動配置 4 CPU cores、90 GB Memory
索取 8 GPU,會自動配置 32 CPU cores、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)。
:::
#### 提交 Job
```bash
$ sbatch <FILE_NAME>.sh
```
:::info
<i class="fa fa-paperclip fa-20" aria-hidden="true"></i> **附註:** 提交完成後,將顯示系統派發的 Job ID。
:::
#### 查看和取消
- 開始計算後,可使用以下指令查看 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>
```