Try   HackMD

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,環境變數記得設定

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
  • step2 : 如果版本沒有更新成功,請去 .bashrc 新增環境變數
export CMAKE_ROOT=/usr/share/cmake-3.29.2
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上幫會出現他的路徑,切換至相關的檔案內。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

// #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 到效能模式。