【发布时间】: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 的检查点在 tensorflow GPU 上多次运行同一模型
- 结果相同
-
使用不同批次大小的检查点在 GPU 上多次运行同一模型
- 结果相差 0.001
-
使用不同批次大小的检查点在 CPU 上多次运行同一模型
- 结果相同
-
使用批量大小为 1 的检查点在 TensorFlow 服务 GPU 上多次运行同一模型
- 结果相同
-
比较带有检查点的运行与使用 GPU 上保存的模型的运行
- 结果相差 0.005
-
比较带有检查点的运行与在 CPU 上使用已保存模型的运行
- 结果相同
-
尝试在 GPU 上更改 batch_size 和设置
TF_CUDNN_USE_AUTOTUNE=0- 将最大差异从 0.001 减少到 0.0005
-
尝试添加
intra_op_parallelism_threads=1,inter_op_parallelism_threads=1与TF_CUDNN_USE_AUTOTUNE=0一起使用时没有任何区别- 结果与上述没有什么不同
总结:我们有一些在 GPU 上运行推理的结果不同的情况:
- 使用检查点与保存的模型。
- Batchsize = 1 与各种批量大小
- 设置
TF_CUDNN_USE_AUTOTUNE=0可减少使用不同批量大小时的差异
TF 1.10 AND 1.13.1 会发生这种情况
同样,我们的目标是了解:
- 为什么会这样?
- 我们可以做些什么来防止它发生吗?
- 如果我们可以采取一些措施来阻止它,这是否需要某种权衡,例如性能?
【问题讨论】:
-
This video 可能感兴趣。
标签: tensorflow tensorflow-serving