# Miniconda 建立自己的使用環境
[TOC]
:::success
:warning: 執行環境須與編譯安裝的環境設定一致,勿混用!!!
使用conda安裝者,請以conda環境執行。
:::
## 1. 建立自己的環境
``` console
[user@cbi-lgn01 ~]$ ml purge
[user@cbi-lgn01 ~]$ ml list
No modules loaded
[user@cbi-lgn01 ~]$ ml load miniconda3
(base) [user@cbi-lgn01 ~]$ ml list # 自動切換成 base
Currently Loaded Modules:
1) miniconda3/24.11.1
# 建立新的環境,自訂你的環境要叫什麼名字,依據你想要的Python版本安裝
(base) [user@cbi-lgn01 ~]$ conda create -n pytorch-cuda python=3.12
Channels:
- defaults
Platform: linux-64
Collecting package metadata (repodata.json): done
Solving environment: done
(... stuff deleted ...)
Proceed ([y]/n)? y
Downloading and Extracting Packages:
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
# $ conda activate pytorch-cuda
#
# To deactivate an active environment, use
#
# $ conda deactivate
```
如果您想列出所有已經建立的 conda 環境,可以執行以下命令
``` console
(base) [user@cbi-lgn01 ~]$ conda env list
# conda environments:
#
pytorch-cuda /home/user/.conda/envs/pytorch-cuda
base * /work/HPC_software/LMOD/miniconda3/miniconda3_app/24.11.1
```
如果您想啟動在此之前所建立的 `pytorch-cuda` 的環境,可以執行以下命令
``` console
(base) [user@cbi-lgn01 ~]$ conda activate pytorch-cuda
(pytorch-cuda) [user@cbi-lgn01 ~]$
```
或是關閉目前所啟動的環境,可以執行以下命令
``` console
(pytorch-cuda) [user@cbi-lgn01 ~]$ conda deactivate
(base) [user@cbi-lgn01 ~]$
```
抑或是完全的離開 base 虛擬環境,請再執行以下命令
``` console
(base) [user@cbi-lgn01 ~]$ conda deactivate
[user@cbi-lgn01 ~]$ ml list
Currently Loaded Modules:
1) miniconda3/24.11.1
[user@cbi-lgn01 ~]$ ml purge # 卸載所有 module,完完全全的離開 miniconda,
```
## 2. 安裝 tools 在你自己的 PyTorch-CUDA 環境中
啟動 `pytorch-cuda` 環境
``` console
[user@cbi-lgn01 ~]$ ml load miniconda3
(base) [user@cbi-lgn01 ~]$ conda activate pytorch-cuda
```
因為 conda solver 太「聰明」,會幫您安裝了一組「實際上不能用」的組合,所以要先強制要求 conda 降級所安裝的 Intel OpenMP / MKL,接著才能這在這環境中安裝您的 PyTorch。
``` console
(pytorch-cuda) [user@cbi-lgn01 ~]$ conda install -c defaults "intel-openmp<2024" "mkl<2024"
Channels:
- defaults
Platform: linux-64
Collecting package metadata (repodata.json): done
Solving environment: done
(... stuff deleted ...)
Proceed ([y]/n)? y
Downloading and Extracting Packages:
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(pytorch-cuda) [user@cbi-lgn01 ~]$ conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
Channels:
- pytorch
- nvidia
- defaults
Platform: linux-64
Collecting package metadata (repodata.json): done
Solving environment: done
(... stuff deleted ...)
Proceed ([y]/n)? y
Downloading and Extracting Packages:
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(pytorch-cuda) [user@cbi-lgn01 ~]$
```
<!--
:::info
指令介紹:
`$ conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia`
使用 conda 安裝 PyTorch、torchvision 和 torchaudio,並指定使用支援 CUDA 12.1的版本。套件會從 pytorch 和 nvidia 這兩個 conda channel 下載,以確保安裝官方和 NVIDIA 優化的版本。
conda install: 這是 conda 的指令,用於安裝套件。
pytorch: 這是要安裝的主要套件,也就是 PyTorch 深度學習框架本身。
torchvision: 這是 PyTorch 的一個擴展庫,專門用於處理圖像和影片資料。它包含常用的資料集、模型架構和圖像轉換工具。
torchaudio: 這是另一個 PyTorch 的擴展庫,用於處理音訊資料。它提供音訊處理和轉換的功能。
pytorch-cuda=12.1: 這個部分指定要安裝的 PyTorch 版本需要支援 CUDA 12.1。CUDA 是 NVIDIA 的平行運算平台和程式設計模型,用於在 NVIDIA 的 GPU 上執行運算。這個選項確保安裝的 PyTorch 版本能夠利用你的 NVIDIA GPU 加速運算。如果你的系統沒有 NVIDIA GPU 或 CUDA 環境未設定,則會安裝 CPU 版本的 PyTorch。
-c pytorch: 這個選項指定要從 pytorch 這個 conda channel 搜尋和下載套件。conda channel 是一個存放套件的倉庫。pytorch channel 包含了由 PyTorch 團隊維護的官方套件。
-c nvidia: 這個選項指定要從 nvidia 這個 conda channel 搜尋和下載套件。nvidia channel 包含了 NVIDIA 優化的套件,通常包含針對 NVIDIA 硬體的效能優化。對於 CUDA 相關的套件,從這個 channel 安裝可以確保最佳效能。
:::
-->
## 3. 產生測試程式
附註:請直接將 `cat <<-EOF >pytorch_cuda_example.py` 一直到包含 `EOF` 的所有內容複製,並直接在命令列貼上,就會產生測試程式 `pytorch_cuda_example.py`
``` console
(pytorch-cuda) [user@cbi-lgn01 pytorch_cuda]$ cat <<-EOF >pytorch_cuda_example.py
import torch
# 檢查 CUDA 是否可用
if torch.cuda.is_available():
device = torch.device("cuda") # 使用 GPU
print(f"使用裝置:{torch.cuda.get_device_name(0)}") # 顯示使用的 GPU 名稱
else:
device = torch.device("cpu") # 使用 CPU
print("CUDA 不可用,使用 CPU。")
# 定義一個簡單的模型
class SimpleModel(torch.nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.linear = torch.nn.Linear(10, 1)
def forward(self, x):
return self.linear(x)
# 創建模型實例並移動到指定裝置 (GPU 或 CPU)
model = SimpleModel().to(device)
# 創建一些隨機資料並移動到指定裝置
input_data = torch.randn(32, 10).to(device) # 32 筆資料,每筆 10 個特徵
target_data = torch.randn(32, 1).to(device)
# 定義損失函數和優化器
criterion = torch.nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 訓練迴圈
num_epochs = 100
for epoch in range(num_epochs):
# 前向傳播
outputs = model(input_data)
loss = criterion(outputs, target_data)
# 反向傳播和優化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
print("Finished!")
EOF
```
## 4. 產生測試 script
附註:請直接將 `cat <<-EOF >pytorch_cuda_example.sh` 一直到包含 `EOF` 的所有內容複製,並直接在命令列貼上,就會產生測試程式 `pytorch_cuda_example.sh`
``` console
(pytorch-test) [user@cbi-lgn01 pytorch_cuda]$ cat <<-EOF >pytorch_cuda_example.sh
#!/bin/bash
#SBATCH --job-name=pytorch_cuda_job # 工作名稱
#SBATCH --partition=dev # 使用的 partition (請根據你的系統修改)
#SBATCH --time=00:30:00 # 執行時間上限 (小時:分鐘:秒)
#SBATCH --account=GOV113080 ####### 請記得換成您的計畫代碼 #######
#SBATCH --nodes=1 # (-N) Maximum number of nodes to be allocated
#SBATCH --gpus-per-node=2 # Gpus per node
#SBATCH --cpus-per-task=4 # (-c) Number of cores per MPI task
#SBATCH --ntasks-per-node=4 # Maximum number of tasks on each node
#SBATCH -o pytorch_cuda_example_%j.log # output file (%j expands to jobId)
#SBATCH -e pytorch_cuda_example_%j.err # output file (%j expands to jobId)
ml load miniconda3/24.11.1
CONDA_DEFAULT_ENV="pytorch-cuda" # 你的 conda 環境名稱
conda run -n "$CONDA_DEFAULT_ENV" python pytorch_cuda_example.py
EOF
```
<!---
#原本的程式碼和WARNING
CONDA_PREFIX="/work/HPC_software/LMOD/miniconda3/miniconda3_app/24.11.1" # conda 的安裝路徑
CONDA_DEFAULT_ENV="pytorch-cuda" # 你的 conda 環境名稱
$CONDA_PREFIX/bin/conda run -n "$CONDA_DEFAULT_ENV" python pytorch_cuda_example.py
:::warning
:warning:常見的錯誤訊息:
`/opt/ohpc/admin/lmod/lmod/init/bash: line 125: conda: command not found
`
`CondaError: Run 'conda init' before 'conda activate'`
`ModuleNotFoundError: No module named 'torch' `
問題根源:sbatch 的執行環境
當你使用 sbatch 提交 job 時,Slurm 會在一個全新的、乾淨的環境中執行你的腳本。這個環境 不會 自動繼承你目前 shell 的任何設定,包括環境變數、模組載入以及 conda 的初始化狀態。這就是為什麼即使你在互動式 shell 中已經 conda activate 了環境,sbatch 執行的腳本仍然找不到 conda 命令,也找不到 torch 模組。
解決方案:在 sbatch 腳本中完整設定conda環境,而不是依賴外部環境。
```
Bash
#!/bin/bash
#SBATCH ... 其他 SBATCH 選項 ...
CONDA_PREFIX="/opt/ohpc/pub/utils/miniconda3/24.11.1" # conda 的安裝路徑
CONDA_DEFAULT_ENV="pytorch-cuda" # 你的 conda 環境名稱
$CONDA_PREFIX/bin/conda run -n "$CONDA_DEFAULT_ENV" python pytorch_cuda_example.py
```
:label:這個方法的好處是:
不再使用 module load: 我們不再依賴模組系統來設定 conda 環境。
使用 conda 的絕對路徑: 我們直接使用 conda 可執行檔的完整路徑來執行 conda activate 和 python。
避免環境變數衝突: conda run 會建立一個乾淨的環境,可以有效避免大部分環境問題與 job 環境的變數衝突。
更簡潔易懂: 腳本更簡潔,更容易維護。
:label:請務必將程式碼中的路徑修程改本系統中的路徑 /opt/ohpc/pub/utils/miniconda3/24.11.1 。若有修改環境名稱請替換成你的環境名稱。
:::
-->
## 5. 提交 Slurm 執行
``` console
(pytorch-test) [user@cbi-lgn01 pytorch_cuda]$ sbatch pytorch_cuda_example.sh
Submitted batch job 10640
```
## 6. 檢查執行結果
``` console
(pytorch-test) [user@cbi-lgn01 pytorch_cuda]$ ls -al
-rw-r--r-- 1 user TRI1123529 0 Jan 22 10:12 pytorch_cuda_example_job_10640.err
-rw-r--r-- 1 user TRI1123529 345 Jan 22 10:12 pytorch_cuda_example_job_10640.log
(pytorch-test) [user@cbi-lgn01 pytorch_cuda]$ cat pytorch_cuda_example_job_10640.log
使用裝置:NVIDIA H100 80GB HBM3
Epoch [10/100], Loss: 1.2595
Epoch [20/100], Loss: 1.2277
Epoch [30/100], Loss: 1.1992
Epoch [40/100], Loss: 1.1734
Epoch [50/100], Loss: 1.1499
Epoch [60/100], Loss: 1.1283
Epoch [70/100], Loss: 1.1087
Epoch [80/100], Loss: 1.0909
Epoch [90/100], Loss: 1.0747
Epoch [100/100], Loss: 1.0600
Finished!
```