在 Tensorflow Federated 中测量执行时间的推荐方法

Recommended way of measuring execution time in Tensorflow Federated

我想知道在 Tensorflow Federated 中是否有推荐的测量执行时间的方法。更具体地说,如果想提取某一轮中每个客户端的执行时间,例如,对于 FedAvg 轮中涉及的每个客户端,保存本地训练开始之前的时间戳和发送回之前的时间戳更新,执行此操作的最佳(或正确)策略是什么?此外,由于客户端的代码 运行 是并行的,这样的时间戳是不是不真实的(特别是考虑到不同客户端可能使用不同大小的模型进行本地训练的假设)?

非常实用,在@tf.function的开头和结尾使用tf.timestamp() client_update(model, dataset, server_message, client_optimizer)——这可能是一个简化的签名——然后减去这样的时间戳合适吗?

鉴于客户端 运行 在同一台机器上并行运行,我感觉这不是正确的方法。

感谢任何可以帮助我的人。

有多个潜在的地方可以衡量执行时间,首先可能是非常具体地定义预期的衡量标准。

  1. 按照建议测量每个客户的培训时间是了解客户之间差异的好方法。这有助于确定回合中是否经常有散兵游勇。使用 tf.timestamp() at the beginning and end of the client_update function seems reasonable. The question correctly notes that this happens in parallel, summing all of these times would be akin to CPU time.

  2. 测量一轮完成所有客户培训所需的时间通常是上述值中的最大值。在 TFF 中模拟 FL 时,这可能不是真的,因为 TFF 可能由于系统资源限制而决定按顺序 运行 一些客户端。实际上,所有这些客户端都会 运行 并行。

  3. 测量完成一整轮所需的时间(运行 客户端所需的最长时间,加上服务器更新所需的时间)可以通过以下方式完成将 tf.timestamp 调用移至外部训练循环。这将在 https://www.tensorflow.org/federated. This would be most similar to elapsed real time (wall clock time).

    的片段中包装对 trainer.next() 的调用