主板:主板是华硕PRIME X299-A,最大支持三张显卡,带宽分别为PCIE x16 + PCIE x16 + PCIE x8,有两张显卡可以达到x16的带宽,另一张支持x8的带宽。所以插两张显卡较为适宜。
显卡配置:NVIDIA GTX1080Ti 两张。
操作:直接插到主板上。
检查:
开机之后,运行nvidia-smi,可以看到GPU0和GPU1的信息。
在cuda的sample里面,运行deviceQuery,可以看到卡0和卡1的详细信息。
当然运行simpleP2P,会提示这两张显卡之间不能直接交互,因为不支持GPUDirect(https://developer.nvidia.com/gpudirect)。需要Kepler和Fermi架构的GPU才支持。我们用的1080Ti是Pascal架构,故不支持。不过没有关系的。
实验:
运行keras的例子,cifar10_cnn.py,通过nvidia-smi dmon,监测发现虽然卡0和卡1的显存都塞满了,但是其中一张卡的sm和mem都为0,意味着这张卡是不参与计算的,并且该卡的利用率也基本为0%,而另一张卡有30%左右(打比方)。每个batch大概跑20秒左右。跟单卡是一样的。
好像多卡没用啊?
提高batch_size,发现最快能跑到3秒左右。一张卡的sm和mem基本跑满了。另一张卡还是0。
应该是没有正确配置多卡。
解决方案:
参考这个网页:https://medium.com/@kuza55/transparent-multi-gpu-training-on-tensorflow-with-keras-8b0016fd9012, 用了一个开发者对于keras框架的multi-gpu支持。
在cifar10_cnn.py里面使用上述支持,会看到两张卡的sm和mem使用率都上去了,GPU的利用率也都上去了,不会一张卡是0,另一张卡比较高的情况。
而且,最重要的是每个batch的时间能够在1秒到2秒之间。提速在100%左右。
但其实应该不会在100%,因为两张卡同时计算一个batch的各一半,最后要由cpu去对输出做merge,然后做反向传播(应该还是由GPU去做)。这中间要花一点点时间。(代码在这里:https://github.com/kuza55/keras-extras/blob/master/utils/multi_gpu.py)
网友评论