【问题标题】:How to control reduction strategy for stateful metric in keras mirrored strategy如何在 keras 镜像策略中控制状态度量的缩减策略
【发布时间】:2021-03-19 15:46:43
【问题描述】:

我使用 keras fit() 方法将自定义指标传递给模型。 指标是有状态的——即是Metric 的子类,如https://keras.io/api/metrics/#as-subclasses-of-metric-stateful 中所述 当我使用 tf.distribute.MirroredStrategy() 在多 GPU 环境中运行代码时,我的度量代码在每个 GPU 上分别调用,并传递了 batch_size/no_of_gpus 示例,这是合理的预期。

接下来发生的是度量值的多个标量(每个 GPU 一个)需要减少为单个标量,而我一直得到的是 sum 减少,而我想控制它. 请记住,reduction 参数是 keras 中的Loss 之一,而Metric 类中没有这样的东西:https://github.com/tensorflow/tensorflow/blob/acbc065f8eb2ed05c7ab5c42b5c5bd6abdd2f91f/tensorflow/python/keras/metrics.py#L87

(我尝试过的唯一疯狂的事情是从 Mean 类继承,该类是 Metric 的子类,但这并没有改变任何东西)

reduction 在指标代码中被提及,但是这是对单个指标对象中多个累积值的缩减,并且在多 GPU 设置中 - 情况并非如此,因为每个指标都在其自己的 GPU 中工作,并且最后以某种方式聚合。

我调试它以了解这种行为的方式是 - 我在度量的 update_state 方法中打印形状和结果。然后我在on_batch_end 回调中查看了logs 对象中的度量值。

我尝试查看 TF 代码,但找不到发生这种情况的地方。 我希望能够控制这种行为 - 所以要么选择“平均值”或“总和”作为指标,或者至少知道它在代码中的位置。

已编辑:我想https://github.com/tensorflow/tensorflow/issues/39268 对这个问题有更多的了解

【问题讨论】:

    标签: tensorflow keras multi-gpu


    【解决方案1】:

    我和你面临同样的问题(这就是我发现你的问题的原因)。

    看到你问这个问题已经 15 天了,还没有答案/cmets,我想我可以分享一下我的临时解决方法。

    和你一样,我也认为在多个 GPU 上组合进度时已经执行了 SUM 缩减。我所做的是将 GPU 的数量(例如,由您的 tf.distribute 策略对象的 num_replicas_in_sync 属性给出)传递给您的子类度量对象的 __init__(...) 构造函数,并使用它将返回值划分为results() 方法。

    您还可以在度量对象中使用tf.distribute.get_strategy() 使其“具有战略意识”,并使用该信息来决定如何以ad hoc 方式修改值,以便SUM 减少会产生你想要的。

    我希望这对现在有所帮助,无论是作为建议还是作为确认您并不孤单。

    【讨论】:

    • 谢谢。我感觉好多了,我们并不孤单,所以这个问题看起来很真实。我考虑过您提出的相同解决方案。然而,这是一个 hack,它打破了“指标”是什么以及这个类应该是什么的逻辑。
    猜你喜欢
    • 2019-07-27
    • 2017-03-19
    • 2019-08-24
    • 1970-01-01
    • 2011-06-30
    • 2018-07-17
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多