# Miniconda 建立自己的使用環境
[TOC]
:::success
:warning: 執行環境須與編譯安裝的環境設定一致,勿混用!!!
使用conda安裝者,請以conda環境執行。
:::
## 1.建立自己的環境
```
[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
#create新的環境,自訂你的環境要叫什麼名字,依據你想要的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
...
Proceed ([y]/n)? y # 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
(base) [user@cbi-lgn01 ~]$ conda env list # 列出所有你已經建立的 conda 環境
# conda environments:
#
pytorch-cuda /home/user/.conda/envs/pytorch-cuda
base * /opt/ohpc/pub/utils/miniconda3/24.11.1
#啟動特定的環境
(base) [user@cbi-lgn01 ~]$ conda activate pytorch-cuda
(pytorch-cuda) [user@cbi-lgn01 ~]$
#關閉目前啟動的環境
(pytorch-cuda) [user@cbi-lgn01 ~]$ conda deactivate
(base) [user@cbi-lgn01 ~]$
```
```
#離開base虛擬環境
(base) [user@cbi-lgn01 ~]$ conda deactivate
[user@cbi-lgn01 ~]$ ml list
Currently Loaded Modules:
1) miniconda3/24.11.1
# 離開miniconda,卸載所有已載入的 module
[user@cbi-lgn01 ~]$ ml purge
[user@cbi-lgn01 ~]$
```
## 2.安裝 tools 在你自己的 PyTorch-CUDA 環境中
```
#啟動特定的環境,在此環境中安裝你需要的tools
(base) [user@cbi-lgn01 ~]$ conda activate pytorch-cuda
(pytorch-cuda) [user@cbi-lgn01 ~]$
#本主機的 cuda 版本建議安裝12.1
(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
## Package Plan ##
environment location: /home/user/.conda/envs/pytorch-test
added / updated specs:
- pytorch
- pytorch-cuda=12.1
- torchaudio
- torchvision
Proceed ([y]/n)? y # y
Downloading and Extracting Packages:
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(pytorch-cuda) [user@cbi-lgn01 ~]$
#若重複安裝tools,顯示會如下:
(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
\# All requested packages already installed.
```
:::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.撰寫.py程式碼
`(pytorch-cuda) [user@cbi-lgn01 pytorch_cuda]$ vi 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!")
```
## 4.script腳本撰寫
`(pytorch-test) [user@cbi-lgn01 pytorch_cuda]$ vi 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)
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
```
:::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 job腳本
```
(pytorch-test) [user@cbi-lgn01 pytorch_cuda]$ sbatch pytorch_cuda_example.sh
Submitted batch job 10640
```
## 6.查看執行輸出的結果
```
(pytorch-test) [user@cbi-lgn01 pytorch_cuda]$ ll
-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.9870
Epoch [20/100], Loss: 1.9133
Epoch [30/100], Loss: 1.8439
Epoch [40/100], Loss: 1.7786
Epoch [50/100], Loss: 1.7172
Epoch [60/100], Loss: 1.6591
Epoch [70/100], Loss: 1.6043
Epoch [80/100], Loss: 1.5525
Epoch [90/100], Loss: 1.5036
Epoch [100/100], Loss: 1.4572
Finished!
```