0前言
本博客旨在說明在顯卡RTX3060+Win10(顯卡RTX3080測試下來也可以)環(huán)境下,通過正確安裝最新驅(qū)動+cuda11.1+cudnn8.0.4來配置深度學(xué)習(xí)環(huán)境,接著在VS2019上使用Libtorch1.9.0(C++版本深度學(xué)習(xí)框架)來做深度學(xué)習(xí)的開發(fā)任務(wù),比如用C++來部署深度學(xué)習(xí)模型。
本博客的特點(diǎn)在于:
1.基本上將所有需要的操作都具體地交代了,包括一些可能出現(xiàn)的浪費(fèi)時(shí)間的坑點(diǎn),適合小白學(xué)習(xí)并快速上手;如果有已經(jīng)做好或者會的部分(比如安裝VS)請直接跳過。
2.在30系列顯卡上來使用Libtorch1.9版本的配置教程,目前網(wǎng)上系統(tǒng)介紹的資料較少,本文盡量做到全面介紹。
3.本教程所有需要下載的安裝包或者庫都有兩種下載方式:
第一種是說明如何在官網(wǎng)上找到對應(yīng)的版本,自行下載;
第二種是可以直接從本人生成的百度網(wǎng)盤鏈接下載所需要的安裝包。
鏈接:https://pan.baidu.com/s/16M66qZ3ZYY9EzXjUGf4d3g
提取碼:6666
打包的文件夾如下圖所示,勾選需要的安裝包或者庫保存下載。
我的環(huán)境配置:
顯卡RTX3060
Windows10
驅(qū)動466.77
cuda11.1
cuDNN8.0.4
Opencv3.4.6
Libtorch1.9.0
Visual StudioCommunity2019
1檢查顯卡
搜索"設(shè)備管理器",在彈出的界面中點(diǎn)擊顯示適配器,看顯示的是什么
如果顯示當(dāng)前讀取到的顯卡型號,那么說明顯卡可以使用了。
如果顯示的是下圖的Microsoft 基本顯示適配器
則說明驅(qū)動需要更新,需要安裝最新的驅(qū)動
而驅(qū)動安裝只需要記住一個(gè)原則:使用最新版本的驅(qū)動即可。
最新的驅(qū)動一定可以向下兼容。
本人提供的包:
找到466.77-desktop-win10-64bit-international-dch-whql,下載。
官網(wǎng)下載:
可以去NVIDIA官網(wǎng)下載最新驅(qū)動
比如RTX3060顯卡+Win10,就選擇如下圖所示的配置
接著點(diǎn)擊搜索,下載即可
點(diǎn)擊466.77-desktop-win10-64bit-international-dch-whql
一路安裝到底即可。
等安裝成功后再次檢查設(shè)備管理器的顯示適配器,應(yīng)該會顯示當(dāng)前讀取到的顯卡型號,如下圖所示。
2下載、安裝cuda11.1.0
2.1下載cuda11.1.0
本人提供的包:
找到cuda_11.1.0_456.43_win10.exe,下載。
官網(wǎng)下載:
建議百度搜索cuda11.1.0,會顯示cuda11.1.0的下載地址,如下圖所示。按照下圖
建議不要從英偉達(dá)官網(wǎng)進(jìn)去尋找cuda11.1.0,因?yàn)橛ミ_(dá)官網(wǎng)會顯示最新版本的cuda(目前是11.3,以后應(yīng)該會是更高的版本),不是所需要的歷史版本,而安裝太高的版本就可能需要更高版本的Libtorch。
2.2安裝cuda11.1.0
點(diǎn)擊cuda_11.1.0_456.43_win10,一路安裝到底即可
PS:最后的界面Launch Samples可以不用勾選,直接關(guān)閉。
3下載、配置cuDNN8.0.4
3.1下載cuDNN8.0.4
個(gè)人建議這里直接使用本人網(wǎng)盤里的cuDNN壓縮包,因?yàn)槿绻麖挠ミ_(dá)官網(wǎng)下載的話需要登錄,而且英偉達(dá)官網(wǎng)的速度比較慢,所以比較麻煩。
本人提供的包:
找到cudnn-11.1-windows-x64-v8.0.4.30.zip,下載。
官網(wǎng)下載:
先百度搜索cuDNN下載,進(jìn)入英偉達(dá)官網(wǎng)的cuDNN界面
點(diǎn)擊Download cuDNN,進(jìn)入以下界面。
如果沒有注冊過的話先點(diǎn)擊Join Now進(jìn)行注冊;如果注冊過的話,點(diǎn)擊Login來登錄。
登陸上之后,進(jìn)入以下界面,勾選I Agree To the Terms of the cuDNN Software License Agreement,會彈出Archived cuDNN Releases
點(diǎn)擊Archived cuDNN Releases,在新的界面中找到對應(yīng)cuda11.1的cudnn8.0.4版本,找到Win10對應(yīng)的cuDNN Library,點(diǎn)擊下載。
3.2配置cuDNN8.0.4
解壓cudnn-11.1-windows-x64-v8.0.4.30文件
打開里面的文件,點(diǎn)擊cuda,會有3個(gè)文件夾bin、include、lib
接著打開以下的路徑:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1
然后把剛剛解壓好的cudnn的3個(gè)文件夾bin、include、lib里面的文件分別復(fù)制到上面這個(gè)目錄下對應(yīng)的bin、include、lib里面去,復(fù)制完后應(yīng)該要有下圖所示的文件。
4確認(rèn)cuda是否安裝成功
鍵盤按Win+R
輸入cmd,按回車,在彈出的界面輸入nvcc -V
按回車,如果出現(xiàn)以下界面,則說明安裝cuda11.1成功。
5下載、安裝、配置Visual Studio2019
5.1下載VS2019
進(jìn)入Microsoft Visual Studio官網(wǎng)
本人選擇社區(qū)版本,下載。
5.2安裝VS2019
接著安裝VS2019,一路安裝到底,直到出現(xiàn)以下界面的時(shí)候勾選"使用C++的桌面開發(fā)"和"Visual Studio擴(kuò)展開發(fā)"。
6.下載Opencv3.4.6
Tip:
Opencv版本如果使用太高的版本可能會不兼容,本人使用Opencv3.4.6沒有報(bào)錯(cuò)。
本人提供的包:
找到opencv-3.4.6-vc14_vc15,下載,安裝后生成opencv文件夾。
官網(wǎng)下載:
操作:
進(jìn)入Opencv官網(wǎng)在Library一欄找到Releases,如下圖所示:
找到所需版本,點(diǎn)擊Windows,就可以下載opencv-3.4.6-vc14_vc15.exe,點(diǎn)擊后就可以生成opencv庫。
7下載Libtorch1.9.0
Tip:
這里需要注意由于30系列顯卡的關(guān)系,所需要的安裝cuda就得在11以上,而較高的cuda版本就需要較高的Libtorch版本,具體的關(guān)系就需要去Pytorch官網(wǎng)上查看。
結(jié)論:
顯卡型號決定cuda版本的下限,而cuda版本又決定了torch的庫(不管是C++的Libtorch還是Python的Pytorch)是需要和cuda版本匹配的。
PS:
事實(shí)上本人在第一次直接在3060顯卡上跑由Libtorch1.7.1開發(fā)的程序時(shí)死活就是沒法加載到GPU上,直到后來想下載debug模式的庫時(shí)候才想起來Libtorch有一個(gè)Compute Platform這個(gè)要求,所以這才注意到本人之前使用的Libtorch1.7.1是不支持cuda11.1的。
本人提供的包:
找到libtorch-win-shared-with-deps-1.9.0+cu111.zip,下載,解壓。
官網(wǎng)下載:
在Pytorch的官網(wǎng)上可以查到目前Libtorch最新版本1.9.0可以有支持cuda11.1的版本,于是選擇最新的這個(gè)Libtorch1.9.0的Release版本。
下載,解壓。
8VS配置Opencv和Libtorch
VS配置Opencv和Libtorch總共包括頭文件,lib文件和dll文件。
操作:
1.打開VS2019,在界面上找到創(chuàng)建新項(xiàng)目,點(diǎn)擊后在彈出的界面中,點(diǎn)擊空項(xiàng)目
點(diǎn)擊右下角的下一步,接著在配置新項(xiàng)目的界面中,輸入自己想取的項(xiàng)目名稱名字和對應(yīng)的位置
再點(diǎn)擊右下角的創(chuàng)建,這時(shí)會彈出項(xiàng)目界面,此時(shí)已經(jīng)產(chǎn)生待會用于C++深度學(xué)習(xí)開發(fā)的項(xiàng)目了。
2.確定自己的編譯模式(Debug/Release)和編譯平臺(x86/x64/Any Cpu)
本人使用的是Release+x64
Tip:關(guān)于編譯模式和編譯平臺的選擇,可以參考以下資料:
Visual Studio中Debug與Release以及x86、x64、Any CPU的區(qū)別
3.配置頭文件
在項(xiàng)目界面找到右邊的項(xiàng)目名稱并右擊,找到屬性并點(diǎn)擊
在彈出的屬性頁中找到配置屬性—>VC++目錄
在包含目錄中添加opencv和Libtorch的include路徑,目的為了調(diào)用里面的h文件或者h(yuǎn)pp文件
D:\opencv\build\include
D:\libtorch190cu111\include
D:\libtorch190cu111\include\torch\csrc\api\include
點(diǎn)擊確定,再點(diǎn)擊應(yīng)用。
4.配置lib文件
還是在剛剛的屬性頁界面中找到配置屬性—>VC++目錄
在庫目錄中添加opencv和Libtorch的lib路徑,目的是為了使用里面的lib文件來鏈接
D:\opencv\build\x64\vc14\lib
D:\libtorch190cu111\lib
(以下圖示路徑是本人的路徑,請修改成自己的opencv和Libtorch的路徑)
接著繼續(xù)在屬性頁中的左邊點(diǎn)擊鏈接器—>輸入,點(diǎn)擊附加依賴項(xiàng),?編輯,
彈出的界面中添加opencv和Libtorch的lib路徑下的lib文件名
opencv_world346.lib
asmjit.lib
c10.lib
c10d.lib
c10_cuda.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
libprotobuf-lite.lib
libprotobuf.lib
libprotoc.lib
mkldnn.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
torch_cuda_cpp.lib
torch_cuda_cu.lib
此外還需要再加兩行
/INCLUDE:?warp_size@cuda@at@@YAHXZ
/INCLUDE:?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z
(本人是opencv_world346.lib,如果一開始選擇了Debug模式就是opencv_world346d.lib)
這兩行鏈接的作用是保證torch::cuda::is_available()返回True,不加的話有可能返回False
參考資料:
1.Torch::cuda::is_available return false in libtorch 1.5
至于上面兩具體怎么理解本人也不是很懂,希望有大佬能指出是如何理解的。
最后點(diǎn)擊右下角的應(yīng)用。
5.配置dll文件
配置dll文件可以使用3種方法:
a.將opencv和Libtorch需要調(diào)用的dll對應(yīng)的路徑(Opencv的D:\opencv\build\x64\vc14\bin和Libtorch的D:\libtorch190cu111\lib)放入系統(tǒng)環(huán)境變量中。
b.將opencv和Libtorch需要調(diào)用的dll文件復(fù)制到執(zhí)行程序的當(dāng)前目錄下(本人選擇的Release版本,所以就是復(fù)制編譯通過后生成的D:\Libtorch_test\x64\Release的目錄下)。
c.將opencv和Libtorch需要調(diào)用的dll對應(yīng)的路徑配置到VS中。
參考資料:
而本人平常由于工作需要,經(jīng)常需要把做好的軟件放到其他工控機(jī)上測試,所以會傾向于第二種直接復(fù)制dll文件的方式,否則的話放到新的機(jī)器上又需要重新配置,會比較麻煩和低效。
而如果是采用第二種方式的話需要在編譯通過后生成包含exe的Release目錄下去復(fù)制。
所以建議讀者需要等到后面編譯成功后復(fù)制dll文件,而此項(xiàng)目需要復(fù)制的dll文件包括以下:
9代碼測試
9.1新建cpp
項(xiàng)目—>源文件,右擊—>添加—>新建項(xiàng),彈出的界面如下,然后修改名稱改為main.cpp,再點(diǎn)擊右下角的添加
9.2代碼測試
這里主要測試Libtorch是否能正常使用,可以使用以下代碼,如果返回的都是1說明配置成功了。
#include <iostream>
#include <torch/torch.h>
int main() {
????std::cout << "CUDA is available:" << torch::cuda::is_available() << std::endl;
????std::cout << "CUDNN is available:" << torch::cuda::cudnn_is_available() << std::endl;
????std::cout << "GPU counts:" << torch::cuda::device_count() << std::endl;
????return 0;
}
Tip:如果要復(fù)制代碼到main.cpp的話,建議先復(fù)制到記事本里面,然后再復(fù)制到main.cpp,否則會出現(xiàn)以下提示,導(dǎo)致cpp文件不能調(diào)用Libtorch庫。
將代碼放入main.cpp后先編譯,具體操作是右擊項(xiàng)目,點(diǎn)擊重新生成,等待一會時(shí)間,如果出現(xiàn)全部重新生成:成功1個(gè),失敗0個(gè),跳過0個(gè),就說明編譯成功。
此時(shí)Release目錄已經(jīng)生成。
接著將上面所需要復(fù)制的dll文件復(fù)制到當(dāng)前的目錄D:\Libtorch_test\x64\Release
然后回到項(xiàng)目界面,按F5運(yùn)行程序,如果運(yùn)行成功的話界面如下:
10項(xiàng)目推薦
這里給出我?guī)熜值囊粋€(gè)Libtorch的開源項(xiàng)目
包含了圖像分割從初始化模型、加載權(quán)重pt文件、訓(xùn)練模型和預(yù)測結(jié)果,是本人見到比較完整的Libtorch項(xiàng)目。
可以按照項(xiàng)目里的流程來學(xué)習(xí)如何使用Libtorch來做深度學(xué)習(xí)與圖像處理的開發(fā)任務(wù)。