問題
今天上80伺服器跑mdistiller的程式碼時,意外發現torch、numpy都不能用了T_T
以torch為例,出現如下報錯情況
以numpy為例,出現如下報錯情況
我們先看看報錯資訊,這個報錯來自Inter MKL。Inter MKL全稱是The Intel Math Kernel Library,它是一個主要是用於科學計算的共享庫,提供了很多與數學最佳化程式,例如向量矩陣操作什麼的。
報錯資訊說明我們在匯入torch/numpy庫時,無法載入libmkl_core.so.和libmkl_rt.so.1.
這兩個檔案以so結尾,屬於共享庫檔案。
在Linux系統上一般以.so副檔名(shared object), 在MacOS上以.dylib為副檔名, 在Windows上以.dll (dynamic link library)為副檔名。
共享庫的出現的一個原因是防止重複造輪子,它允許多個程式使用同一份程式碼。
這樣程式裡面便不需要重複寫相同的程式碼,只需要讓程式指向共享庫即可,提高了程式的可複用性,也讓程式變得更modular了。
解決過程
從報錯資訊來看,它說我們無法載入某個檔案。首先想到的是先確定這個檔案是否存在,這裡以libmkl_rt.so.1.來進行分析。
透過執行以下命令,我們來看看它是否存在
ls /home/jyg/anaconda3/envs/mdisPy37/lib/python3.7/site-pa
ckages/mkl/../../../libmkl_rt.so.1
在我的機器上執行結果如下,libmkl_rt.so.1.確實存在
那麼如何讓numpy
或者torch
庫能夠正確的找到Inter MKL共享庫並載入它需要的共享檔案呢?
這就不得不說一下LD_LIBRARY_PATH
環境變數了。
LD_LIBRARY_PATH
是Linux系統上一個與動態連結有關的環境變數。如果將各個程式想象成大小不一的拼圖,那麼連結的過程就是將這些雜亂的拼圖正確地拼合起來。
當某個庫或者程式需要用到其他的共享庫時,在搜尋標準庫目錄,例如/lib或者/usr/lib之前,作業系統會首先從由LD_LIBRARY_PATH
指定路徑下進行搜尋。
因此,我們只需要將路徑/home/jyg/anaconda3/envs/mdisPy37/lib新增到LD_LIBRARY_PATH
即可,即執行如下命令
export LD_LIBRARY_PATH=/home/jyg/anaconda3/envs/mdisPy37/l
ib:$LD_LIBRARY_PATH
現在便能正常匯入numpy
或者torch
庫了
不要忘了,我們現在只是在當前session中臨時設定了LD_LIBRARY_PATH
的值,如果當前會話結束了,重新開一個會話時還需要重新export。
因此,我們可以考慮執行如下命令永久改變LD_LIBRARY_PATH
的值
echo "export LD_LIBRARY_PATH=/home/jyg/anaconda3/envs/mdisPy37/lib:$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc