7

我有兴趣测试我的神经网络(一个作为生成器的自动编码器 + 一个作为鉴别器的 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 夜间构建,它似乎比我自定义的 1.4 还要慢。

如果任何参与 Tensorflow 的开发人员能够回答这个问题,我将不胜感激。

编辑:在与 NVIDIA 技术支持人员交谈后,TF 似乎在支持 float16 的同时,为简单的 2D conv Ops 集成了混合精度加速,但目前还没有为 3D conv Ops 集成。

4

3 回答 3

3

基于NVIDIA 文档,我使用 FP16 (TensorCore) 运行基准测试。为此,我alexnet_benchmark通过 tensorflow 进行了修改: https ://gist.github.com/melgor/946b9643aa25dd3839a86804fc580741

总的来说,AlexNet 只快了 35%,并没有那么多。我希望能快 2 倍。此外,也许 Resnet 会产生更大的影响。好消息是我可以拟合 batch_size = 5120(fp32 不能)的模型,一个 FB pass 需要 0.653,所以训练 ImageNet 90 个 epoch 需要大约 4 小时。

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 的支持还没有完全集成。

于 2017-11-15T16:57:45.107 回答
2

我对这个话题很感兴趣,有人对 Volta Tensor Cores 与 Tensorflow 集成的当前状态有任何更新吗?我进行了实验以测试 Volta V100 GPU 和 tensorflow 1.5 cuda 9.0 cudnn 的速度,并得出以下结论:

  • 使用 Volta V100 进行训练并不比使用 GeForce 1080 Ti 进行训练快,但它应该更快。使用 float16 或 float32 不会改变任何东西
  • 使用带有 float 16 的 Volta V100 进行训练并不比使用带有 float32 的 Volta V100 进行训练快。Volta GPU 应该针对 float16 进行优化,所以我期待速度的实质性提高。

所以基本上我得到了与 OP 相同的结论:Tensorflow 尚未完全支持 Volta GPU。

tensorflow github 上的此 PR 似乎与该主题有关,尽管我尚未测试这些更改:https ://github.com/tensorflow/tensorflow/pull/16253

于 2018-02-08T12:17:43.767 回答
0

我相信 tensorflow 没有使用正确的 cudnn API 调用来确定最佳算法。我刚刚为 cudnnGetConvolutionForwardAlgorithm_v7 和 cudnnFindConvolutionForwardAlgorithmEx 获取了张量流代码

并且没有匹配。我要向 Tensorflow 提出申请。

于 2018-01-05T23:33:25.510 回答