我正在使用tf.data api,tf.keras api和tf在Tensorflow中训练一个分类器(通过RNN)。估算器API。在本地培训中,我的吞吐率约为240步/秒,然后我用ParameterServer(由于正确的TF_CONFIG)进入分布式模式(由于有1名工作人员(因此1个PS和1个Chief = 1个工作人员)),我达到了40个步骤/秒。如果我添加1个Worker(现在是2个Worker),我的速度约为50步/秒,依此类推。我在家里(使用多台PC)和群集(大约18名工人)中测试了此行为。只有18名工人,我才能达到当地培训的速度。我用nfs,hdfs进行睾丸训练,改变了操作系统。网络不能成为问题,因为其他框架的扩展性很好。 有人可以指导我如何获得更好的表现。我尝试了很多,但没有找到合适的解决方案。
data_pipeline = tf.data.experimental.CsvDataset(MODEL_DIR, DEFAULTS, header=False,field_delim=CSV_SEPARATOR) \
.shard(WORKER, WORKERINDEX) \
.map(lambda *a: tf.stack(a), num_parallel_calls=THREADS) \
.window(size=WINDOW_SIZE, shift=WINDOW_SHIFT, stride=WINDOW_STRIDE,drop_remainder=True) \
.flat_map(lambda b: b.batch(WINDOW_SIZE)) \
.map(lambda c: (c[:,:-1],tf.one_hot(tf.cast(c[-1][-1], tf.int32),2))) \
.batch(GLOBAL_BATCH_SIZE, drop_remainder=True) \
.repeat(REAPEAT_DATASET) \
.prefetch(PREFETCH)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(5, batch_input_shape=(GLOBAL_BATCH_SIZE, WINDOW_SIZE, NR_FEATURES),activation=tf.keras.activations.relu, kernel_initializer=tf.keras.initializers.he_uniform(seed=2), bias_initializer=tf.keras.initializers.Zeros()))
model.add(tf.keras.layers.SimpleRNN(RNN_UNITS,stateful=True,activation=tf.keras.activations.tanh, kernel_initializer=tf.keras.initializers.glorot_uniform(seed=2),recurrent_initializer=tf.keras.initializers.glorot_uniform(seed=2),bias_initializer=tf.keras.initializers.Zeros()))
model.add(tf.keras.layers.Dense(NUM_CLASSES, activation= tf.keras.activations.softmax, kernel_initializer=tf.keras.initializers.glorot_uniform(seed=2), bias_initializer=tf.keras.initializers.Zeros()))
model.compile(optimizer=tf.train.AdamOptimizer(LEARNING_RATE), # AdamOptimizer
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=[tf.keras.metrics.CategoricalAccuracy(dtype=tf.float32),tf.keras.metrics.Recall(dtype=tf.float32),tf.keras.metrics.Precision(dtype=tf.float32,class_id=0),f1_score])
estimator = tf.keras.estimator.model_to_estimator(keras_model=model, config=RUN_CONFIG, model_dir=LOG_DIR)
train_spec = tf.estimator.TrainSpec(input_fn=input_fn(tf.estimator.ModeKeys.TRAIN))
eval_spec = tf.estimator.EvalSpec(input_fn=input_fn(tf.estimator.ModeKeys.EVAL), steps=100,start_delay_secs=20,throttle_secs=1*60/6)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
cluster_spec_dict = {'ps': ['192.168.2.XXX:50012'],'chief': ["192.168.2.XXX:50014"],}