網(wǎng)站建設(shè) 設(shè)備seo外包資訊
前言:本文對在Windows系統(tǒng)上進(jìn)行LibTorch開發(fā)環(huán)境配置及相關(guān)問題解決做一個較為詳細(xì)的記錄,以便后續(xù)查詢使用。
使用環(huán)境版本:
Windows 11
Visual Studio 2022
CUDA 12.0
LibTorch 1.13.1_cu11.7
目錄
- 一、LibTorch簡介
- 二、LibTorch下載安裝
- 三、Vistual Studio環(huán)境配置
- 四、示例程序
- 五、Release模式或Debug模式只有一個能正常加載模型,另一個模式報錯
一、LibTorch簡介
在 Python 深度學(xué)習(xí)圈,PyTorch 具有舉足輕重的地位。同樣的,C++ 平臺上的 LibTorch 作為 PyTorch 的純 C++ 接口,它遵循 PyTorch 的設(shè)計和架構(gòu),旨在支持高性能、低延遲的 C++ 深度學(xué)習(xí)應(yīng)用研究。本文基于 Windows 環(huán)境與 Visual Studio 2022 開發(fā)工具,將從零開始搭建一個完整的深度學(xué)習(xí)LibTorch開發(fā)環(huán)境
二、LibTorch下載安裝
安裝LibTorch非常簡單,只需要從其官網(wǎng)選擇相應(yīng)的版本即可,具體頁面如下圖所示。
如果需要加載PyTorch訓(xùn)練的模型文件,安裝的LibTorch需要和PyTorch的版本一致。CUDA版本最好選與本機(jī)一致的版本進(jìn)行使用,但是我的經(jīng)驗(yàn)告訴我即使下載的版本和電腦安裝的CUDA版本不一致,但只要能兼容也可以使用。比如我下載的LIbTorch的CUDA版本是11.7但是電腦的CUDA版本是12.0,也是可以正常使用的。最后將下載好的壓縮包解壓到本地合適位置。比如我的就解壓在E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\文件夾下。
三、Vistual Studio環(huán)境配置
首先,在 Visual Studio 中創(chuàng)建一個名為 AIdemo的控制臺項(xiàng)目。創(chuàng)建完成后,將項(xiàng)目設(shè)置為 Release 模式,x64 平臺,如下圖。
在 Visual Studio 中,右鍵點(diǎn)擊項(xiàng)目AIdemo -> Properties 項(xiàng)目屬性,在左側(cè)導(dǎo)航欄中找到 VC++ Directories 選項(xiàng)。在右側(cè)的Include Directories選項(xiàng)中將 LibTorch include 目錄添加進(jìn)去,詳細(xì)如下(我既添加了Release版又添加了Debug版)。
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\include
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\include\torch\csrc\api\include
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\include
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\include\torch\csrc\api\include
在Library Directories選項(xiàng)中將LibTorch lib目錄添加進(jìn)去,詳細(xì)如下
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\lib
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\lib
具體如下圖所示,配置結(jié)果如下圖,注意檢查窗口頂欄Configuration是否為All Configurations,Platform是否為x64。
然后找到C/C+±>General->Additonal Include Directories選項(xiàng),在其中填入LibTorch Include,詳細(xì)如下
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\include
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\include\torch\csrc\api\include
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\include
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\include\torch\csrc\api\include
最后找到Linker->Input->Additonal Dependencies選項(xiàng),在其中填入LibTorch lib路徑下所有的*.lib文件的文件名,詳細(xì)如下。
asmjit.lib
c10.lib
c10d.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
fbjni.lib
gloo.lib
libprotobuf-lite.lib
libprotobuf.lib
libprotoc.lib
mkldnn.lib
pthreadpool.lib
pytorch_jni.lib
torch.lib
torch_cpu.lib
XNNPACK.lib
以上lib文件需要自行查看LibTorch lib路徑下是否具有此文件,以上文件可能和LibTorch版本相關(guān),如果你使用的版本沒有,可以不用添加。正常到這一步你的環(huán)境已經(jīng)搭建完成了,但是有些可能會遇到LibTorch的CUDA不能使用的問題,可以用如下命令查看是否有這種問題
//std::cout "CUDA: " << torch::cuda::is_available();//std::cout << "CUDNN: " << torch::cuda::cudnn_is_available() << std::endl;//std::cout << "GPU(s): " << torch::cuda::device_count() << std::endl;
如果程序返回結(jié)果都為非0,那證明CUDA以及CUDNN都是可用的,自此環(huán)境已經(jīng)搭建完成,但是也有可能返回結(jié)果為0證明CUDA以及CUDNN都不可用。需要進(jìn)行如下設(shè)置,找到Linker->Command Line選項(xiàng),在其中填入如下命令
/INCLUDE:"?ignore_this_library_placeholder@@YAHXZ"
即可解決上述問題,此命令適用于LibTorch1.13.1版本,較早版本填入的命令可能不同。
四、示例程序
至此,我們的開發(fā)環(huán)境已經(jīng)搭建完成,可以通過如下示例程序驗(yàn)證我們的配置是夠正確,
#include "torch/torch.h"
#include "torch/script.h"void main()
{std::cout << "這是生成張量操作!" << std::endl;torch::Tensor output = torch::randn({ 3,2 });std::cout << output << std::endl;std::cout << "CUDA:" << torch::cuda::is_available() << std::endl;std::cout << "CUDNN: " << torch::cuda::cudnn_is_available() << std::endl;std::cout << "GPU(s): " << torch::cuda::device_count() << std::endl;
}
如果顯示如下結(jié)果,則證明我們的環(huán)境配置成功,可以進(jìn)行開發(fā)工作了
五、Release模式或Debug模式只有一個能正常加載模型,另一個模式報錯
關(guān)于Debug模式可以正常加載模型,Release模式加載錯誤問題的解決。在配置好環(huán)境之后,Debug模式一切正常,但是Release模式下加載模型失敗。具體錯誤如下圖所示
剛開始我以為是我配置屬性表出了問題,反復(fù)確認(rèn)后沒有找到問題。后來查找資料,我發(fā)現(xiàn),由于我沒有將libtorch的dll文件放到對應(yīng)的exe生成目錄里,而是直接在環(huán)境變量里設(shè)置了dll的目錄,即lib的路徑,所以在環(huán)境變量中,debug和release的lib路徑順序先后會影響debug模式或者release模式的運(yùn)行,比如debug環(huán)境變量放在前面,debug模式就能運(yùn)行,release模式就不能讀取模型了。
解決方案:將lib文件夾下的所有dll文件,分別復(fù)制粘貼到對應(yīng)的輸出目錄里。(注意需要將Release版本的lib文件夾下的dll文件放在Release模式下的輸出目錄里,Debug版本的lib文件夾下的dll文件同理。)
輸出目錄如下方式找到
項(xiàng)目右擊->Properties->General->Output Directory,路徑如下圖所示
PS:本人在實(shí)驗(yàn)中想探究一下是不是環(huán)境變量影響了Release模式下的運(yùn)行結(jié)果,于是將環(huán)境變量中的Release版本的lib路徑移到Debug版本的前面。但是在Visual Studio 2022重新運(yùn)行Release模式同樣失敗。嗯?難道分析有誤?并不是,重啟Visual Studio即可!由于之前打開Visual Studio時已經(jīng)加載了之前的環(huán)境變量,因此更改之后并沒有對Visual Studio生效,重新打開,加載新的環(huán)境變量即可。
祝好運(yùn)!!!