安装伪分布式的TensorFlow

安装伪分布式的TensorFlow

一.安装虚拟机Wmware:

二.在虚拟机上创建ubuntu,我在虚拟机上创建了3个Ubuntu,分别为ps,worker0,worker1

三.安装CPU版的TensorFlow

1.    安装Anaconda2

2.    安装TensorFlow:pip install tensorflow*.whl

四.关闭Ubuntu防火墙,每一个虚拟机的防火墙都要关闭,这步必须做,不然一会通信不了

sudo ufw disable

五.测试(参考https://github.com/thewintersun/distributeTensorflowExample

首先在每一个虚拟机上创建一个python文件,并将一下代码贴入:

  1. #coding=utf-8
  2. import numpy as np
  3. import tensorflow as tf
  4.  
  5. # Define parameters
  6. FLAGS = tf.app.flags.FLAGS
  7. tf.app.flags.DEFINE_float('learning_rate',0.00003, 'Initial learning rate.')
  8. tf.app.flags.DEFINE_integer('steps_to_validate',1000,
  9.                      'Steps to validate andprint loss')
  10.  
  11. # For distributed
  12. tf.app.flags.DEFINE_string("ps_hosts","",
  13.                            "Comma-separatedlist of hostname:port pairs")
  14. tf.app.flags.DEFINE_string("worker_hosts","",
  15.                           "Comma-separated list of hostname:port pairs")
  16. tf.app.flags.DEFINE_string("job_name","", "One of 'ps', 'worker'")
  17. tf.app.flags.DEFINE_integer("task_index",0, "Index of task within the job")
  18. tf.app.flags.DEFINE_integer("issync",0, "是否采用分布式的同步模式,1表示同步模式,0表示异步模式")
  19.  
  20. # Hyperparameters
  21. learning_rate = FLAGS.learning_rate
  22. steps_to_validate =FLAGS.steps_to_validate
  23.  
  24. def main(_):
  25.  ps_hosts = FLAGS.ps_hosts.split(",")
  26.  worker_hosts = FLAGS.worker_hosts.split(",")
  27.  cluster = tf.train.ClusterSpec({"ps": ps_hosts,"worker": worker_hosts})
  28.  server =tf.train.Server(cluster,job_name=FLAGS.job_name,task_index=FLAGS.task_index)
  29.  
  30.  issync = FLAGS.issync
  31.  if FLAGS.job_name == "ps":
  32.    server.join()
  33.  elif FLAGS.job_name == "worker":
  34.    with tf.device(tf.train.replica_device_setter(
  35.                    worker_device="/job:worker/task:%d" % FLAGS.task_index,
  36.                     cluster=cluster)):
  37.      global_step = tf.Variable(0, name='global_step', trainable=False)
  38.  
  39.      input = tf.placeholder("float")
  40.      label = tf.placeholder("float")
  41.  
  42.      weight = tf.get_variable("weight", [1], tf.float32,initializer=tf.random_normal_initializer())
  43.      biase  =tf.get_variable("biase", [1], tf.float32,initializer=tf.random_normal_initializer())
  44.      pred = tf.multiply(input, weight) + biase
  45.  
  46.      loss_value = loss(label, pred)
  47.      optimizer = tf.train.GradientDescentOptimizer(learning_rate)
  48.  
  49.      grads_and_vars = optimizer.compute_gradients(loss_value)
  50.      if issync == 1:
  51.        #同步模式计算更新梯度
  52.        rep_op = tf.train.SyncReplicasOptimizer(optimizer,
  53.                                                replicas_to_aggregate=len(
  54.                                                   worker_hosts),
  55.                                                replica_id=FLAGS.task_index,
  56.                                                total_num_replicas=len(
  57.                                                  worker_hosts),
  58.                                                use_locking=True)
  59.        train_op = rep_op.apply_gradients(grads_and_vars,
  60.                                       global_step=global_step)
  61.        init_token_op = rep_op.get_init_tokens_op()
  62.        chief_queue_runner = rep_op.get_chief_queue_runner()
  63.      else:
  64.        #异步模式计算更新梯度
  65.        train_op = optimizer.apply_gradients(grads_and_vars,
  66.                                       global_step=global_step)
  67.  
  68.  
  69.      init_op = tf.initialize_all_variables()
  70.      
  71.      saver = tf.train.Saver()
  72.      tf.summary.scalar('cost', loss_value)
  73.      summary_op = tf.summary.merge_all()
  74.  
  75.    sv = tf.train.Supervisor(is_chief=(FLAGS.task_index == 0),
  76.                            logdir="./checkpoint/",
  77.                             init_op=init_op,
  78.                             summary_op=None,
  79.                             saver=saver,
  80.                            global_step=global_step,
  81.                             save_model_secs=60)
  82.  
  83.    with sv.prepare_or_wait_for_session(server.target) as sess:
  84.      # 如果是同步模式
  85.      if FLAGS.task_index == 0 and issync == 1:
  86.        sv.start_queue_runners(sess, [chief_queue_runner])
  87.        sess.run(init_token_op)
  88.      step = 0
  89.      while  step < 1000000:
  90.        train_x = np.random.randn(1)
  91.        train_y = 2 * train_x + np.random.randn(1) * 0.33  + 10
  92.        _, loss_v, step = sess.run([train_op, loss_value,global_step],feed_dict={input:train_x, label:train_y})
  93.        if step % steps_to_validate == 0:
  94.          w,b = sess.run([weight,biase])
  95.          print("step: %d, weight: %f, biase: %f, loss: %f" %(step, w,b, loss_v))
  96.  
  97.    sv.stop()
  98.  
  99. def loss(label, pred):
  100.  return tf.square(label - pred)
  101.  
  102.  
  103.  
  104. if __name__ == "__main__":
  105.  tf.app.run()

 

用ifconfig查看的你的ip地址:ps_ip是PS节点上的·IP地址、worker0_ip和worker1_ip是worker节点的ip

在PS节点上用:

  1. CUDA_VISIBLE_DEVICES=''python distribute.py --ps_hosts=ps_ip:2222 --worker_hosts=worker0_ip:2223, worker1_ip:2224--job_name=ps --task_index=0

在worker0上;

  1. CUDA_VISIBLE_DEVICES=''python distribute.py --ps_hosts=ps_ip:2222 --worker_hosts=worker0_ip:2223, worker1_ip:2224--job_name=ps --task_index=0

在worker1上;

  1. CUDA_VISIBLE_DEVICES=''python distribute.py --ps_hosts=ps_ip:2222 --worker_hosts=worker0_ip:2223, worker1_ip:2224--job_name=ps --task_index=1


<think>好的,我现在需要处理用户关于分布式并行编程的查询。用户提到了概念、方法和教程,还引用了几个相关的资料。首先,我要确保自己正确理解这些概念,然后组织信息,满足用户的需求。 首先,用户提供的引用资料涵盖了分布式数据并行(DDP)、并发与并行的区别、数据并行与模型并行、MapReduce的Shuffle过程,以及共享内存编程模型。这些内容需要整合成一个连贯的回答,覆盖概念、方法和教程。 用户希望了解分布式并行编程的概念、方法和教程。我需要分三个部分来回答: 1. **概念**:需要区分分布式系统、并行计算,以及它们的结合。引用中的资料提到分布式程序不一定并行,而并行计算可以是分布式的。例如引用[2]和[5]讨论了并发、并行和分布式的区别,以及共享内存模型。这部分需要解释清楚基本概念,以及数据并行、模型并行(引用[3])和任务并行的分类。 2. **方法**:这里要具体说明常见的实现方式,比如数据并行的DDP(引用[1])、模型并行的参数划分,还有MapReduce(引用[4])作为数据处理的例子。另外,引用[5]提到的共享内存模型如OpenMP和Pthread,可能属于单机多线程,但也要说明在分布式环境中的应用可能。 3. **教程**:根据引用[1]中的资源,推荐PyTorch的DDP教程和示例代码,以及大批次训练的技巧。此外,可能补充其他框架如TensorFlow和Horovod,以及MPI的基础知识。需要确保推荐的资源是用户可访问的,比如官方文档或知名教程。 需要注意的问题: - 用户提供的引用中有部分链接可能不完整(如引用[1]的链接被截断),但应尽量使用已有的信息,比如提到的官方视频教程和示例仓库。 - 确保回答中的LaTeX格式正确,例如行内公式用$...$,独立公式用$$...$$,但根据用户提供的示例,可能不需要太多公式,但如果有涉及数学表达的地方要正确应用。 - 生成的相关问题需要符合用户提供的示例结构,围绕分布式并行的子主题展开,比如性能优化、应用场景、比较不同方法等。 现在需要检查各部分是否覆盖了用户的需求,并且引用正确。例如,在数据并行部分引用[1]和[3],模型并行引用[3],MapReduce引用[4],共享内存引用[5],并发与并行引用[2]。 可能还需要解释一些术语,比如Shuffle过程在MapReduce中的作用(引用[4]),以及DDP如何同步梯度(引用[1]的上下文)。同时,要区分数据并行和模型并行的不同应用场景,比如数据并行适用于批量数据分割,而模型并行用于大模型参数分散存储。 在教程部分,引用[1]提到的PyTorch DDP教程和代码仓库是重点,同时补充其他资源如TensorFlow和Horovod,以及MPI的学习资料。确保每个推荐都有对应的引用标记。 最后,生成的相关问题需要具体且有针对性,例如询问数据并行的实现细节,或者比较不同并行方法的优劣,以及如何选择适合的并行策略等。 现在将这些思路整理成结构化的回答,确保每个部分清晰,引用正确,并符合用户的格式要求。</think>### 分布式并行编程详解 #### 一、核心概念 1. **分布式系统** 多个计算节点通过网络协作完成任务,节点间通过消息传递通信[^2]。例如,MapReduce框架中,数据被分配到不同节点处理[^4]。 2. **并行计算** 分为单机多线程并行(如OpenMP共享内存模型[^5])和跨节点分布式并行(如PyTorch DDP同步梯度[^1])。两者的结合常见于多GPU训练场景。 3. **数据并行 vs 模型并行** - **数据并行**:将数据按$batch$维度划分到多个节点,每个节点计算局部梯度后全局同步(如DDP)。数学表示为: $$\nabla L = \frac{1}{N} \sum_{i=1}^k \nabla L_i$$ - **模型并行**:将模型参数拆分到不同节点,适用于参数量过大无法单机存储的场景(如GPT-3训练[^3])。 #### 二、常用方法 1. **分布式数据并行(DDP)** PyTorch通过`torch.distributed`实现多机多卡同步,核心步骤: - 初始化进程组(如NCCL后端) - 使用`DistributedDataParallel`包装模型 - 各节点独立计算梯度后自动AllReduce聚合。 2. **MapReduce模型** 分`Map`(数据分片处理)和`Reduce`(结果聚合)阶段,中间通过Shuffle过程对键值对排序合并。例如: ```python # 伪代码示例 def map(key, value): emit_intermediate(value, 1) def reduce(key, values): emit(key, sum(values)) ``` 3. **混合并行策略** 结合数据并行与模型并行,如Megatron-LM对Transformer层按行/列切分参数,同时多节点并行训练。 #### 三、学习资源推荐 1. **PyTorch DDP教程** - 官方视频教程《WHAT IS DISTRIBUTED DATA PARALLEL》 - 代码示例仓库:`ddp-tutorial-series` 2. **框架与工具** - TensorFlow:`tf.distribute.MirroredStrategy`(单机多卡) - Horovod:基于MPI的分布式训练框架,支持TensorFlow/PyTorch - MPI基础:《MPI标准文档》 3. **论文与案例分析** - 《Training Neural Nets on Larger Batches: Practical Tips for 1-GPU, Multi-GPU & Distributed setups》 - 《Distributed Optimization for Deep Learning》综述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值