> [name=FU-YEN, GUAN-HONG]
> [time=Wed, Jul 24, 2024 4:09 PM]
>
>
>:school:<font size="2">:Department of Electrical Engineering ,National Yunlin University of Science and Technolog</font><br>
> [color=#8241a8]
>
# 基於Ubuntu安裝nvidia cuda&cuDNN在Anaconda虛擬環境下使用VScode編譯Python
## 首先本文使用Ubuntu 22.04 可能可以使用24.04版
>>https://releases.ubuntu.com/jammy/

一開始依據官方流程製作開機,目前官方有給出了兩種方式
一是在winodws使用Rufus將img燒入USB
https://ubuntu.com/tutorials/create-a-usb-stick-on-ubuntu#1-overview

另一種是本文使用的[balenaEtcher](https:/https://etcher.balena.io//)
兩者都是官方提供,可以自由選擇建置開機碟
https://ubuntu.com/tutorials/install-ubuntu-desktop#1-overview

製作好開機碟後接上電腦進入BIOS將開機USB flash優先順序或是優先權調成第一個
重新開機進入開始安裝步驟,由於網路上許多分享安裝流程此處不再贅述。
<font color="#FF0000">建議在安裝系統時就可以先連線網路</font>
# 系統基本設定
安裝完成後會進入到桌面,照理說桌面會只有一個Home
此時我們只裝好了最"<font color="#FF0000">基本</font>"的作業系統(OS)
要有個概念如果以前上課有用過任何的指令,如make,python,gcc
或是某些tools:dpkg,vcs,vim,gedit更多諸如此類的狀況。
不會是現在安裝完作業系統就應該要可以用的
因此我們要開始安裝本次目標需求的套件
本次目標是使用極為常見的IDE由微軟發行的VScode來作為編譯
如果有自己習慣的IDE也可以自行找尋安裝,假設"只是"要做python
編譯的話其實可以使用Pycharm。
## 硬碟切割
Ubuntu 22.04 提供UI界面讓我們自行分割想要的大小,想使用指令分割的可以參考這篇文章
>Reference:https://hackmd.io/@jimmy801/linux_mount[color=#e85fd5]
本次目標切割/dev/nvme1n1p1

Computer是在系統安裝選擇的主要碟,他在你安裝時就可以分割了,也可以等等經磁碟UI工具切割
| 自行設定磁碟標籤| 可用大小/總共大小 | 被系統自動掛載的名稱 |
| -------- | -------- | -------- |
| 系統碟 | 1.6/2.0 | root |
| 切割時系統需求生成表頭 | ??? | /dev/nvme1n1p1 |
| 實際切割出來大小 | 1.6/2.0 | /dev/nvme1n1p2 |
| HDD | 2.0/2.0 | /dev/sda1 |
當你將目標硬碟裝入主機板的插槽時,在22.04或24.04版應該會自動掛載,以前的不清楚,<font color="#FF0000">如果沒有出現就依照上面前人的方式指令切割並掛載</font>。
進入要切割的硬碟空白處右鍵點擊properties

Open in Disks

Volumes下面的圖是目前整個硬碟的分割使用狀況

左邊會顯示你目前的儲存裝置名稱,點擊你要切割的位置,在點擊齒輪

Edit Partition可以編輯這塊的標籤Name輸入你想要的區塊名稱,到時候切出來這塊就會是這個名子,常見的就是sda1、sda2、sdb1這類。

Edit Filesystems這個就是你可以自訂名稱,字面上的意思。

Resize可以改變磁碟區的大小,也就是容量的大小,通常是先format後再做,不過現在的作業系統也可以將切割後的在壓縮出空間來配置

設置好空間後點擊進去SSD空間內建立新資料夾在刪除,如果可以上都做完就表示恭喜成功掛載了。
# 系統更新
## linux套件管理
在ubuntu系統內經常使用套件,所以我們會使用apt指令下載
乾淨的作業系統必須更新套件下載軟體

更新到系統支援的最新版你後面要下載的資源才會被找到
## 基本套件安裝
安裝文件編輯軟體
sudo apt-get install vim
sudo apt-get install gedit
CPU監控軟體
sudo apt-get install htop
# 安裝虛擬環境以及IDE編輯器
## 安裝Anaconda虛擬環境
Anaconda 是一套可以在作業系統內建立虛擬環境的程式
首先在官網下載安裝檔

右側輸入信箱後Submit進入下載頁面

按下Download Now開始下載

### 開始安裝Anaconda
sh Anaconda3-2024.06-1-Linux-x86_64.sh

按下Enter

一直Enter到底

輸入yes

這邊可以更換安裝的位置,輸入Enter直接預設

這邊輸入yes,可以在ubuntu系統的~/.bashrc自動初始虛擬環境的path(建議使用)

以上都完成開啟terminal,左側出現base就是完成了設定,假使沒有出現的話輸入reboot重開機,再試一次看看。

### 虛擬環境建立
conda create \--name test python==3.9
conda create \--name \[虛擬環境名稱] python==\[版本號] 沒輸入號碼自動安裝目前系統支援之最新版
下完指令之後會詢問要不要建立環境,輸入y


conda env list
這個指令可以看到目前系統中建立的全部虛擬環境,有\*的是目前使用中的

conda remove -n test --all
conda remove -n ENV_NAME --all
刪除所有環境安裝過的任何套件包(這個刪除法會刪除conda也安裝過的套件)

conda env remove -n test
移除後可以下指令檢查剩下的環境(只刪除虛擬環境)
conda env list test


完成後輸入
conda activate test

恭喜,左側出現建立的虛擬環境名稱就是成功安裝了
接著更新pip套件包
pip install -U pip

pip install -U setuptools
更新解包程式的套件

這樣就完成整個環境的基本建立了
## 安裝VScode IDE
到VScode 網站下載.deb檔案包

$ sudo dpkg -i [檔案名稱.deb]
sudo dpkg -i code_1.91.1-1720564633_amd64.deb

按下左上角的Activaties->搜尋VScode點擊執行
可以在左側欄右鍵VS釘選在左側欄

`` Ctrl+` ``可叫terminal ,如果虛擬環境安裝正確,可以看到跟ubuntu的terminal一樣左側有目前環境狀態。

到這邊為止已經安裝好作業系統、虛擬環境以及編譯器了
> Reference:https://www.arthurtoday.com/2009/12/ubuntu-deb.html
# Nvidia 加速套件完整安裝
由於不知道當看到這篇文章的人前面是不是有做了安裝並且失敗了,或是從頭到尾開始安裝的,因為成功的也不會來翻這篇文章,所以依照網路上的方式將所有安裝的東西移除,注意此引用方式可能不一定移除乾淨,請多找幾篇多移除一些,因為接下來的安裝可能會被殘留的檔案卡住,導致無法安裝或使的系統更多殘留。
```
dpkg -l | grep -i nvidia
sudo apt-get remove --purge nvidia*
sudo apt-get remove --purge cuda*
sudo apt-get remove --purge libnccl*
sudo apt-get remove --purge libnvidia*
sudo apt remove --purge libcudnn*
sudo apt-get autoremove nvidia*
```
>Reference:https://gist.github.com/jbohnslav/1867e9e3b78a192e4ebc3654929e2aa5
> [color=#8241a8]
## nvidia toolkit 安裝
gcc降版本 因為22.04不支援gcc7的版本因此需要降版本,
cd到/usr/bin下,使用指令:
```
ls /usr/bin/gcc*
ls /usr/bin/g++*
```
會列出所有的gcc與g++的版本,如果沒有需要的版本手動安裝,例如gcc8
```
sudo apt install gcc-12 g++-8
```
然後就是切換,首先將gcc12與g++12添加入alternatives
```
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 100
```
OK,现在就是gcc,g++都是8了,如果gcc7和gcc8都是100的优先级时,我们可以使用下面命令選擇版本
```
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
```
接著添加apt sudo vim /etc/apt/sources.list
在最後面添加
```
#stable add by , in order to install g++7
deb [arch=amd64] http://archive.ubuntu.com/ubuntu focal main universe
```
更新apt
```
sudo apt update
```
最後重新安裝gcc7 gcc++
```
sudo apt install gcc-7 g++-7
```
查看gcc版本
```
gcc -v
```
### Install NVIDIA drivers
先更新系統套件安裝包
sudo apt update && sudo apt upgrade
移除先前安裝過或安裝失敗的殘留檔<font color="#FF0000">(重要)</font>
sudo apt autoremove nvidia* \--purge
### 查看Ubuntu支援的drivers
ubuntu-drivers devices
### 安裝 install the NVIDIA driver
>Reference:https://gist.github.com/denguir/b21aa66ae7fb1089655dd9de8351a202
這邊可以找到distro non-free recommended,建議安裝有出現這行的版本

sudo ubuntu-drivers autoinstall
依據上面的建議安裝版本,自行調整安裝
```
sudo apt install nvidia-driver-535
reboot
```
Reboot & Check
重啟後輸入以下指令
```
nvidia-smi
```

**注意:這裡的cuda版本(CUDA Version)為最高支援版本,並非當前安裝版本!**
## Install CUDA drivers
更新套件包
sudo apt update && sudo apt upgrade
### Install CUDA toolkit
https://zh.wikipedia.org/zh-tw/CUDA

```
sudo apt install nvidia-cuda-toolkit
```
確保環境變數設置正確應該確保在 .bashrc中設置了正確的環境變數
```
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
```
保存並運行以下命令使更改生效
```
source ~/.bashrc
```
### Check CUDA install
nvcc \--version
### Install cuDNN
下載 cuDNN .deb file
到tensorflow 官方網站檢查自己的加速卡套用哪個版本

>https://www.tensorflow.org/install/source
接著到cuDNN官網下載對應系統版本的.deb檔

>https://developer.nvidia.com/rdp/cudnn-archive
確認版本的指令
nvcc --version
## Install cuDNN
### 方法一
進入到下載好的.deb檔路徑,這邊其實是可以雙擊檔案安裝的,看自己習慣
sudo dpkg -i ./<filename.deb>
sudo cp /var/cudnn-<something>.gpg /usr/share/keyrings/
自行調整自己安裝的版本,本次4090對應的是cuDNN 8.9
sudo apt update
sudo apt install libcudnn8
sudo apt install libcudnn8-dev
sudo apt install libcudnn8-samples
### 方法二
nvidia cudnn網站
https://developer.nvidia.com/rdp/cudnn-archive

解壓縮指令
```
tar zxvf 檔名.tar
```
複製文件到cuda include 跟lib64
添加讀取權限
```
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
```
### 驗證是否成功安裝
搜尋 cudnn.h 文件
```
sudo find / -name cudnn.h
```
查看 cudnn.h 文件的內容
```
cat /usr/local/cuda/include/cudnn.h | head -n 20
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
```
檢查是否有 cuDNN 加速
在 TensorFlow 中,當 GPU 被使用且 cuDNN 可用時,會顯示這樣的訊息:
```
2024-12-06 16:12:58.792503: I tensorflow/core/platform/cuda/cuda_dnn.cc:389] Loaded cuDNN version 8.1.1
```
清理不必要的 cuDNN版本果您確定只使用 CUDA 11.4 版本,您可以選擇刪除舊版本的 cuDNN(例如與 CUDA 10.0 相關的 cuDNN),這樣可以避免混淆和版本衝突。
```
sudo rm -rf /usr/local/cuda-10.0
```
```
import tensorflow as tf
a = tf.test.is_built_with_cuda()
b = tf.test.is_gpu_available(
cuda_only=False,
min_cuda_compute_capability=None
)
print("CUDA Available:", tf.config.list_physical_devices('GPU'))("CUDA available:", a)
print("GPU available:", b)
```
tf.test.is_built_with_cuda():這個函數檢查 TensorFlow 是否在編譯時啟用了 CUDA 支援。換句話說,這是檢查您安裝的 TensorFlow 版本是否包含 CUDA 支援,而不是檢查當前是否有 GPU 可用。它只檢查 TensorFlow 是否已經編譯過來時支持 CUDA。
tf.test.is_gpu_available(cuda_only=False, min_cuda_compute_capability=None):這個函數檢查當前系統中是否有可用的 GPU。如果您設置 cuda_only=False,它會檢查是否有 CUDA 驅動支持的 GPU,如果您設置了 min_cuda_compute_capability,則可以檢查 GPU 是否符合最低計算能力要求。該函數返回 True 或 False,告訴您當前是否有可用的 GPU。
這裡的 cuda_only=False 會讓它檢查所有類型的 GPU,包括支持 CUDA 的 GPU。
tf.config.list_physical_devices('GPU'):這個函數檢查並列出所有的 GPU 設備(物理設備),如果您的系統中有可用的 GPU,則會列出它們。返回的列表中將包含物理 GPU 設備的名稱,例如 /physical_device:GPU:0。
> [color=#8241a8]
### Some Debug Issue
Envirment path
https://github.com/tensorflow/tensorflow/issues/34287
GNU GCC Install
https://hackmd.io/@cwhu/BJu1w_64q && https://askubuntu.com/questions/1500017/ubuntu-22-04-default-gcc-version-does-not-match-version-that-built-latest-defaul
tools
https://chatgpt.com/
https://www.cnblogs.com/Tou-ming/p/16134242.html
## 小工具(可選)
# barrier鍵盤滑鼠共用
windows下載網址 https://github.com/debauchee/barrier/releases/download/v2.4.0/BarrierSetup-2.4.0-release.exe
ubuntu下載網址
https://github.com/debauchee/barrier
選擇一台做為服務端 一台做為客戶端

左上角barrier 進入change setting 取消勾選 SSL

客戶端的伺服器IP填入服務端的IP

服務端的伺服器設定 拉下來打上客戶端的顯示名稱

服務端跟客戶端點啟動就可以使用了

## windows遠端ubuntu教學
先到ubuntu電腦,開啟「設定(Settings)」→「分享(Sharing)」

再點選「遠端桌面(Remote Desktop」→開啟遠端桌面選項

User Name (就是你的登入帳號),及Password (密碼)

windows打上ip及使用者名稱,案連線

輸入密碼,按下確定

Copyright © 2024 Yen Fu .All Rights Reserved