1、问题描述
在ubuntu22.04环境中使用pyinstaller将fastdeploy的python程序打包为可执行文件后报错,报错信息为:
WARNING:root:Failed to create a symbolic link pointing to /root/YXZTSB/dist/yxztsb/_internal/fastdeploy/libs/third_libs/tensorrt/lib/libnvcaffe_parser.so.8 by an unprivileged user. It may failed when you use Paddle TensorRT backend. Please use administator privilege to import fastdeploy at first time.
terminate called after throwing an instance of 'ov::Exception'
what(): Failed to find plugins.xml file
Aborted
报错信息的翻译为:警告:root:非特权用户无法创建指向 /root/YXZTSB/dist/yxztsb/_internal/fastdeploy/libs/third_libs/tensorrt/lib/libnvcaffe_parser.so.8 的符号链接。当您使用 Paddle TensorRT 后端时,它可能会失败。请在首次使用管理员权限导入 fastdeploy。
抛出“ov::Exception”实例后调用终止
what(): 找不到plugins.xml文件
中止
在本博文中打包命令为:pyinstaller yxztsb.py
2、分析与解决
2.1 原始报错分析
根据报错信息的翻译,是跟/root/YXZTSB/dist/yxztsb/_internal/fastdeploy/libs/third_libs/tensorrt/lib/目录下的一个so文件有关,故而进入目录进行查看。
cd /root/YXZTSB/dist/yxztsb/_internal/fastdeploy/libs/third_libs/tensorrt/lib/
ls
ls -l #查看详细信息
执行命令后,可以看到存在两个文件是红色的(具体为:libnvcaffe_parser.so; libnvcaffe_parser.so
),应该是存在问题(软连接对应的文件不存在,故而为红色;软连接对应的文件要是在的话,应该是淡蓝色)。同时,这两个也是fastdeploy库的的文件。故而对fastdeploy库进行分析。
2.2 fastdeploy库分析
通常在python库import的库,与其安装包名是一样的。但在某些时候可能不一样,为了保险起见,故而我们先执行 pip show查看一下安装的包名。根据下图,可知fastdeploy库在pip命令中的完整名称是fastdeploy-gpu-python
接下来执行 pip show fastdeploy-gpu-python
,可以找到fastdeploy-gpu-python库的安装路径
执行 cd /root/miniconda3/lib/python3.9/site-packages/fastdeploy
进入fastdeploy库的目录下,然后找到与与原始报错信息中/fastdeploy/libs/third_libs/tensorrt/lib/
相关的目录,故此可以使用以下命令
cd /root/miniconda3/lib/python3.9/site-packages/fastdeploy/libs/third_libs/tensorrt/lib/
ls -l
可以看到原始报错信息中的libnvcaffe_parser.so、 libnvcaffe_parser.so文件都是正常存在的,只是pyinstaller打包时so文件拷贝失败了。
此时,将原来pyinstaller生成的错误软连接删除,然后将fastdeploy库中默认的so文件拷贝到软件安装包路径下
cd /root/miniconda3/lib/python3.9/site-packages/fastdeploy/libs/third_libs/tensorrt/lib/
rm ~/YXZTSB/dist/yxztsb/_internal/fastdeploy/libs/third_libs/tensorrt/lib/libnvcaffe_parser.so
rm ~/YXZTSB/dist/yxztsb/_internal/fastdeploy/libs/third_libs/tensorrt/lib/libnvparsers.so
cp libnvcaffe_parser.so ~/YXZTSB/dist/yxztsb/_internal/fastdeploy/libs/third_libs/tensorrt/lib/
cp libnvparsers.so ~/YXZTSB/dist/yxztsb/_internal/fastdeploy/libs/third_libs/tensorrt/lib/
通过以上拷贝后,原始的报错解决了。但还是存在一个报错未解决,具体如下所示:
2.3 ov::Exception报错解决
经过步骤2.1->2.2后,还是存在一个报错。将关键信息复制到浏览器搜索后,发现是openvino打包的错。但是,使用pip show进行查看,可以发现本环境是没有安装openvino库的,想必是在fastdeploy中的openvino库。
对python包安装目录下的fastdeploy库中的openvino进行查找,找到plugins.xml 文件的路径,拷贝到pyinstaller导出的程序的对应目录下。具体命令如下:
cp /root/miniconda3/lib/python3.9/site-packages/fastdeploy/libs/third_libs/openvino/runtime/lib/plugins.xml /root/YXZTSB/dist/yxztsb/_internal/fastdeploy/libs/third_libs/openvino/runtime/lib
我们也可以使用以下命令,将系统库中的fastdeploy库全部拷贝到pyinstaller生成的包目录下。
cp -rf /root/miniconda3/lib/python3.9/site-packages/fastdeploy/libs /root/YXZTSB/dist/yxztsb/_internal/fastdeploy/
执行完以上修改后,再次执行程序,出现以下报错
2.4 cannot open shared object file
2.3章节中最后的报错为找不到so文件,这应该是环境变量配置的问题。参考https://blog.csdn.net/weixin_37801214/article/details/109599668进行解决。
步骤一:find / -name libmklml_intel.so
步骤二: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/miniconda3/lib/python3.9/site-packages/fastdeploy/libs/third_libs/paddle_inference/third_party/install/mklml/lib/
命令执行效果如下所示
通过以上步骤后,终于实现fastdeploy程序的正常运行。