【发布时间】: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