使用具有Tensorflow和Tensorflow服务的GPU的非确定性结果。 ..为什么?

时间:2019-05-03 19:03:54

标签: tensorflow tensorflow-serving

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

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

我们的目标是了解:

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

我们尝试了以下实验:

  1. 使用数量为1的检查点在tensorflow GPU上运行相同模型的多次运行

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

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

    • 结果相同
  4. 使用检查点(批处理大小为1)在张量流服务GPU上多次运行相同模型

    • 结果相同
  5. 将带有检查点的运行与通过GPU保存的模型进行运行

    • 得到0.005
  6. 比较通过检查点运行以在CPU上以保存的模型运行

    • 结果相同
  7. 更改了batch_size并在GPU上设置TF_CUDNN_USE_AUTOTUNE=0的实验

    • 将最大差异从.001减小到.0005
  8. 添加了intra_op_parallelism_threads=1的实验,inter_op_parallelism_threads=1TF_CUDNN_USE_AUTOTUNE=0一起使用并没有任何区别

    • 结果与以上相同

总结:在某些情况下,在GPU上运行推理的结果是不同的:

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

这种情况发生在TF 1.10和1.13.1

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

  1. 为什么会这样?
  2. 我们有什么可以防止的呢?
  3. 如果我们可以采取某些措施来防止这种情况发生,这是否需要进行某种权衡,例如性能?

0 个答案:

没有答案