분산 텐서 흐름을 사용하여 Alexnet을 실행해도 이미지 수는 초당 확장되지 않습니다. 여기에 alexnet 모델을 사용하고 있습니다. alexnet_benchmark.py EC2 G2 (NVIDIA GRID K520) 인스턴스의 분산 교육을위한 약간의 수정과 함께, 단일 GPU 인에서 5 6 이미지/초를 처리 할 수 있습니다. 분산 코드가 없으면 단일 GPU에서 112 이미지/초를 처리 할 수 있습니다. 이것은 매우 이상하게 보입니다.이 코드를 배포 할 때 잘못되었을 수있는 내용을 검토하십시오. 매개 변수 서버는 GPU에서 실행되지 않고, 노동자alexnet 분산 텐서 흐름 성능
ps_hosts = FLAGS.ps_hosts.split(",")
worker_hosts = FLAGS.worker_hosts.split(",")
# Create a cluster from the parameter server and worker hosts.
cluster = tf.train.ClusterSpec({"ps": ps_hosts, "worker": worker_hosts})
# Create and start a server for the local task.
server = tf.train.Server(cluster,
job_name=FLAGS.job_name,
task_index=FLAGS.task_index)
if FLAGS.job_name == "ps":
server.join()
elif FLAGS.job_name == "worker":
gpu = FLAGS.task_index % 4
# Assigns ops to the local worker by default.
with tf.device(tf.train.replica_device_setter(
#'/gpu:%d' % i
worker_device="/job:worker/task:%d" % FLAGS.task_index,
#worker_device='/gpu:%d' % gpu,
cluster=cluster)):
summary_op = tf.merge_all_summaries()
y, x = get_graph()
y_ = tf.placeholder(tf.float32, [None, NUM_LABELS])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
global_step = tf.Variable(0)
gradient_descent_opt = tf.train.GradientDescentOptimizer(LEARNING_RATE)
num_workers = len(worker_hosts)
sync_rep_opt = tf.train.SyncReplicasOptimizer(gradient_descent_opt, replicas_to_aggregate=num_workers,
replica_id=FLAGS.task_index, total_num_replicas=num_workers)
train_op = sync_rep_opt.minimize(cross_entropy, global_step=global_step)
init_token_op = sync_rep_opt.get_init_tokens_op()
chief_queue_runner = sync_rep_opt.get_chief_queue_runner()
#saver = tf.train.Saver()
summary_op = tf.merge_all_summaries()
init_op = tf.initialize_all_variables()
saver = tf.train.Saver()
is_chief=(FLAGS.task_index == 0)
# Create a "supervisor", which oversees the training process.
sv = tf.train.Supervisor(is_chief=(FLAGS.task_index == 0),
#logdir="/tmp/train_logs",
init_op=init_op,
summary_op=summary_op,
saver=saver,
global_step=global_step)
#save_model_secs=600)
# The supervisor takes care of session initialization, restoring from
# a checkpoint, and closing when done or an error occurs.
with sv.managed_session(server.target) as sess:
if is_chief:
sv.start_queue_runners(sess, [chief_queue_runner])
sess.run(init_token_op)
num_steps_burn_in = 1000
total_duration = 0
total_duration_squared = 0
step = 0
while step <= 40000:
print('Iteration %d' % step)
sys.stdout.flush()
batch_xs, batch_ys = get_data(BATCH_SIZE)
train_feed = {x: batch_xs, y_: batch_ys}
start_time = time.time()
_, step = sess.run([train_op, global_step], feed_dict=train_feed)
duration = time.time() - start_time
if step > num_steps_burn_in:
total_duration += duration
total_duration_squared += duration * duration
if not step % 1000:
iterations = step - num_steps_burn_in
images_processed = BATCH_SIZE * iterations
print('%s: step %d, images processed: %d, images per second: %.3f, time taken: %.2f' %
(datetime.now(), iterations, images_processed, images_processed/total_duration, total_duration))
sys.stdout.flush()
sv.stop()
타임 라인을 수집하고 (https://github.com/tensorflow/tensorflow/issues/1824#issuecomment-225754659 의 행을 따라) 병목 현상을 확인할 수 있습니까? –
여기에 단일 기계에 대한 [타임 라인] (https://github.com/tensorflow/tensorflow/issues/4526#issuecomment-249014238)이 있습니다. AlexNet은 병렬 적 자원을 효율적으로 사용하기 어렵게하는 IO에 비해 계산량이 적음을 보여줍니다 –