0 配置
写下这个标题,我自己都觉得有点不好意思。没办法,打螺丝的我,囊中羞涩,手上只有一块五年前下血本购买的Nvidia_Geforce_GTX_1080Ti。这块显卡在当年还是非常先进的,然而现在早已是古董一枚。以下列出我的一些详细配置:
Win10CPU: Intel Core i7-6800KGPU: Nvidia Geforce GTX 1080TiRAM: 16GVisual Studio 显卡驱动:516.94CUDA版本:10.1cuDNN版本:7.6.4
在此首先感谢Yolo的缔造者Joseph Chet Redmon以及传承者Alexey Bochkovskiy。没有这二位大神的开拓性和科普性工作,我怕是抱着一块N卡却摸不进DeepLearning的大门。当然,现在也只是刚刚摸到DeepLearning的大门。
VS的安装、N卡驱动的安装、CUDA的安装、cuDNN的安装,这里就不多说了。
1 获取Darknet的VS工程
这里就要特别提到Alexey Bochkovskiy大神了,在AB之前,Darknet在Linux环境下可以做到极简编译(因为有makefile文件的加持),但在Windows环境下想要编译却非常困难,需要下载cygwin来模拟Linux环境。正是由于AB大神将VS工程分享出来,我们才可以在Windows环境下快乐地玩耍。
下载的地址为:/AlexeyAB/darknet
这个目录下现在已经有Yolov7的VS工程了,但我还是先从Yolov4开始学习。
2 开始编译
在一些教程上,推荐使用build.ps1这个powershell脚本直接进行编译。但我还是找到了build文件夹,打开VS工程文件进行编译。由于这次是要对GPU版本进行编译,所以我们打开的是darknet.sln文件,如果是对CPU版本进行编译,则应该相应地打开darknet_no_gpu.sln文件。
3 幸运踩坑
对的,就是这么快。本来以为应该就是点一下编译然后就编译成功了,轻松加愉快,结果快确实是真的快,立刻掉坑。
问题出在哪儿了呢?
从错误信息里看到核心问题是
<import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 11.1.props" />
我使用的CUDA版本是v 10.1,并不是工程里默认指定的11.1,版本不匹配。这是个显而易见的错误。
OK,那如何解决它呢?
打开darknet.vcxproj文件,找到关于版本的两句,改之。
然后到CUDA的安装位置去找以下四个文件:
CUDA 10.1.propsCUDA 10.1.targetsCUDA 10.1.xmlNvda.Build.CudaTasks.v10.1.dll
把以上四个文件复制到$(VCTargetsPath)
宏定义的位置,我这里的位置在:
C:\Program Files (x86)\Microsoft Visual Studio\\Professional\MSBuild\Microsoft\VC\v160\BuildCustomizations
目录下
4 再次踩坑
CUDA对应版本修改完了,这下应该直捣黄龙了吧?叭叽,刚爬出坑来,又掉入另一个坑:
error MSB3721: nvcc fatal : Unsupported gpu architecture ‘compute_86’
关于这个问题我真的是摸不着头脑,'compute_86’是什么?
经过查阅网络资料,它指的是Nvidia显卡的计算框架,对于沦为古董的GTX 1080Ti,它的显卡算力框架只支持到6.1,compute_86指的却是8.6,这是RTX 3XXX系列才能支持得到的。
关于显卡的算力,可以在Nvidia的官网上进行查阅:
给出网址:/cuda-gpus#compute
这张图本来是想画个圈的,后来发现只要把GTX 1080Ti截到最下面就正好不用画圈了,立分高下。(学好深度学习,好好挣钱,早日换掉这老古董)
那么问题是从哪里引入的,为什么这个工程非得要去触及compute86呢?
答案在工程的属性里:
这个工程属于CUDA工程,所以还有CUDA的属性,这是小白未曾触及的领域——CUDA编程。
对于CUDA的学习小白只能说来日方长了。
但是这个问题的解决就在此处了:把Code Generation改为1080Ti可以触及的高度即可。
5 编译成功
编译成功了,我们成功地得到了darknet.exe。
这次是GPU版本的。虽然说这样讲可能会显得我很蠢,但这是小白第一次在自己电脑上编译成功GPU版本的Darknet。
测试一下:
目前还是只会在命令行里进行测试。
darknet detect cfg/yolov3.cfg yolov3.weights ./data/horses.jpg
由于我并没有配置OPENCV,所以没有直接输出图像:
Done! Loaded 107 layers from weights-fileDetection layer: 82 - type = 28Detection layer: 94 - type = 28Detection layer: 106 - type = 28./data/horses.jpg: Predicted in 16.788000 milli-seconds.horse: 88%horse: 99%horse: 96%horse: 99%Not compiled with OpenCV, saving to predictions.png instead
对比一下之前用CPU编译出来的darknet_no_gpu.exe跑出来的结果:
Done! Loaded 107 layers from weights-fileDetection layer: 82 - type = 28Detection layer: 94 - type = 28Detection layer: 106 - type = 28./data/horses.jpg: Predicted in 1012.002000 milli-seconds.horse: 88%horse: 99%horse: 96%horse: 99%Not compiled with OpenCV, saving to predictions.png instead
虽然是一块老古董,相较于CPU来说也有接近2个数量级的提升了。
再次泪牛满面。接下去就可以1炼丹2看源码了。
后续也可以把OPENCV配置到工程中去,这样就不会出现
Not compiled with OpenCV, saving to predictions.png instead
这一句了。
【水平所限,错漏难免,创作不易,轻喷勿骂】