在啓動tensorrt server服務時提示"libopencv_highgui.so not found"

在使用tensorrt server的ensemble models功能時,筆者把預處理打包成了一個.so文件,分類模型使用的是.pb文件,但是當使用nvidia-docker命令啓動trt server鏡像時,報了錯誤"libopencv_highgui.so.2.4 not found",筆者踩了一些坑,終於找到了問題的原因,這裏記錄下來,方便以後隨時翻看。

預處理的.so調用了opencv庫中的函數,當啓動server服務時,會執行如下的命令,

nvidia-docker run --rm --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -p8000:8000 -p8001:8001 -p8002:8002 -v/path/to/model/repository:/models <tensorrtserver image name> trtserver --model-store=/models

命令運行後會需要加載.so和.pb模型,而.so必須依賴於opencv庫中的函數才能執行,那麼怎麼讓.so找到對應的libopencv_high.so呢?

一種直接的思路,在當前系統環境中的~/.bashrc中增加LD_LIBRARY_PATH路徑,使指向libopencv_highgui.so所在的文件夾,然後source一下,但是這種方式只能被系統路徑下的可執行文件訪問到,而上面的命令是在當前系統中啓動docker鏡像,把當前系統中的model repository映射到docker鏡像內,然後在docker鏡像內執行trtserver可執行文件。因此,.so所依賴的opencv庫也應該放在docker鏡像內

筆者一開始是把所有依賴的opencv庫拷貝到docker鏡像內,然後在鏡像內的~/.bashrc中添加LD_LIBRARY_PATH,但是在執行nvidia-docker命令時,仍然提示"libopencv_highgui.so.2.4 not found",爲什麼會這樣呢?

筆者找了可執行文件在運行時調用.so的搜索順序,然後找到了下面的這個鏈接,

https://www.cnblogs.com/vanishfan/archive/2013/01/15/2861211.html

筆者於是通過在docker鏡像內增加ld.so.conf的方式添加依賴庫路徑,再次執行nvidia-docker命令時,終於能找到libopencv_highgui.so.2.4了,那麼問題來了,爲什麼修改~/.bashrc就不行呢?參見下面的鏈接,

https://blog.csdn.net/wisgood/article/details/14644203

也即,在登錄linux系統時,纔會執行.bashrc文件,顯然,在運行nvidia-docker命令時,並沒有登錄該docker鏡像內的系統,所以就不會執行鏡像內部的~/.bashrc,導致LD_LIBRARY_PATH環境變量未生效。

到此,問題就已經解決了。其實,一種更簡單的方式,如果只是增加opencv依賴庫的話,可以在docker鏡像內執行命令apt-get install libopencv-highgui-dev,經過驗證,這種安裝方式會自動把opencv依賴庫的路徑添加到/etc/ld.so.conf中,避免了手動添加依賴庫路徑到環境變量的麻煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章