在将多个 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