在Tesla V100上未启用TF1.4的混合精度

时间:2017-11-07 21:25:09

标签: tensorflow tensorflow-gpu tesla

我感兴趣的是测试我的神经网络(一个用作发生器的自动编码器+一个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转换操作。

3 个答案:

答案 0 :(得分:3)

基于NVIDIA documentation我使用FP16(TensorCore)运行基准测试。为此,我通过tensorflow提供了alexnet_benchmarkhttps://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进行了实验来测试速度,并得出以下结论:

  • 使用Volta V100进行训练并不比使用GeForce 1080 Ti进行训练快,但它应该更快。使用float16或float32不会改变任何内容
  • 使用带有浮动16的Volta V100进行训练并不比使用带有float32的Volta V100训练快。 volta GPU应该针对float16进行优化,因此我期待速度的材料改进。

所以基本上我得到了与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加票。