horovod tensorflow 分布式多gpu_horovod.tensorflow_青盏的博客-程序员秘密

技术标签: DL tools  

概念
rank is your index within the entire ring, local_rank is your index within your node. For example, you have 4 nodes and 4 GPUs each node, so you spawn 16 workers. Every worker will have a rank [0, 15], and every worker will have a local_rank [0, 3]. You use local_rank for GPU pinning because there’s typically one GPU available on the node per process. It wouldn’t make sense to use rank here because rank could be 10, but you only have 4 GPUs so there is no GPU 10.

# 在其他import前引入
try:
    import horovod.tensorflow as hvd
    hvd.init()
except Exception as e:
    hvd = None
    print('no horovod')

# 打印信息
if hvd:
    tf.logging.info('Total workers: {}, local workers: {}'.format(
        hvd.size(), hvd.local_size()))
    tf.logging.info('Global rank: {}, local rank: {}'.format(
        hvd.rank(), hvd.local_rank()))

# 数据集读取配置:对数据集进行分片, 不同进程读取不同子集。
d = tf.data.TFRecordDataset(input_file)
if is_training:
    if hvd is not None:
        d = d.shard(hvd.size(), hvd.rank())
    d = d.shuffle(buffer_size=100)
    d = d.repeat()

# 加载权重配置:只对第一个rank载入权重
if init_checkpoint and is_training and (hvd is None or hvd.rank()==0):
    for init_file in init_checkpoint.split(","):
        assignment_map, tmp_init_map = get_assignment_map_from_checkpoint(tvars, init_file, extra_load_var)
        tf.train.init_from_checkpoint(init_file, assignment_map)
        initialized_variable_names.update(tmp_init_map)

# 学习率调整:
if hvd:
    learning_rate = learning_rate * hvd.size()

# 分布式优化器配置:使用 ring-allreduce 平均梯度
if hvd is not None:
    # we enable compression only for fp16
    from horovod.tensorflow.compression import Compression
    if use_fp16:
        compression = Compression.fp16
    else:
        compression = Compression.none

    optimizer = hvd.DistributedOptimizer(optimizer, sparse_as_dense=True,
                                         compression=compression)

# 配置每个进程模型迭代次数
if FLAGS.do_train:
    # train_examples = processor.get_train_examples(FLAGS.data_dir, FLAGS.img_dir)
    num_train_steps = int(
        train_num / FLAGS.train_batch_size * FLAGS.num_train_epochs)
        # len(train_examples) / FLAGS.train_batch_size * FLAGS.num_train_epochs)
    num_warmup_steps = int(num_train_steps * FLAGS.warmup_proportion)

    if hvd:
        num_train_steps = num_train_steps // hvd.size()

model_fn = model_fn_builder(
    bert_config=bert_config,
    num_labels=len(label_list),
    init_checkpoint=FLAGS.init_checkpoint,
    learning_rate=FLAGS.learning_rate,
    num_train_steps=num_train_steps,
    num_warmup_steps=num_warmup_steps)

# GPU config GPU配置:使用local rank分配当前机器上当前进程可视gpu
run_config = tf.ConfigProto()
# train_params.get('gpu_allow_growth', False)
run_config.gpu_options.allow_growth = True
run_config.allow_soft_placement = True

if hvd:
    run_config.gpu_options.visible_device_list = str(hvd.local_rank())

if FLAGS.use_xla:
    run_config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1

# checkpoint配置:只对第一个保存模型
save_checkpoints_steps = FLAGS.save_checkpoints_steps if hvd is None or hvd.rank() == 0 else None
estimator = tf.estimator.Estimator(
    model_fn=model_fn,
    model_dir=FLAGS.output_dir,
    config=tf.estimator.RunConfig(
        save_checkpoints_steps=save_checkpoints_steps,
        save_checkpoints_secs=None,
        keep_checkpoint_every_n_hours=2,
        log_step_count_steps=400,
        session_config=run_config))


# 模型训练hook配置:将变量从第一个流程向其他流程传播,以实现一致性初始化。
if FLAGS.do_train and hvd is not None:
    training_hook = [hvd.BroadcastGlobalVariablesHook(0)]
else:
    training_hook = []
estimator.train(input_fn=train_input_fn, max_steps=num_train_steps,
                hooks=training_hook)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_16234613/article/details/96186398

智能推荐

modbus tcp主站和从站_ModBus的加深理解与实际应用举例_weixin_39907316的博客-程序员秘密

今天主要讲一下怎么更加用简单的方式去理解ModBus协议。(一)什么是协议ModBus是一种协议,可以理解成一种语言。比如小王说的是汉语,小张说的是英语,如果小王和小张路上碰见了,那小王说了一堆,小张啥也听不懂。所以如果小王和小张想要交流沟通,弄清楚对方说什么话,首先他俩就得使用同一种语言。现在小王和小张现在都学会汉语了,准备沟通了,他俩可以说话沟通、可以打字微信聊天,都可以交流。说话沟...

js获取当前日期时间“yyyy-MM-dd HH:MM:SS”_weixin_30325793的博客-程序员秘密

获取当前的日期时间 格式“yyyy-MM-dd HH:MM:SS”1234567891011121314151617function getNowFormatDate() {vardate =newDate();varseperator1 ="-";...

Android Studio使用过程中遇到的几个问题小记_ChatGPTer的博客-程序员秘密

1、Android Studio的代理设置Android Studio 3.x在Setting里面设置了Proxy后,AS会自动在gradle.properties里面自动生成:systemProp.http.proxyHost=127.0.0.1-->代理IPsystemProp.http.proxyPort=1080→代理端口然而,注意,然而,在Setting里面取消了这个Proxy后(选择:

java中for循环嵌套执行顺序_Java优化for循环嵌套的高效率方法_weixin_39885683的博客-程序员秘密

前几天有人问过我一个问题,就是两个嵌套for循环执行效率的问题,问有什么好的办法替换。当时我想了想,实在想不起来,哎,惭愧!!! 请教了答案,恍然大悟。比如:两个list中分别装有相同的对象数据。 list1中有3万条对象数据。 list2中有2万条对象数据(但是对象中的某个属性变量为空)。两个list中的id或者其他变量都一模一样。请用最快的方式找出list2中变量为空的那个对象,并且去list...

UVA - 507 - Jill Rides Again (dp最大子段和)_uva507_HelloWorld10086的博客-程序员秘密

题目大意:Jill喜欢骑自行车,但是自从他的城市有了公交系统后,他就比较少骑车了,于是他买了一个折叠自行车,这样他就可以把自行车带到公交车上,当他下车后,他就可以继续骑车。现在b条道路,每条道路有n个公交站点,两个站点间都有一个喜欢值,现在问你能否求出,哪两个站点间的喜欢值最大,如果有多个最大值,输出其中距离最远的站点。解析:题如果用普通枚举起点和终点的O(n^3)肯定超时

二叉树的前中后序遍历:递归法+迭代法_二叉树 前序 迭代_尚墨1111的博客-程序员秘密

文章目录前言一、二叉树的代码二、递归法1.二叉树的前、中、后序的递归遍历三、迭代法1.前序遍历2.后序遍历2.中序遍历总结扩展:判断单值二叉树前言本文总结自LeetCode的题库,其中代码参考题解,题解中还有许多其他的方法,本文代码以简洁易理解为基本要求。这里也不对二叉树的基本知识进行讲解,只对实现的代码进行解释介绍提示:以下是本篇文章正文内容,下面案例可供参考一、二叉树的代码二叉树节点的最简单结构class TreeNode { int val; TreeNode le.

随便推点

perl学习笔记_perl教程 规则表达式 if_if.else.Z的博客-程序员秘密

例:简单的perl程序#!/usr/bin/perlprint“Hello,word!\n”; #!后表示pel的存放路径在Perl 中,注释由#开始,直到本行结束,Perl 中没有“块注释” perl语言中的一些特殊字符的意义1。“->"是插入式解引用操作符,它是调用由引用传递参数的子程序的方法2。”=>"是逗号的代替号3。“::"相当于c语言的点,好比C

Standard C Library - 思维火花 - 博客频道 - CSDN.NET_a13393665983的博客-程序员秘密

Standard C Library - 思维火花 - 博客频道 - CSDN.NET Standard C Library - 思维火花 - 博客频道 - CSDN.NETThe return value of signal() is the address of...

微信小程序获取滚动条高度_微信小程序入门与实战仿网易云音乐_weixin_39609503的博客-程序员秘密

本课程属于JavaEEA 计划,不单独售卖,加入 A 计划可免费观看本课程及所有JavaEE收费课程~JavaEE A 计划一年有效期购买链接:http://www.sikiedu.com/classroom/12/introduction课程介绍:手机上的音乐播放软件是现代年轻人上下班以及闲暇时间不可或缺的app,但是它的模样却千篇一律没有个性,同学们想不想拥有一个专属于自己的...

SPDIF 色差输出 视频输出 S-Video YUV YCbCr YPbPr RGB VGA WXGA 分别的详细介绍 视频方式接口简介_小K仔的博客-程序员秘密

SPDIF 色差输出 视频输出 S-Video YUV YCbCr YPbPr RGB VGA WXGA 分别的详细介绍 视频方式接口简介2008年04月05日 星期六 00:27SPDIF数字式的音频输出。SPDIF是SONY、PHILIPS数字音频接口的简称。就传输方式而言,SPDIF分为输出(SPDIF OUT)和输入(SPDIF IN)两种。目前大多数的声卡

2017杭电多校联赛-Function_多校赛function [email protected]皮皮猪的博客-程序员秘密

FunctionTime Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1594    Accepted Submission(s): 302Problem DescriptionYou are given a

推荐文章

热门文章

相关标签