前言在大型数据集上训练的现代神经网络架构可以在广泛的领域取得令人瞩目的成果,从图像识别和自然语言处理到欺诈检测和推荐系统的各个方面。但是训练这些神经网络模型需要大量的浮点计算能力。尽管近年来GPU硬件计算能力和训练方法取得了显着进步,但事实是在单机上进行网络训练所需的时间仍然长得不切实际。因此,有必要采用分布式GPU环境来提高神经网络训练系统的浮点计算能力。TensorFlow分布式训练TensorFlow采用数据流范式,使用节点和边的有向图来表示计算。TensorFlow要求用户静态声明这个符号计算图,并使用rewrite&partitioning将图分配给机器分布式执行。TensorFlow中的分布式机器学习训练使用如图所示的参数服务器方法。Cluster、Job、Task关于TensorFlow的分布式训练,主要概念包括Cluster、Job、Task,它们之间的关系如下:一个TensorFlow分布式集群由多个任务组成,每个任务对应一个tf.train.Server实例,作为集群的一个节点;具有相同角色的多个Task可以划分为一个Job。在分布式深度学习框架中,我们一般将Job分为ParameterServer和Worker。ParameterJob是管理参数的存储和更新工作,WorkerJob运行OP,作为计算节点,只进行计算密集型Graph计算;Cluster中的任务会相对通信进行状态同步、参数更新等操作。如果参数个数过多,一台机器无法处理,这就需要MultipleTasks。TensorFlow分布式计算模式In-graph模式In-graph模式,模型的计算图的不同部分在不同的机器上执行。计算从单机多GPU扩展到多机多GPU,但数据分布仍然在一个节点上。这样配置简单,多机多GPU计算节点只需要进行join操作,并提供网络接口接受任务。训练数据的分布还是在一个节点上,将训练数据分布到不同的机器上会影响并发训练的速度。在大数据训练的情况下,不推荐这种模式。Between-graph模式Between-graph模式,数据并行化,每台机器使用完全相同的计算图。训练参数存储在参数服务器中,数据不需要分发。数据分布在各个计算节点中,各个计算节点自行计算,并通知参数服务器需要更新的参数。这种模式不需要训练数据的分布,在数据量达到TB级时可以节省大量时间。目前主流的分布式训练模式主要是基于Between-graph。参数更新方法同步更新用于并行计算的每个节点。计算出各自的batches后,获取梯度值,将梯度值统一发送给PS参数服务机,等待PS更新模型参数。PS参数服务器收集到一定数量的计算节点的梯度后,计算梯度的平均值,更新PS参数服务器上的参数,同时将参数推送给各个worker节点。异步更新PS参数服务器,只要收到一台机器的梯度值,就会直接更新参数,不需要等待其他机器。这种迭代方式比较不稳定,因为当机器A完成计算并更新PS参数服务器中的参数时,机器B可能还在使用上一次迭代的旧版本参数值。分布式训练步骤1.解析命令行参数,获取集群信息ps_hosts和worker_hosts,以及当前节点的角色信息job_name和task_index2.创建当前Task节点的Servercluster=tf.train.ClusterSpec({"ps":ps_hosts,"worker":worker_hosts})server=tf.train.Server(cluster,job_name=FLAGS.job_name,task_index=FLAGS.task_index)3.如果当前节点是ParameterServer,调用server.join()无尽地等待;if如果是Worker,则执行下一步ifFLAGS.job_name=="ps":server.join()4.构建待训练的模型#buildtensorflowgraphmodel5.创建tf.train.Supervisor来管理worker的训练过程model#Createa"supervisor",whichoverseesthetrainingprocess.sv=tf.train.Supervisor(is_chief=(FLAGS.task_index==0),logdir="/tmp/train_logs")#Thesupervisortakescareofsessioninitializationandrestoringfromacheckpoint.sess=sv.prepare_or_notshoutdown_for_session(server.target)模型#Createa“监督者”,whichoverseesthetrainingprocess.sv=tf.train.Supervisor(is_chief=(FLAGS.task_index==0),logdir="/tmp/train_logs")#Thesupervisortakescareofsessioninitializationandrestoringfromacheckpoint.sess=sv.prepare_or_notshoutdown_for_session(server.target)#Loopuntiltsthewsupervisors(server.target)#LoopuntiltsthewsupervisorstrainmodelUAITrain分布式训练部署UCloudAI训练服务(UCloudAITrain)是面向AI训练任务的大规模分布式计算平台,基于高性能GPU计算节点提供一站式托管AI训练任务服务,用户提交AI训练任务后,无需担心计算节点调度、训练环境准备、数据上传下载、灾难恢复等问题ery。目前UAITrain平台支持TensorFlow和MXNet框架的分布式训练。PS代码和Worker代码需要在同一个代码入口实现。PS和Worker在执行过程中会使用相同的Docker容器镜像和相同的python代码入口执行,系统会自动生成PS和Worker的env环境参数。TensorFlow分布式训练采用PS-Worker的分布式格式,提供python接口运行分布式训练。UCloudAITrain分布式训练采用ParameterServer和WorkerServer混合部署方式,所有计算节点均由GPU物理云主机组成。PS只使用CPU进行计算,而WorkerServer同时使用GPU和CPU进行计算。PS与Worker的比例为1:1。数据存储分布式训练中使用的输入数据和输入数据可以来自不同的数据源。目前,UAITrain仅支持UFS作为数据存储。输入数据存储指定一个UFS网盘作为输入数据源。在训练执行过程中,UAITrain平台会将对应的UFS数据映射到Worker容器的/data/data目录下进行训练执行,系统会自动将数据映射到执行容器中,比如ip:/xxx/数据/imagenet/tf→/数据/数据/。输出数据存储指定UFS网盘作为输出数据源。在训练执行过程中,UAITrain平台会将对应的UFS数据映射到每个PS容器和Worker容器的/data/output目录下进行训练执行,并共享访问相同数据的方式。同时,在训练过程中,可以通过其他云主机实时访问保存的模型checkpoint。案例研究:通过CIFAR-10进行图像识别CIFAR-10是机器学习中常见的图像识别数据集。该数据集共有60,000张彩色图像。这些图像分为10个类别,每个类别有6,000张图像。有50,000张图像用于训练,另有10,000张图像用于测试。http://groups.csail.mit.edu/vision/TinyImages/调整训练代码为了在UAI平台上训练,首先下载源代码,对cifar10_main.py做如下修改:1.添加相关参数:--data_dir,--output_dir,--work_dir,--log_dir,--num_gpus,UAITrain平台会自动生成这些参数;2.在代码中添加UAI参数:使用data_dir配置输入文件夹,使用output_dir配置输出文件夹。具体案例代码可以在https://github.com/ucloud/uai-sdk/tree/master/examples/tensorflow/train/cifar获取在UAITrain平台上进行训练1.根据https://github。com/tensorflow/Models/tree/master/tutorials/image/cifar10_estimator生成CIFAR-10的tfrecords;2、使用UAI-SDK提供的tf_tools.py生成CIFAR-10样本的Docker镜像;3.确保Docker镜像已经上传到UHub,在UAITrain平台上执行。/data/cifar10_main.py--train-batch-size=16UAI平台分布式训练CIFAR-10示例代码使用tf.estimator.EstimatorAPI,只需要一个分布式环境和分布式环境配置直接进行分布式训练,配置需要适用于tf.estimator.EstimatorAPI的标准,即定义一个TF_CONFIG配置。TF_CONFIG={"cluster":{"master":["ip0:2222"],"ps":["ip0:2223","ip1:2223"],"worker":["ip1:2222"]}"task":{"type":"worker","index":0},"environment":"cloud"}UAITrain平台的分布式训练功能可以自动生成GPU集群环境进行TensorFlow分布式训练。为每个训练节点自动生成TF_CONFIG。因此,CIFAR-10在UAITrain平台上的分布式训练与单机训练是一样的。只需要指定输入/输出的UFS地址,执行如下命令:/data/cifar10_main.py--train-batch-size=16总结UAITrainTensorFlow的分布式训练环境实现是基于TensorFlow的分布式训练系统实现,使用默认的grpc协议进行数据交换。PS和Worker混合部署。PS采用纯CPU计算,Worker采用GPU+CPU计算。在UAITrain平台上,可以非常方便的进行分布式计算,提高效率,压缩训练时间。本文最后以CIFAR-10案例分析了在UAITrain平台上训练所需的修改,并在UAITrain平台上进行了分布式训练。
