關於windows下的libtorch配置
1.環境
- Windows service 2012 R2/Windows10
- Cuda 9.0
- OpenCV3.4.1
- Libtorch1.0
- VS2017/VS2015
2.配置
-
第一步:CUDA 9.0+cudnn7.5安裝(也可以用CUDA8.0)
如果已經安裝了cuda8.0及以上版本,可以忽略此步驟。
libtorch有cuda8.0 和cuda9.0的版本,為了與vs版本保持一致,這里建議用cuda9.0版本(當然cuda8.0也可以成功編譯),參考安裝鏈接:https://blog.csdn.net/u013165921/article/details/77891913。
- 第二步:VS2017下載
下載Visio Studio Installer,通過Visio Studio Installer安裝vs2017,安裝時選擇使用C++的桌面開發,記得在單個組件上一定要將所有的Windows 10 SDK選上,其他的正常安裝.
- 第三步:VS2017配置Opencv3.4.1(到目前為止libtorch不支持opencv4.0)
這里建議配置opencv3.4版本,目前libtorch還不支持opencv4.0,opencv配置的步驟比較多,如果您的電腦還未配置Opencv,您可以參考這個博客可以配置成功:https://blog.csdn.net/qq_41175905/article/details/80560429,如果在這之前已經配置好了Opencv,可以忽略此步驟.
- 第四步:Libtorch配置
1.libtorch 1.0 c++版本下載:
cuda8.0版本的libtorch1.0下載:https://download.pytorch.org/libtorch/cu80/libtorch-win-shared-with-deps-latest.zip。
cuda9.0版本的libtorch1.0下載:https://download.pytorch.org/libtorch/cu90/libtorch-win-shared-with-deps-latest.zip。
Windows版本的libtorch已經是編譯好了的,下載后解壓即可。
2.修改Cmakelists.txt文件:
這里需要修改3個地方:
l 第一個紅框修改為當前的cmake版本
l 第二個紅框修改為當前的libtorch路徑
l 第三個紅框設置為當前的..\opencv\build目錄路徑。
3.libtorch聯合編譯
首先我已經有了以下等待編譯相關文件
在..\build路徑下內打開命令行窗口,輸入:
cmake -DCMAKE_PREFIX_PATH=C:\Program Files\opencv\build\x64\vc14\lib;D:\data\tanglin\RFBNet\libtorch-win-shared-with-deps-latest\libtorch -DCMAKE_BUILD_TYPE=Release -G"Visual Studio 15 2017 Win64" ..
此處分別是opencv路徑、libtorch路徑和VS版本,需根據自己的環境修改。如果順利則會顯示生成成功:
3.運行
打開..\build文件夾,則會看到生成成功的工程文件RFBNet.vcxproj,右鍵用vs2017或者vs2015打開工程文件。
鏈接..\nms_gpu目錄下的gpu_nms.h頭文件和nms_lib.lib文件到RFBNet.cpp中,vs2017鏈接lib靜態庫參考鏈接:https://blog.csdn.net/tangyanzhi1111/article/details/78962208。解決方案配置需選擇Release x64,點擊運行。
運行的時候一般會出現找不到torch.dll等問題,因此需要將..\libtorch\lib目錄下相對應的dll文件復制到..\build\Release目錄下。復制過去后則會成功運行。
4.附加
1.關於VS2017+CUDA9.0編程環境配置
cuda安裝成功后,會自動設置以下環境變量:
其他教程中還需要在環境變量中添加以下變量,但是我沒添加它也可以用:
CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.0
CUDA_LIB_PATH = %CUDA_PATH%\lib\x64 CUDA_BIN_PATH = %CUDA_PATH%\bin
CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64
打開VS2017.創建一個空win32程序,即test_cuda項目
.右鍵源文件文件夾->添加->新建項->選擇CUDA C/C++File,取名test
選擇test_cuda,點擊右鍵–>項目依賴項–>自定義生成,選擇CUDA9.0
點擊test.cu的屬性,在配置屬性–>常規–>項類型–>選擇“CUDA C/C++”
接下來需要配置一些項目:
右鍵項目 → 屬性 → 配置屬性 → VC++目錄 → 包含目錄,添加以下目錄:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.0\common\inc
右鍵項目 → 屬性 → 配置屬性 → VC++目錄 → 庫目錄,添加以下目錄:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\lib\x64 C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.0\common\lib\x64
配置CUDA靜態鏈接庫路徑:
右鍵項目 → 屬性 → 配置屬性 → 鏈接器 → 常規 → 附加庫目錄,添加以下目錄:
$(CUDA_PATH_V9_0)\lib\$(Platform)
選用CUDA靜態鏈接庫:
右鍵項目 → 屬性 → 配置屬性 → 鏈接器 → 輸入 → 附加依賴項,添加以下庫:
cublas.lib;cublas_device.lib;cuda.lib;cudadevrt.lib;cudart.lib;cudart_static.lib;cufft.lib;cufftw.lib;curand.lib;cusolver.lib;cusparse.lib;nppc.lib;nppial.lib;nppicc.lib;nppicom.lib;nppidei.lib;nppif.lib;nppig.lib;nppim.lib;nppist.lib;nppisu.lib;nppitc.lib;npps.lib;nvblas.lib;nvcuvid.lib;nvgraph.lib;nvml.lib;nvrtc.lib;OpenCL.lib;
修改test.cu,添加以下測試代碼:
#include "cuda_runtime.h" #include "device_launch_parameters.h" #include <stdio.h> int main() { int deviceCount; cudaGetDeviceCount(&deviceCount); int dev; for (dev = 0; dev < deviceCount; dev++) { int driver_version(0), runtime_version(0); cudaDeviceProp deviceProp; cudaGetDeviceProperties(&deviceProp, dev); if (dev == 0) if (deviceProp.minor = 9999 && deviceProp.major == 9999) printf("\n"); printf("\nDevice%d:\"%s\"\n", dev, deviceProp.name); cudaDriverGetVersion(&driver_version); printf("CUDA驅動版本: %d.%d\n", driver_version / 1000, (driver_version % 1000) / 10); cudaRuntimeGetVersion(&runtime_version); printf("CUDA運行時版本: %d.%d\n", runtime_version / 1000, (runtime_version % 1000) / 10); printf("設備計算能力: %d.%d\n", deviceProp.major, deviceProp.minor); printf("Total amount of Global Memory: %u bytes\n", deviceProp.totalGlobalMem); printf("Number of SMs: %d\n", deviceProp.multiProcessorCount); printf("Total amount of Constant Memory: %u bytes\n", deviceProp.totalConstMem); printf("Total amount of Shared Memory per block: %u bytes\n", deviceProp.sharedMemPerBlock); printf("Total number of registers available per block: %d\n", deviceProp.regsPerBlock); printf("Warp size: %d\n", deviceProp.warpSize); printf("Maximum number of threads per SM: %d\n", deviceProp.maxThreadsPerMultiProcessor); printf("Maximum number of threads per block: %d\n", deviceProp.maxThreadsPerBlock); printf("Maximum size of each dimension of a block: %d x %d x %d\n", deviceProp.maxThreadsDim[0], deviceProp.maxThreadsDim[1], deviceProp.maxThreadsDim[2]); printf("Maximum size of each dimension of a grid: %d x %d x %d\n", deviceProp.maxGridSize[0], deviceProp.maxGridSize[1], deviceProp.maxGridSize[2]); printf("Maximum memory pitch: %u bytes\n", deviceProp.memPitch); printf("Texture alignmemt: %u bytes\n", deviceProp.texturePitchAlignment); printf("Clock rate: %.2f GHz\n", deviceProp.clockRate * 1e-6f); printf("Memory Clock rate: %.0f MHz\n", deviceProp.memoryClockRate * 1e-3f); printf("Memory Bus Width: %d-bit\n", deviceProp.memoryBusWidth); } return 0; }
生成,這里注意VS2017版本和CUDA9.0不兼容,因此在visio studio installer 2017里面安裝VS2015,如圖所示:
如果一切順利,則會出現:
2.關於CUDA編程靜態鏈接庫的生成
VS2017新建新建-項目-CUDA 9.0 Runtime , 輸入項目名稱 “test_cuda”此時會自動生成代碼 kernel.cu :
右鍵項目test_cuda->添加->新建項->選擇visual c++頭文件,命名為gpu_nms.h
在頭文件中添加函數的聲明:
void _nms(int* keep_out, int* num_out, const float* boxes_host, int boxes_num, int boxes_dim, float nms_overlap_thresh, int device_id);
將新項目自動生成的代碼 kernel.cu 里面的內容修改為自己lib文件想要定義的函數內容,同時需要添加之前新建的頭文件
#include "gpu_nms.h"
修改test_cuda項目的項目屬性,如果是VS2017版本需要將平台工具集修改為vs2015,配置類型設置為靜態庫(.lib)
此時所有配置均完成,點擊運行,在路徑..\test_cuda\x64\Debug目錄下則會生成test_cuda.lib文件.
3.vs2017靜態鏈接庫lib的引用
vs里面靜態鏈接庫引用非常簡單,這里介紹兩種方法:
l 第一種方法,直接在.c文件中聲明所調用的lib文件名“#pragma comment(lib,"Staticlib.lib")
l 第二種方法:
- 添加工程的頭文件目錄:工程---屬性---配置屬性---c/c++---常規---附加包含目錄:加上頭文件存放目錄;
- 添加文件引用的lib靜態庫路徑:工程---屬性---配置屬性---鏈接器---常規---附加庫目錄:加上lib文件存放目錄;
- 然后添加工程引用的lib文件名:工程---屬性---配置屬性---鏈接器---輸入---附加依賴項:加上lib文件名