教程 | TensorFlow 官方解读:如何在多系统和网络拓扑中构建高性能模型(3)
2017-05-07 编辑:
带有 3 个变量的分布式复制模式中,变量读取和更新的单个工作器。每一步骤标上了数字,所有步骤被用于每一个变量。
NCCL
为了在同一台主机的不同 GPU 上传播变量和聚合梯度,我们可以使用 Tensorflow 默认的隐式复制机制。
然而,我们也可以选择 NCCL(tf.contrib.nccl)。NCCL 是英伟达的一个库,可以跨不同的 GPU 实现数据的高效传输和聚合。它在每个 GPU 上分配一个协作内核,这个内核知道如何最好地利用底层硬件拓扑结构,并使用单个 SM 的 GPU。
通过实验证明,尽管 NCCL 通常会加速数据的聚合,但并不一定会加速训练。我们的假设是:隐式副本基本是不耗时的,因为它们本在 GPU 上复制引擎,只要它的延迟可以被主计算本身隐藏起来,那么。虽然 NCCL 可以更快地传输数据,但是它需要一个 SM,并且给底层的 L2 缓存增加了更多的压力。我们的研究结果表明,在 8 个 GPU 的条件下,NCCL 表现出了更优异的性能;但是如果 GPU 更少的情况下,隐式副本通常会有更好的表现。
分段变量
我们进一步介绍一种分段变量模式,我们使用分段区域来进行变量读取和更新。与输入管道中的软件流水线类似,这可以隐藏数据拷贝的延迟。如果计算所花的时间比复制和聚合的时间更长,那么可以认为复制本身是不耗时的。
这种方法的缺点是所有的权重都来自之前的训练步骤,所以这是一个不同于 SGD 的算法,但是通过调整学习率和其他超参数,还是有可能提高收敛性。
脚本的执行
这一节将列出执行主脚本的核心命令行参数和一些基本示例(tf_cnn_benchmarks.py)
注意:tf_cnn_benchmarks.py 使用的配置文件 force_gpu_compatible 是在 Tensorflow 1.1 版本之后引入的,直到 1.2 版本发布才建议从源头建立。
主要的命令行参数
model:使用的模型有 resnet50、inception3、vgg16 和 alexnet。
num_gpus:这里指所用 GPU 的数量。
data_dir:数据处理的路径,如果没有被设置,那么将会使用合成数据。为了使用 Imagenet 数据,可把这些指示 (https://github.com/tensorflow/tensorflow/blob/master/tensorflow_models/inception#getting-started) 作为起点。
batch_size:每个 GPU 的批量大小。
variable_update:管理变量的方法:parameter_server 、replicated、distributed_replicated、independent。
local_parameter_device:作为参数服务器使用的设备:CPU 或者 GPU。
单个实例
# VGG16 training ImageNet with 8 GPUs using arguments that optimize for
# Google Compute Engine.
python tf_cnn_benchmarks.py --local_parameter_device=cpu --num_gpus=8
--batch_size=32--model=vgg16 --data_dir=/home/ubuntu/imagenet/train
--variable_update=parameter_server --nodistortions
# VGG16 training synthetic ImageNet data with 8 GPUs using arguments that
# optimize for the NVIDIA DGX-1.
python tf_cnn_benchmarks.py --local_parameter_device=gpu --num_gpus=8
--batch_size=64--model=vgg16 --variable_update=replicated --use_nccl=True
# VGG16 training ImageNet data with 8 GPUs using arguments that optimize for
# Amazon EC2.
python tf_cnn_benchmarks.py --local_parameter_device=gpu --num_gpus=8
--batch_size=64--model=vgg16 --variable_update=parameter_server
# ResNet-50 training ImageNet data with 8 GPUs using arguments that optimize for
# Amazon EC2.
python tf_cnn_benchmarks.py --local_parameter_device=gpu --num_gpus=8
--batch_size=64--model=resnet50 --variable_update=replicated --use_nccl=False
分布式命令行参数
1)ps_hosts:在<host>:port 的格式中(比如 10.0.0.2:50000),逗号分隔的主机列表用做参数服务器。
2)worker_hosts:(比如 10.0.0.2:50001),逗号分隔的主机列表用作工作器,在<host>:port 的格式中。
3)task_index:正在启动的 ps_host 或 worker_hosts 列表中的主机索引。
4)job_name:工作的类别,例如 ps 或者 worker。
分布式实例
如下是在两个主机(host_0 (10.0.0.1) 和 host_1 (10.0.0.2))上训练 ResNet-50 的实例,这个例子使用的是合成数据,如果要使用真实数据请传递 data_dir 参数。
# Run the following commands on host_0 (10.0.0.1):
python tf_cnn_benchmarks.py --local_parameter_device=gpu --num_gpus=8
--batch_size=64--model=resnet50 --variable_update=distributed_replicated
--job_name=worker --ps_hosts=10.0.0.1:50000,10.0.0.2:50000
--worker_hosts=10.0.0.1:50001,10.0.0.2:50001--task_index=0
python tf_cnn_benchmarks.py --local_parameter_device=gpu --num_gpus=8
--batch_size=64--model=resnet50 --variable_update=distributed_replicated
--job_name=ps --ps_hosts=10.0.0.1:50000,10.0.0.2:50000
--worker_hosts=10.0.0.1:50001,10.0.0.2:50001--task_index=0
# Run the following commands on host_1 (10.0.0.2):
python tf_cnn_benchmarks.py --local_parameter_device=gpu --num_gpus=8
--batch_size=64--model=resnet50 --variable_update=distributed_replicated
--job_name=worker --ps_hosts=10.0.0.1:50000,10.0.0.2:50000
--worker_hosts=10.0.0.1:50001,10.0.0.2:50001--task_index=1
python tf_cnn_benchmarks.py --local_parameter_device=gpu --num_gpus=8
--batch_size=64--model=resnet50 --variable_update=distributed_replicated
--job_name=ps --ps_hosts=10.0.0.1:50000,10.0.0.2:50000