TensorFlow分布式实践


大数据时代,基于单机的建模很难满足企业不断增长的数据量级的需求,开发者需要使用分布式的开发方式,在集群上进行建模。而单机和分布式的开发代码有一定的区别,本文就将为开发者们介绍,基于TensorFlow进行分布式开发的两种方式,帮助开发者在实践的过程中,更好地选择模块的开发方向。分布式开发会涉及到更新梯度的方式,有同步和异步的两个方案,同步更新的方式在模型的表现上能更快地进行收敛,而异步更新时,迭代的速度则会更加快。两种更新方式的图示如下:同步更新流程
(图片来源:TensorFlow:Large-Scale Machine Learning on Heterogeneous Distributed Systems)异步更新流程
(图片来源:TensorFlow:Large-Scale Machine Learning on Heterogeneous Distributed Systems)TensorFlow是基于ps、work 两种服务器进行分布式的开发。ps服务器可以只用于参数的汇总更新,让各个work进行梯度的计算。首先指定ps 服务器启动参数 –job_name=ps:接着指定work服务器参数(启动两个work 节点) –job_name=work2:之后,上述指定的参数 worker_hosts ps_hosts job_name task_index 都需要在py文件中接受使用:接收参数后,需要分别注册ps、work,使他们各司其职:继而更新梯度。(1)同步更新梯度:(2)异步更新梯度:最后,使用tf.train.Supervisor 进行真的迭代另外,开发者还要注意,如果是同步更新梯度,则还需要加入如下代码:需要注意的是,上述异步的方式需要自行指定集群IP和端口,不过,开发者们也可以借助TensorFlowOnSpark,使用Yarn进行管理。作为个推面向开发者服务的移动APP数据统计分析产品,个数所具有的用户行为预测功能模块,便是基于TensorFlowOnSpark这种分布式来实现的。基于TensorFlowOnSpark的分布式开发使其可以在屏蔽了端口和机器开发云主机域名IP的情况下,也能够做到较好的资源申请和分配。而在多个千万级应用同时建模的情况下,集群也有良好的表现,在sparkUI中也能看到相对应的资源和进程的情况。最关键的是,TensorFlowOnSpark可以在单机过度到分布式的情况下,使代码方便修改,且容易部署。首先,需要使用spark-submit来提交任务,同时指定spark需要运行的参数(–num-executors 6等)、模型代码、模型超参等,同样需要接受外部参数:之后,准备好参数和训练数据(DataFrame),调用模型的API进行启动。其中,soft_dist.map_fun是要调起的方法,后面均是模型训练的参数。接下来是soft_dist定义一个 map_fun(args, ctx)的方法:之后,可以使用tf.train.MonitoredTrainingSession高级API,进行模型训练和预测。基于TensorFlow的分布式开发大致就是本文中介绍的两种情况,第二种方式可以用于实际的生产环境,稳定性会更高。在运行结束的时候,开发者们也可通过设置邮件的通知,及时地了解到模型运行的情况。同时,如果开发者使用SessionRunHook来保存最后输出的模型,也需要了解到,框架代码中的一个BUG,即它只能在规定的时间内保存,超出规定时间,即使运行没有结束,程序也会被强制结束。如果开发者使用的版本是未修复BUG的版本,则要自行处理,放宽运行时间。

相关推荐: linux访问ftp服务器时出现中文乱码怎么办

这篇文章主要为大家详细介绍了linux访问ftp服务器时出现中文乱码怎么办,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。问题:在Linux下访问windows ftp服务器时,出现中文乱码的问题。原因:这是由于中文编码不同的问…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/02 11:46
下一篇 04/02 11:46