构建 Keras 项目以在 GPU 中实现可重现的结果

Jse*_*mol 2 python gpu random-seed keras tensorflow

我正在编写一个 tensorflow.Keras 包装器来执行 ML 实验。

我需要我的框架能够执行配置 yaml 文件中指定的实验并在 GPU 中并行运行。

然后我需要保证,如果我再次运行该实验,即使不是完全相同的结果,我也会得到相当接近的结果。

为了确保这一点,我的训练脚本在开头包含这些行,遵循官方文档中的指导原则:

# Set up random seeds
random.seed(seed)
np.random.seed(seed)
tf.set_random_seed(seed)
Run Code Online (Sandbox Code Playgroud)

这已被证明是不够的。

我运行了 4 次相同的配置,并绘制了结果:

在此处输入图片说明

如您所见,运行之间的结果差异很大。

如何在 Keras 中设置训练课程以确保在 GPU 中训练时获得相当相似的结果?这甚至可能吗?

可以在此处找到完整的培训脚本。

我的一些同事只使用纯 TF,他们的结果似乎更加一致。更重要的是,他们似乎没有播种任何随机性,只是为了确保训练和验证拆分始终相同。

guo*_*rui 5

Keras + TensorFlow。

第一步,禁用GPU。

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""
Run Code Online (Sandbox Code Playgroud)

第 2 步,为代码中包含的那些库设置种子,比如“tensorflow、numpy、random”。

import tensorflow as tf
import numpy as np
import random as rn

sd = 1 # Here sd means seed.
np.random.seed(sd)
rn.seed(sd)
os.environ['PYTHONHASHSEED']=str(sd)

from keras import backend as K
config = tf.ConfigProto(intra_op_parallelism_threads=1,inter_op_parallelism_threads=1)
tf.set_random_seed(sd)
sess = tf.Session(graph=tf.get_default_graph(), config=config)
K.set_session(sess)
Run Code Online (Sandbox Code Playgroud)

确保在代码的开头包含这两段代码,然后结果将是可重现的。

  • @NadavB文档解释得很好:https://keras.io/getting_started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development。具体来说,“此外,当在 GPU 上运行时,某些操作具有不确定的输出,特别是 tf.reduce_sum()。这是由于 GPU 并行运行许多操作,因此并不总是保证执行顺序。” (2认同)