构建 Keras 项目以在 GPU 中实现可重现的结果
Structuring a Keras project to achieve reproducible results in GPU
我正在编写一个 tensorflow.Keras 包装器来执行 ML 实验。
我需要我的框架能够按照配置 yaml 文件和 运行 在 GPU 中并行执行实验。
然后我需要一个 gua运行tee,如果我再次 运行 实验,如果不是完全相同的结果,我会得到一些相当接近的结果。
为了确保这一点,我的训练脚本在开头包含这些行,遵循 official documentation:
中的指导方针
# Set up random seeds
random.seed(seed)
np.random.seed(seed)
tf.set_random_seed(seed)
这已被证明是不够的。
我运行同样配置4次,并绘制结果:
如您所见,结果在 运行 秒之间变化很大。
如何在 Keras 中设置训练课程以确保在 GPU 中训练时获得相当相似的结果?这甚至可能吗?
可以找到完整的训练脚本here。
我的一些同事正在使用 just pure TF,他们的结果似乎更加一致。更重要的是,他们似乎没有播种任何 运行domness,除了确保训练和验证分割始终相同。
尝试将种子参数添加到 weights/biases 个初始值设定项。只是为了向 Alexander Ejbekov 的评论添加更多细节。
Tensorflow 有两个随机种子图级别和运算级别。如果您使用多个图形,则需要在每个图形中指定种子。您可以通过在函数内设置种子参数来使用操作级别覆盖图级别种子。如果设置了相同的种子,您甚至可以使来自不同图形的两个函数输出相同的值。
考虑这个例子:
g1 = tf.Graph()
with g1.as_default():
tf.set_random_seed(1)
a = tf.get_variable('a', shape=(1,), initializer=tf.keras.initializers.glorot_normal())
b = tf.get_variable('b', shape=(1,), initializer=tf.keras.initializers.glorot_normal(seed=2))
with tf.Session(graph=g1) as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(a))
print(sess.run(b))
g2 = tf.Graph()
with g2.as_default():
a1 = tf.get_variable('a1', shape=(1,), initializer=tf.keras.initializers.glorot_normal(seed=1))
with tf.Session(graph=g2) as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(a1))
在此示例中,a
的输出与 a1
相同,但 b
不同。
Keras + Tensorflow。
第 1 步,禁用 GPU。
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""
第 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)
确保将这两段代码包含在代码的开头,然后结果将是可重现的。
我正在编写一个 tensorflow.Keras 包装器来执行 ML 实验。
我需要我的框架能够按照配置 yaml 文件和 运行 在 GPU 中并行执行实验。
然后我需要一个 gua运行tee,如果我再次 运行 实验,如果不是完全相同的结果,我会得到一些相当接近的结果。
为了确保这一点,我的训练脚本在开头包含这些行,遵循 official documentation:
中的指导方针# Set up random seeds
random.seed(seed)
np.random.seed(seed)
tf.set_random_seed(seed)
这已被证明是不够的。
我运行同样配置4次,并绘制结果:
如您所见,结果在 运行 秒之间变化很大。
如何在 Keras 中设置训练课程以确保在 GPU 中训练时获得相当相似的结果?这甚至可能吗?
可以找到完整的训练脚本here。
我的一些同事正在使用 just pure TF,他们的结果似乎更加一致。更重要的是,他们似乎没有播种任何 运行domness,除了确保训练和验证分割始终相同。
尝试将种子参数添加到 weights/biases 个初始值设定项。只是为了向 Alexander Ejbekov 的评论添加更多细节。
Tensorflow 有两个随机种子图级别和运算级别。如果您使用多个图形,则需要在每个图形中指定种子。您可以通过在函数内设置种子参数来使用操作级别覆盖图级别种子。如果设置了相同的种子,您甚至可以使来自不同图形的两个函数输出相同的值。 考虑这个例子:
g1 = tf.Graph()
with g1.as_default():
tf.set_random_seed(1)
a = tf.get_variable('a', shape=(1,), initializer=tf.keras.initializers.glorot_normal())
b = tf.get_variable('b', shape=(1,), initializer=tf.keras.initializers.glorot_normal(seed=2))
with tf.Session(graph=g1) as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(a))
print(sess.run(b))
g2 = tf.Graph()
with g2.as_default():
a1 = tf.get_variable('a1', shape=(1,), initializer=tf.keras.initializers.glorot_normal(seed=1))
with tf.Session(graph=g2) as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(a1))
在此示例中,a
的输出与 a1
相同,但 b
不同。
Keras + Tensorflow。
第 1 步,禁用 GPU。
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""
第 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)
确保将这两段代码包含在代码的开头,然后结果将是可重现的。