Tensorflow 2.7 在不同的机器上显示不同的结果
Tensorflow 2.7 shows different results on different machines
问题
我在 Windows 10 机器上安装了 Tensorflow 并且 运行 非常适合创建和训练我的模型。我设法用它得到了很好的模型,而且推理也非常好。我决定保存它们并再次加载它们以测试是否一切都成功了,而且确实如此。
现在,将这个项目迁移到另一台机器上让我以一种我不理解的方式破坏了一切。在新机器上加载完全相同的模型后,推理给出了完全错误的结果,使其完全无用,几乎就像从未受过训练一样。
模型本身很简单,只有1个隐藏层500个神经元,激活函数ELU:
norm = preprocessing.Normalization()
norm.adapt(x_train)
model = tf.keras.models.Sequential()
model.add(Input(shape=(48,))
model.add(norm)
model.add(Dense(500, activation='elu'))
model.add(Dropout(0.2))
model.add(Dense(686, activation='relu'))
optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
model.compile(loss='mean_squared_error', optimizer=optimizer, metrics=['accuracy'])
我已经尝试和验证的内容
新机器(我现在称之为机器 2)上的 anaconda 环境与机器 1 上的完全相同。因此,包也是如此(验证了 Numpy、Tensorflow 和 Keras 的版本)。
Windows 版本(必须在某一时刻验证它是否可能是一个问题)也是一样的。
如果我尝试在机器 2 上重新训练相同的模型,它会给出相同的结果(错误),但是将这个新训练的模型复制到机器 1 上仍然有效,所以训练是可以的。
我试着在虚拟机上做同样的事情,但我遇到了同样的问题。
基本上,唯一的区别在于硬件:
机器 1:
- 英特尔(R) 酷睿(TM) i7-3770S @ 3.10 GHz
- 没有 GPU
- 16 GB 内存
机器 2:
- AMD 锐龙 3 3100 4 核 @ 3.80 GHz
- NVIDIA GeForce RTX 2060(未使用以确保它不是来自 GPU)
- 32 GB 内存
如果有什么需要补充的,请告诉我!
更新 #1
对于那些可能需要它的人,这里是机器 1 上的推理结果:
- raw inference's results on machine 1
- inference on machine 1
这是机器 2 上的推论:
- raw inference's results on machine 2
- inference on machine 2
注意:原始结果只是一个摘录,但足以让你看到我认为它有多么错误
更新 #2
我在另外两台机器上测试过,它们似乎有完全相同的问题。我确定的唯一规范是它们 3 个都有共同点,并且机器 1 不共享,它们支持 AVX 和 AVX2。机器 1 仅支持 AVX。
因此,生成参考结果的框架似乎最近发生了变化,足以改变计算方法。它现在也可以在 pip 中使用,这在第一次计算机计算时不是这种情况(这意味着无法在此版本上完成对每个包版本的检查)。
问题 我在 Windows 10 机器上安装了 Tensorflow 并且 运行 非常适合创建和训练我的模型。我设法用它得到了很好的模型,而且推理也非常好。我决定保存它们并再次加载它们以测试是否一切都成功了,而且确实如此。 现在,将这个项目迁移到另一台机器上让我以一种我不理解的方式破坏了一切。在新机器上加载完全相同的模型后,推理给出了完全错误的结果,使其完全无用,几乎就像从未受过训练一样。 模型本身很简单,只有1个隐藏层500个神经元,激活函数ELU:
norm = preprocessing.Normalization()
norm.adapt(x_train)
model = tf.keras.models.Sequential()
model.add(Input(shape=(48,))
model.add(norm)
model.add(Dense(500, activation='elu'))
model.add(Dropout(0.2))
model.add(Dense(686, activation='relu'))
optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
model.compile(loss='mean_squared_error', optimizer=optimizer, metrics=['accuracy'])
我已经尝试和验证的内容 新机器(我现在称之为机器 2)上的 anaconda 环境与机器 1 上的完全相同。因此,包也是如此(验证了 Numpy、Tensorflow 和 Keras 的版本)。 Windows 版本(必须在某一时刻验证它是否可能是一个问题)也是一样的。 如果我尝试在机器 2 上重新训练相同的模型,它会给出相同的结果(错误),但是将这个新训练的模型复制到机器 1 上仍然有效,所以训练是可以的。 我试着在虚拟机上做同样的事情,但我遇到了同样的问题。
基本上,唯一的区别在于硬件:
机器 1:
- 英特尔(R) 酷睿(TM) i7-3770S @ 3.10 GHz
- 没有 GPU
- 16 GB 内存
机器 2:
- AMD 锐龙 3 3100 4 核 @ 3.80 GHz
- NVIDIA GeForce RTX 2060(未使用以确保它不是来自 GPU)
- 32 GB 内存
如果有什么需要补充的,请告诉我!
更新 #1
对于那些可能需要它的人,这里是机器 1 上的推理结果:
- raw inference's results on machine 1
- inference on machine 1
这是机器 2 上的推论:
- raw inference's results on machine 2
- inference on machine 2
注意:原始结果只是一个摘录,但足以让你看到我认为它有多么错误
更新 #2
我在另外两台机器上测试过,它们似乎有完全相同的问题。我确定的唯一规范是它们 3 个都有共同点,并且机器 1 不共享,它们支持 AVX 和 AVX2。机器 1 仅支持 AVX。
因此,生成参考结果的框架似乎最近发生了变化,足以改变计算方法。它现在也可以在 pip 中使用,这在第一次计算机计算时不是这种情况(这意味着无法在此版本上完成对每个包版本的检查)。