将多 GPU 训练模型加载到单 GPU 中;结果不一致



在将多个 GPU 训练的已保存模型加载到单个 GPU 模型中时,我看到了奇怪的结果。我在共享环境中操作,所以我在 4 个 GPU 上进行训练,但使用单个 GPU 运行测试。

我所看到的是,当在 (i) 单个 GPU 和 (ii) 4 个 GPU 上运行时,测试将返回截然不同的结果。例如,下面是最终选择的模型的验证步骤的输出(我使用的是具有提前停止功能的多 GPU 模型检查点):

Epoch 9:: Sensitivity: 0.8317 - Specificity: 0.9478 - Avg. Sn/Sp
0.8897 - Acc: 0.9289 - PPV: 0.7555 - NPV: 0.9667 - F1: 0.7918 - ROC AUC: 0.8897 - Matrix: [1016   56   35  173]

以下是使用 4 个 GPU 针对验证数据测试模型时的结果(使用 tf.device 在 CPU 上加载模型并调用 multi_gpu_model):

Metric      _base
------------- -------
acc       0.93  
auc       0.881
f1        0.804
ppv       0.804
npv       0.958
sensitivity   0.804
specificity   0.958
Confusion matrices [tn, fp, fn, tp]
-----------------------------------
_base : [1017   45   45  185]

这是仅使用 1 个 GPU 对相同数据运行相同测试时的结果(只需使用 load_model 加载模型);这始终如一地产生更好的分类器:

Metric      _base
------------- -------
acc       0.974
auc       0.946
f1        0.92
ppv       0.936
npv       0.982
sensitivity   0.905
specificity   0.988
Confusion matrices [tn, fp, fn, tp]
-----------------------------------
_base : [1069   13   20  190]

软件版本:python 3.5.2,keras 2.1.3,tensorflow 1.5.0(我在打开问题之前正在构建当前版本环境)

硬件: 4 x 特斯拉 P100, CUDA 9.0.176, CudNN 7

有没有人知道发生了什么,更重要的是,我如何重现效果?

在使用最新软件版本重建我的 virtualenv 后,我无法再复制它。我和一位技术支持人员交谈过,他们喃喃自语地谈论了 tensorflow 升级和专用构建。我把它归结为小鬼。

在加载模型之前编写代码os.environ["CUDA_VISIBLE_DEVICES"] = '0',那么它就不会使用多个GPU

最新更新