---
# System prepended metadata

title: 環境的建立
tags: [實驗室]

---

:::info

所需：Linux系統、Nvidia GPU
實驗室使用的系統為Ubuntu 20.04
教學是針對具有Nvidia GPU的電腦進行教學

1. 虛擬環境
2. CUDA&Pytorch

建立虛擬環境，較簡單可直接操作。
後者較為複雜，需與BBB影片一起服用。

教學影片時間軸(歡迎使用兩倍速觀看)：
00:00~09:00 基礎虛擬環境建設
09:00~17:00 CUDA不同版本安裝(大學部可跳過)
17:00~24:00 Pytorch安裝

:::
---
# 環境的建立

### WHY?
:::success
為什麼需要使用環境？
:::
*  不同專案內使用的套件不盡相同，而各個套件所須要的相依項也不一定相同。
*  如果將所有套件安裝在全域環境中，容易引發衝突和問題。
*  更好的控管專題內的套件，在團隊專案中會能夠更好的完成統一標準及環境部屬。


### WHICH?
:::success
選擇何種環境管理工具？
* Virtualenv: 簡單靈活，但不處理套件相依的管理。
* Conda: 支援跨語言相依行處理，但可能過於龐大。
* Poetry: 較新且功能強大，但學習曲線略陡。
* Pipenv: 集成套件相容和虛擬環境管理，但有時可能會遇到相容性解析問題。
:::
* 本章將使用pipenv完成環境的架設。
    * Pipenv 將套件管理集中在 Pipfile 和 Pipfile.lock 中，使專案套件的版本控制較容易。
    * Pipenv 可以自動解析套件的相依關係，並安裝/刪除相應的版本，減少手動安裝和配置的麻煩。

### WHAT?
:::success
什麼是Pipfile&Pipfile.lock？
:::
:::info
簡單而言就是將requirements.txt拆分成兩個部份
* Pipfile 主要用來描述你的專案套件及其版本範圍
    * 允許指定版本範圍，而不是僅僅固定版本，提供了更多的靈活性。
* Pipfile.lock 用來記錄 Pipfile 中指定的套件的確切版本hashes。
    * 這樣可以確保所有環境中的套件版本一致，並保護套件不被修改。
    * 且隨著每次套件安裝或更新而自動更新，確保每次安裝的一致性。

:::
#### 內容
* Pipfile:
[packages]：指定的套件。
[dev-packages]：指定開發時需要的套件，例如測試框架或工具。
[sources]：指定套件的來源。
[requires]：指定 Python 的版本要求。
* Pipfile.lock:
default：列出 Pipfile 中 packages 部分的套件及其具體版本。
develop：列出 Pipfile 中 dev-packages 部分的套件及其具體版本。
hashes：包含每個相依套件的雜湊值，用來驗證下載的套件是否被篡改。
### HOW?
:::success
如何使用Pipenv?
:::
:::danger
注意：不同資料夾不同專案，請不要混用
:::
1. 安裝pipenv
```bash=
pip3 install pipenv
```
2. 環境建立
```bash=
cd Desktop/project_tmp
pipenv install 
# 使用預設的python版本創建虛擬環境

# pipenv install --python <version>
# 創建指定 Python 版本的虛擬環境 "版本問題提醒"
# 例如 pipenv install --python 3.8 會使用 Python 3.8 建立虛擬環境。
```    
>先進入專案中的資料夾，再進行環境的建立。
>建立一個新的虛擬環境並安裝 Pipfile 中指定的所有套件。
>如果沒有 Pipfile，則會自動生成一個新的 Pipfile。
3. 進入環境
```bash=
pipenv shell
# 啟動專案的虛擬環境，進入該虛擬環境的 shell 中。
```
* 進入環境後前面會有你資料夾名稱，也是該環境的名稱
![image](https://hackmd.io/_uploads/rJKFKmET0.png)

4. 安裝套件
```bash=
pipenv install package_name
# pipenv install -r requirements.txt
# 利用requirements.txt 安裝
``` 
>安裝你所需的套件，並將其加入到 Pipfile 中。如果沒指定版本，會安裝最新的版本。
5. 使用環境
![image](https://hackmd.io/_uploads/SyVOq7VTC.png)

>在核心選擇中，選擇剛剛建立的虛擬環境核心，並開始使用
>名字會與剛剛建立相同

6. 離開環境
```bash=
exit
# 退出虛擬環境的 shell。
```
7. 刪除環境
```bash=
pipenv --rm
# 刪除環境
```
### CMD
* 此部份為其餘較常用到的指令
##### 查看和更新套件
```bash=
pipenv graph
# 查看目前安裝的套件及其相依樹，以圖形的方式顯示套件之間的關係。

pipenv update
# 更新所有套件到 Pipfile 中指定的最新可用版本，並同步更新 Pipfile.lock。

pipenv update <package>
# 更新指定的套件到最新版本，並同步更新 Pipfile.lock。

pipenv lock
# 鎖定 Pipfile 中的套件版本並生成 Pipfile.lock，確保其他環境中可以安裝相同版本的套件。
```
##### 檢查與清理
```bash=
pipenv check
# 透過檢查已安裝的套件是否有安全漏洞，來確保專案的安全性。

pipenv clean
# 清除所有已安裝但不再被 Pipfile 需要的套件。
```
##### 移除與同步
```bash=
pipenv uninstall <package>
# 移除指定的套件，並同步更新 Pipfile 和 Pipfile.lock。

pipenv sync
# 根據 Pipfile.lock 中的鎖定套件，將當前環境同步，確保套件版本一致。
```
##### 環境外運行
```bash=
pipenv run <command>
# 在虛擬環境內運行指定的指令，無需進入 shell，例如 pipenv run python app.py。

```

---
# GPU的使用
### INFO
:::warning
* Pytorch是建立在CUDA上的，所以會有版本相容性問題
* 這邊的安裝CUDA，是示範如果需更換CUDA版本(可跳過)
* 這邊使用[CUDA 11.8](https://developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Linux)做更換版本說明。
* [Pytorch官網](https://pytorch.org) 
:::
### FLOW
:::success
### 確認CUDA版本 -> 選擇Pytorch版本
* nvcc -V 查看CUDA版本
![image](https://hackmd.io/_uploads/S1k2BlNpC.png)
* 用以確認Pytorch版本，更早之前的版本[在這裡](https://pytorch.org/get-started/previous-versions/)
 ![image](https://hackmd.io/_uploads/Bk6dZQ4p0.png)


:::
---

### CUDA
* 此部份為變更CUDA的安裝&路徑更改(可跳過)
#### CUDA安裝
>避免覆蓋掉原本CUDA請選擇runfile，並根據官網下面的步驟安裝。
>![image](https://hackmd.io/_uploads/rk1woyV6R.png)
>
```bash=
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
chmod +x cuda_11.8.0_520.61.05_linux.run
# ls -l 如果沒有x，需幫他加上可執行的權限
sudo sh cuda_11.8.0_520.61.05_linux.run
```
#### 修改PATH&重新連接


```bash=
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# 修改PATH

sudo rm /usr/local/cuda
sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda
# 重新軟連結cuda
```
#### 完成後確認版本
```bash=
nvcc --version
# 重新確認版本
```
---
### Pytorch
* 無法透過pipenv install pytorch 直接安裝
* 較建議透過Solution 2 解決


#### Solution 1 
* 透過 pipenv run pip 進行安裝，但Pipfile不會更新
* 不需要更新Pipfile，速度較快
```bash=
pipenv run pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
```
#### Solution 2 
* 修改Pipfile內的source與packages，再使用pipenv install進行安裝。
* 在[先前版本](https://pytorch.org/get-started/previous-versions/)中確認torch,torchvision,torchaudio版本，並修改到[packages]中對應位置。
![image](https://hackmd.io/_uploads/SkM0ZbV6C.png)

* 下圖為需手動新增到Pipfile的部份
```
[[source]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cu118"
verify_ssl = true

[packages]
torch = {index = "pytorch", version = "==2.4.0"}
torchvision = {index = "pytorch", version = "==0.19.0"}
torchaudio = {index = "pytorch", version = "==2.4.0"}
```
* 修改完並安裝
```bash=
pipenv install
# 會依照Pipfile下載相依項
```
* 使用graph檢查
```bash=
pipenv graph
# 檢查是否有正確安裝
```
### TEST
* 使用以下程式確認是否能連接並使用GPU
```python=
import torch

if torch.cuda.is_available():
    print(f"CUDA version: {torch.version.cuda}")
    print(f"cuDNN version: {torch.backends.cudnn.version()}")
    print(f"Number of GPUs: {torch.cuda.device_count()}")
else:
    print("CUDA is not available.")

```
