conda环境下调用动态库的优先级顺序

Ubuntu20.04 +miniconda3 利用tensorflow2.5.0训练模型时报错

Could not load dynamic library 'libcudnn.so.8';
......
file too short

在conda虚拟环境下调用动态库时,会优先调用/miniconda/envs/lib

即是当前激活的虚拟环境下的lib

个人实测在.bashrc 下设置export LD_LIBRARY_PATH优先级比conda/envs下的优先级低

(在两个路径下都有同名所需库文件的情况下, 比如都有某同名库文件,但是调用都会报错,先改正.bashrc路径下的库文件仍然报错,而再改正了envs/lib下的库文件则跑通,错误解决)

(其实在报错返回中的动态库调用路径也是envs/lib,但未保留截图)

补充:

该次错误是软链接错误(file too short,即该文件并不是真正的库文件,至于为什么没有正确自动调用动态库,暂时还不知道,添加了软链接后即解决)

且在下载了对应cuda版本的cudnn文件并且copy到对应lib文件夹下仍然报错

解决方法:

本人使用tensorflow2.5.0,则对应的cudnn库是8.1.0或者8.1.1

在官网下载对应库包后复制到envs/lib文件夹下,cd到envs/lib路径下然后建立软链接

ln -s libcudnn.so.8.1.1 libcudnn.so.8

补充充:在后面训练模型时,conda又调用了.bashrc设置的路径

目前猜测是初始化时会调用/envs/lib

而训练过程过程会调用.bashrc设置的路径

后面找到真正原因再做修改

原因是一般在设置.bashrc的时候,会设置LD_LIBRARY_PATH为下载的库的路径

而LD_LIBRARY_PATH是程序加载运行期间查找动态库指定除了系统默认路径之外的其他路径

所以在程序一开始编译的时候,调用的是/envs/lib,而在运行的时候是.bashrc设置的LD_LIBRARY_PATH

(另外,设置编译时的路径是 LIBRARY_PATH )

补充充充:软链接指令(ln -s 是创建,ln -snf是改变)

ln -snf libcudnn_ops_infer.so.8.1.1 libcudnn_ops_infer.so.8
ln -snf libcudnn_ops_train.so.8.1.1 libcudnn_ops_train.so.8
ln -snf libcudnn_cnn_train.so.8.1.1 libcudnn_cnn_train.so.8
ln -snf libcudnn_cnn_infer.so.8.1.1 libcudnn_cnn_infer.so.8
ln -snf libcudnn_adv_infer.so.8.1.1 libcudnn_adv_infer.so.8
ln -snf libcudnn_adv_train.so.8.1.1 libcudnn_adv_train.so.8

你可能感兴趣的:(python,tensorflow,anaconda)