我感兴趣的是测试我的神经网络(一个用作发生器的自动编码器+一个CNN作为鉴别器),它使用3dconv / deconv层和新的Volta架构,并受益于混合精度训练。我使用CUDA 9和CudNN 7.0编译了Tensorflow 1.4的最新源代码,并将我的conv / deconv层使用的所有可训练变量转换为tf.float16。此外,我的所有输入和输出张量的大小都是8的倍数。
不幸的是,我没有看到这种配置有任何实质性的速度提升,训练时间与使用tf.float32大致相似。我的理解是,使用Volta架构和cuDNN 7.0,混合精度应该由TF自动检测,因此可以使用Tensor Core数学。我错了,或者我应该做些什么来启用它? 我也试过TF1.5 nighlty版本,它似乎比我的自定义1.4更慢。
如果任何涉及Tensorflow的开发人员可以回答此问题,我将不胜感激。
编辑:在与NVIDIA技术支持人员交谈之后,似乎在支持float16时,TF集成了混合精度加速,用于简单的2D转换操作,但目前还不适用于3D转换操作。答案 0 :(得分:3)
基于NVIDIA documentation我使用FP16(TensorCore)运行基准测试。为此,我通过tensorflow提供了alexnet_benchmark
:
https://gist.github.com/melgor/946b9643aa25dd3839a86804fc580741
总的来说,AlexNet的速度只有35%,而不是那么多。我希望能快2倍。也许,Resnet可能会产生更大的差异。好消息是我可以使用batch_size = 5120(fp32不能)使用模型,一个FB传递需要0.653,因此训练ImageNet 90个时期需要~4h。
batch_size=512
alexnet_fp32: Forward-backward across 100 steps, 0.099 +/- 0.000 sec / batch
alexnet_fp16: Forward-backward across 100 steps, 0.064 +/- 0.000 sec / batch
编辑:
我设法在FP16上运行ResNet模型(但没有BatchNorm,由于某种原因,BN不适用于fp16):
batch_size=256
resnet50_fp32: Forward-backward across 100 steps, 0.575 +/- 0.001 sec / batch
resnet50_fp16: Forward-backward across 100 steps, 0.504 +/- 0.001 sec / batch
batch_size=128
resnet152_fp32: Forward-backward across 100 steps, 0.757 +/- 0.001 sec / batch
resnet152_fp16: Forward-backward across 100 steps, 0.581 +/- 0.010 sec / batch
ResNet的收益甚至更小。看起来FP16在V100上没有很多增益,不知道为什么。也许TensorCore的支持目前尚未完全整合。
答案 1 :(得分:1)
我对这个话题很感兴趣,有没有人对Volta Tensor Cores与Tensorflow集成的当前状态有任何更新?我用Volta V100 GPU和tensorflow 1.5 cuda 9.0 cudnn进行了实验来测试速度,并得出以下结论:
所以基本上我得到了与OP相同的结论:Tensorflow尚未完全支持Volta GPU。
这个关于tensorflow github的PR似乎与主题有关,尽管我还没有测试过这些变化:https://github.com/tensorflow/tensorflow/pull/16253
答案 2 :(得分:0)
我相信tensorflow没有使用正确的cudnn API调用来确定最佳算法。我只是grepped tensorflow代码 cudnnGetConvolutionForwardAlgorithm_v7 和 cudnnFindConvolutionForwardAlgorithmEx
并没有匹配。 我打算用Tensorflow加票。