# 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! ```