【问题标题】:Non Deterministic Results Using GPUs with Tensorflow and Tensorflow Serving . .. Why?使用带有 Tensorflow 和 Tensorflow Serving 的 GPU 的非确定性结果。 .. 为什么?
【发布时间】:2019-05-03 19:03:54
【问题描述】:

我们有一个使用标准 CNN 和一些额外层的 Tensorflow(1.10 和 1.3)开发的对象检测模型。我们在具有 Cuda 10 和 CUDNN 7.4.x 的 Nvidia Tesla V100 GPU 上使用保存的模型格式在 Tensorflow Serving 1.13.0 中托管模型。 (我们使用 Google 容器镜像和/或 dockerfile 来提供 Tensorflow 服务。)

我们运行单元测试以确保预测结果符合我们的预期。这些都在 CPU 上工作得很好。但是当我们在上述 GPU/CUDA/CUDNN 配置上运行它们时,我们得到的预测概率差异在 0.001 到 0.0005 之间。

我们的目标是了解:

  • 为什么会这样?
  • 我们可以做些什么来预防它?
  • 如果我们可以采取一些措施来防止这种情况发生,这是否需要某种权衡,例如性能?

我们尝试了以下实验:

  1. 使用批量大小为 1 的检查点在 tensorflow GPU 上多次运行同一模型

    • 结果相同
  2. 使用不同批次大小的检查点在 GPU 上多次运行同一模型

    • 结果相差 0.001
  3. 使用不同批次大小的检查点在 CPU 上多次运行同一模型

    • 结果相同
  4. 使用批量大小为 1 的检查点在 TensorFlow 服务 GPU 上多次运行同一模型

    • 结果相同
  5. 比较带有检查点的运行与使用 GPU 上保存的模型的运行

    • 结果相差 0.005
  6. 比较带有检查点的运行与在 CPU 上使用已保存模型的运行

    • 结果相同
  7. 尝试在 GPU 上更改 batch_size 和设置 TF_CUDNN_USE_AUTOTUNE=0

    • 将最大差异从 0.001 减少到 0.0005
  8. 尝试添加intra_op_parallelism_threads=1inter_op_parallelism_threads=1TF_CUDNN_USE_AUTOTUNE=0 一起使用时没有任何区别

    • 结果与上述没有什么不同

总结:我们有一些在 GPU 上运行推理的结果不同的情况:

  1. 使用检查点与保存的模型。
  2. Batchsize = 1 与各种批量大小
  3. 设置TF_CUDNN_USE_AUTOTUNE=0 可减少使用不同批量大小时的差异

TF 1.10 AND 1.13.1 会发生这种情况

同样,我们的目标是了解:

  1. 为什么会这样?
  2. 我们可以做些什么来防止它发生吗?
  3. 如果我们可以采取一些措施来阻止它,这是否需要某种权衡,例如性能?

【问题讨论】:

标签: tensorflow tensorflow-serving


【解决方案1】:

我发生了一些疯狂的不确定性事情,这些事情并没有发生在我笔记本电脑的 GPU 中,而是发生在服务器的 GPU 中。

解决方案:现在我每次调用 cublas、cusolver 等函数后都调用 cudaDeviceSynchronize(),并且不确定性问题消失了! :) 这让我非常疯狂和愤怒,但显然是因为这些库使用流,然后您可以在结果完全由这些库的函数写入结果之前结束使用设备指针的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2018-02-11
    • 2019-02-19
    • 1970-01-01
    • 2017-10-28
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多