# GO-Onnxruntime-example 環境架設(Ubuntu)
###### tags: `ubuntu`, `go`
## 環境系統
系統 : ubuntu 20.04
cuda : 12.2
cmake : 3.26
> 以下指令僅供參考,依各自安裝版本修改版本號
## 安裝顯卡驅動
* step1 : 輸入指令 ubuntu-drivers devices 查看可用版本
```
ubuntu-drivers devices
```
* step2 : 依據需求選擇驅動版本,輸入指令
```
sudo apt install nvidia-driver-535
```
* step3 : 重新啟動電腦,輸入指令 ```sudo reboot```
* step4 : 重啟後輸入 ```nvidia-smi```,確認是否安裝成功。
## 安裝 cuda
* step1 : 到 Nvidia CUDA 網站下載 CUDA 程式,強烈建議使用 runfile
* step2 : 輸入指令 sudo sh cuda_12.2.0_535.54.03_linux.run 進行手動安裝
* step3 : 取消勾選安裝顯卡driver,以免發生驅動衝突,然後開始 install
## 安裝 cudnn
* step1 : 到 Nvidia CUDA 網站下載 cudnn,檔案應該會叫做 *.tar.xz
* step2 : 輸入指令解壓縮
```
sudo tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tgz
```
* step3 : 輸入指令,複製Library到CUDA的安裝資料夾
```
sudo cp cuda/include/cudnn*.h /usr/local/cuda-12.2/include
sudo cp cuda/lib/libcudnn* /usr/local/cuda-12.2/lib64
sudo chmod a+r /usr/local/cuda-12.2/include/cudnn*.h /usr/local/cuda-12.2/lib64/libcudnn*
```
## 設置環境變數
* step1 : 打開 .bashrc 在後面加上環境變數
* step2 : 設置cuda位置,最後加上
```
export PATH=/usr/local/cuda/bin:$PATH
```
* step3 : 設置cudnn位置 最後加上
```
exportLD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
```
* step4 : 重新開啟terminal後,輸入```nvcc -V```確認 cuda&cudnn 是否正確安裝
## 多個 cuda 版本切換
* step1 : 輸入指令,刪除軟連結
```
sudo rm -rf /usr/local/cuda
```
* step2 : 輸入指令,重新建立軟連結
```
sudo ln -s /usr/local/cuda-12.1 /usr/local/cuda
```
* step3 : 重新開啟terminal後,輸入```nvcc -V```確認 cuda&cudnn 是否成功切換
## 安裝 golang
請參考 [https://go.dev/doc/install](https://),環境變數記得設定
```
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
```
## 安裝 GoCv
* step1 : 安裝GoCv package
```
go get -u -d gocv.io/x/gocv
```
* step2 : 切換至 package 底下
```
cd $GOPATH/pkg/mod/gocv.io/x/gocv@v0.36.1
```
* step3 : 輸入指令開始安裝 openCV 4.9.0
```
make install
```
* step4 : 輸入指令`go run ./cmd/version/main.go`,正確安裝會顯示如下
```
gocv version: 0.36.1
opencv lib version: 4.9.0
```
## 安裝 Onnxruntime cpp libary
* step1 : 更新cmake,至少要3.26,不要用 apt-install 版本會太舊,參考 [https://zhuanlan.zhihu.com/p/519732843](https://)
* step2 : 如果版本沒有更新成功,請去 .bashrc 新增環境變數
```
export CMAKE_ROOT=/usr/share/cmake-3.29.2
```
* step3 : 加大swap容量,實測16GB記憶體 + swap 32GB 才能正常編譯
參考 [https://www.astralweb.com.tw/how-to-manually-add-swap-to-ubuntu/](https://)
* step4 : git clone https://github.com/microsoft/onnxruntime.git ,或去下載zip檔解壓縮
* step5 : 將解壓縮後資料夾移動至 /usr/local/,並將資料夾命名為onnxruntime
* step6 : ```cd /usr/local/onnxruntime```
* step7 : 如果有跳git相關錯誤,輸入指令 git init
* step8 : 輸入指令(cuda11.8會遇到nvcc的警告,cuda12以上就不會)
```
sudo ./build.sh --skip_tests --use_cuda --config Release --build_shared_lib --parallel --cuda_home /usr/local/cuda-12.2/ --cudnn_home /usr/local/cuda --allow_running_as_root
```
* step9 : ```cd /usr/local/bin/onnxruntime/build/Linux/Release```
* step10 : 安裝 onnxruntime,輸入指令 ```sudo make install```
## 使用 sample code
* step1 : `git clone https://github.com/yam8511/go-onnxruntime-example.git` ,或去下載zip檔解壓縮
* step2 : 依照 README.md 提示輸入
```
go get github.com/yam8511/go-onnxruntime@v1.3.0
```
* step3 : 輸入 `go build -v -o run_od.exe ./yolov8_od `編譯執行檔
* step4 : 執行 `./run_od.exe`
## cgo 路徑相關問題
### pkg-config
pkg-config可以查看安裝套件提供的資訊
```
pkg-config --cflags opencv4 //列出套件提供的headerfile dir
pkg-config --libs opencv4 //列出套建提供的lib
```
### 找不到headerfile、lib
進入 inference.go ,右鍵點選 ort 相關的函式,點選go to definition,
在vscode上幫會出現他的路徑,切換至相關的檔案內。

```
// #cgo windows CFLAGS: -O2 -g -I ${SRCDIR}/include-1.14.1
// #cgo !windows CFLAGS: -O2 -g -I /usr/local/onnxruntime/include
// #cgo !windows LDFLAGS: -O2 -g -L /usr/local/onnxruntime/lib -lonnxruntime
```
程式內有定義相關的路徑,問題救出現在這。
### (方法一)更改 .bashrc 的環境變數
請根據你 headerfile、lib 實際位置更改
```
export CPATH=/usr/local/include/onnxruntime:$CPATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
```
### (方法二)將 include、lib 移動至指定位置
通常只能用指令移動,如果遇到權限問題就加sudo
```
mv /要移動的檔案 /新的檔案位置
```
### (方法三)將 CFLAGS 更改路徑
通常只能用指令移動,如果遇到權限問題就加sudo
```
// #cgo windows CFLAGS: -O2 -g -I /你要的路徑
```
## 問題
### cuda安裝失敗
使用runfile安裝,並且手動選擇不要安裝driver,安裝失敗原因通常就是driver版本衝突
### onnxruntime cmake 警告
cuda12以下會出現,nvcc的相關報錯,用cuda12就不會有問題,可以安裝多個版本cuda,依照需求將軟連結重新設定即可
### onnxruntime cmake 當機
建議以後可以開著資源管理器,監測使用資源,這次是記憶體空間不夠,加大swap虛擬記憶體即可解決
### Nvidia-smi 重開機後會掉驅動
在應用程式 NVIDIA X Server Setting 中設定,設定 PRIME Profiles 到效能模式。