報錯Intel MKL FATAL ERROR: Cannot load libmkl_core.so.的一種解決方法

littletreee發表於2023-10-10

問題

今天上80伺服器跑mdistiller的程式碼時,意外發現torch、numpy都不能用了T_T

以torch為例,出現如下報錯情況
image
以numpy為例,出現如下報錯情況
image

我們先看看報錯資訊,這個報錯來自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.確實存在
image

那麼如何讓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庫了
image

不要忘了,我們現在只是在當前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

相關文章