当将在多个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 Tesla P100,CUDA 9.0.176,CudNN 7
有没有人知道发生了什么,更重要的是,我如何重现效果?
答案 0 :(得分:0)
在使用最新的软件版本重建我的virtualenv之后,我再也无法复制这个了。我与其中一位技术支持人员进行了交谈,他们对于张量流升级和专用构建进行了嘟a。我把它归结为小鬼。
答案 1 :(得分:0)
在加载模型之前编写代码os.environ["CUDA_VISIBLE_DEVICES"] = '0'
,这样它将不会使用多个GPU