Linux下源碼編譯Libtorch


在部署AI模型的時候用到了libtorch庫,直接從官網下載后發現與現有環境不兼容,執行strings /usr/lib64/libstdc++.so.6 | grep GLIBC發現缺失相應的GLIBC版本,因此選擇下載源碼重新編譯libtorch。這里記錄一下編譯過程。

參照官網編譯教程,主要分為以下幾步:

一、安裝anconda3

anaconda3的安裝教程可以參考: 安裝anconda3

安裝完后創建一個環境,我這里采用的python版本是3.7.4,所以執行以下命令

conda create -n Test374 python=3.7.4

創建完成后,進入該環境,conda activate Test374

二、安裝環境

安裝相關依賴

conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses

三、下載

git clone --recursive https://github.com/pytorch/pytorch  # --recursive表示下載子模塊,但有些模塊很難下載下來,可以先用 git clone https://github.com.cnpmjs.org/pytorch/pytorch 
cd pytorch

四、切換分支

克隆下來的是最新版本,執行git tag查看分支,然后git checkout branch_name切換到想要的分支,

git checkout v1.2.0

# if you are updating an existing checkout
git submodule sync
git submodule update --init --recursive

注意:如果下載比較慢或者報錯,可以在pytorch目錄下查看.gitmodules文件, 切換分支后先把里面網址替換為github加速插件的地址, 然后再執行git submodule sync 和 后面的命令

  • 加速
    asmjit庫為例
# 原始網址: 
   git@github.com:asmjit/asmjit.git
# 加速:
   https://github.com.cnpmjs.org/asmjit/asmjit.git
   https://hub.fastgit.org/asmjit/asmjit.git
   https://github.91chi.fun//https://github.com/asmjit/asmjit.git

五、安裝

用export或者cmake-gui設置編譯選項,如:

export USE_CUDA=False
export BUILD_TEST=False
export USE_NINJA=OFF

在分支目錄下新建一個build文件夾,進入文件夾后執行以下命令,完成后在build目錄下可以找到生成的結果

mkdir build && cd build
python ../tools/build_libtorch.py

六、整理

新建libtorch文件夾

  • 復制pytorch下的torch/include 到libtorch 目錄
  • 復制build/lib下編譯好的庫文件到 libtorch/lib

七、修改編譯依賴項

比如使用已有的MKL庫,則可以修改pytorch/cmake目錄下的Dependencies.cmake文件,在里面指定你的庫文件。

如果BLAS編譯的時候設置為Eigen(默認為MKL),需要進行以下修改, 更多細節參考#32407

diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake
index 1b3917c..efe9c5d 100644
--- a/cmake/Dependencies.cmake
+++ b/cmake/Dependencies.cmake
@@ -112,6 +112,7 @@ message(STATUS "Trying to find preferred BLAS backend of choice: " ${BLAS})
 
 if(BLAS STREQUAL "Eigen")
   # Eigen is header-only and we do not have any dependent libraries
+  find_package(Eigen3 REQUIRED)  
+  # set(Eigen3_FOUND True)
+  # set(Eigen3_INCLUDE_DIR "/root/eigen3/include")
   set(CAFFE2_USE_EIGEN_FOR_BLAS ON)
 elseif(BLAS STREQUAL "ATLAS")
   find_package(Atlas REQUIRED)
@@ -155,15 +156,20 @@ endif()
 if (NOT INTERN_BUILD_MOBILE)
   set(AT_MKL_ENABLED 0)
   set(AT_MKL_MT 0)
-  set(USE_BLAS 1)
-  if(NOT (ATLAS_FOUND OR OpenBLAS_FOUND OR MKL_FOUND OR VECLIB_FOUND))
+  if(CAFFE2_USE_EIGEN_FOR_BLAS)
+    message(WARNING "Using EIGEN for blas for Caffe2, disabling blas in libpytorch")
+    set(USE_BLAS 0)
+  elseif(ATLAS_FOUND OR OpenBLAS_FOUND OR MKL_FOUND OR VECLIB_FOUND)
+    set(USE_BLAS 1)
+  else()
     message(WARNING "Preferred BLAS (" ${BLAS} ") cannot be found, now searching for a general BLAS library")
     find_package(BLAS)
     if (NOT BLAS_FOUND)
       set(USE_BLAS 0)
       set(BLAS "" CACHE STRING "Selected BLAS library")
     else()
-      set(BLAS BLAS_INFO CACHE STRING "Selected BLAS library")
+      set(USE_BLAS 1)
+      set(BLAS ${BLAS_INFO} CACHE STRING "Selected BLAS library")
     endif()
   endif()
 
@@ -1359,9 +1291,11 @@ if (NOT INTERN_BUILD_MOBILE)
       CACHE BOOL "Copy the required BLAS DLLs into the TH install dirs")
   ENDIF()
 
-  FIND_PACKAGE(LAPACK)
-  IF (LAPACK_FOUND)
-    SET(USE_LAPACK 1)
+  IF (NOT CAFFE2_USE_EIGEN_FOR_BLAS)
+    FIND_PACKAGE(LAPACK)
+    IF (LAPACK_FOUND)
+      SET(USE_LAPACK 1)
+    ENDIF()
   ENDIF()
 
   if (NOT USE_CUDA)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM