multithreading - 为什么最初在 tensorflow 训练中看到每秒的步数峰值?

标签 multithreading tensorflow tensorflow-datasets

嗨tensorflow专家,

我看到以下使用数据集API和预取128、256、512或1024批次(每个128个示例)的训练速度配置文件:

INFO:tensorflow:Saving checkpoints for 0 into

INFO:tensorflow:loss = 0.969178, step = 0
INFO:tensorflow:global_step/sec: 70.3812
INFO:tensorflow:loss = 0.65544295, step = 100 (1.422 sec)
INFO:tensorflow:global_step/sec: 178.33
INFO:tensorflow:loss = 0.47716027, step = 200 (0.560 sec)
INFO:tensorflow:global_step/sec: 178.626
INFO:tensorflow:loss = 0.53073615, step = 300 (0.560 sec)
INFO:tensorflow:global_step/sec: 132.039
INFO:tensorflow:loss = 0.4849593, step = 400 (0.757 sec)
INFO:tensorflow:global_step/sec: 121.437
INFO:tensorflow:loss = 0.4055175, step = 500 (0.825 sec)
INFO:tensorflow:global_step/sec: 122.379
INFO:tensorflow:loss = 0.28230205, step = 600 (0.817 sec)
INFO:tensorflow:global_step/sec: 122.163
INFO:tensorflow:loss = 0.4917924, step = 700 (0.819 sec)
INFO:tensorflow:global_step/sec: 122.509

每秒178步的初始峰值可在多次运行和不同的预取量之间重现。我试图了解为什么会发生这种情况的底层多线程机制。

附加信息:
在48核计算机上,我的CPU使用率最高达到1800%。我的GPU使用率始终只有9%。因此,令人惊奇的是这两个都没有用尽。所以我想知道queue_runner中的互斥是否导致cpu处理无法充分发挥其潜力,如here所述?

谢谢,

约翰

[更新]当我使用类似缓冲区大小的prefetch_to_device(gpu_device,..)时,我也观察到了相同的峰值。令人惊讶的是,prefetch_to_device只会减慢速度,大约降低10%。
NFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 0 into 

INFO:tensorflow:loss = 1.3881096, step = 0
INFO:tensorflow:global_step/sec: 52.3374
INFO:tensorflow:loss = 0.48779136, step = 100 (1.910 sec)
INFO:tensorflow:global_step/sec: 121.154
INFO:tensorflow:loss = 0.3451385, step = 200 (0.827 sec)
INFO:tensorflow:global_step/sec: 89.3222
INFO:tensorflow:loss = 0.37804496, step = 300 (1.119 sec)
INFO:tensorflow:global_step/sec: 80.4857
INFO:tensorflow:loss = 0.49938473, step = 400 (1.242 sec)
INFO:tensorflow:global_step/sec: 79.1798
INFO:tensorflow:loss = 0.5120025, step = 500 (1.263 sec)
INFO:tensorflow:global_step/sec: 81.2081

最佳答案

在每次训练开始时,通常会看到每秒峰值步数,这是因为CPU有时间填充缓冲区。与开始相比,您的每秒步数非常合理,但是缺少CPU使用率可能表明存在瓶颈。

第一个问题是,是否将Dataset API与估算器结合使用。从您的终端输出中,我怀疑您会这样做,如果没有,我会先将代码更改为使用Estimator类。如果您已经在使用Estimator类,请确保遵循here中记录的最佳性能实践。

如果您已经完成上述所有操作,那么管道中就会出现瓶颈。由于CPU使用率低,我猜您正在遇到I/O瓶颈。您的数据集可能存储在慢速介质(硬盘驱动器)上,或者您没有使用序列化格式,并且使IOPS饱和(再次是硬盘驱动器或网络存储)。无论哪种情况,都应先使用诸如TF记录之类的序列化数据格式,然后将存储升级到SSD或多个硬盘中,然后按1,0,10的选择进行选择。

关于multithreading - 为什么最初在 tensorflow 训练中看到每秒的步数峰值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51574114/

相关文章:

ios - 如何检查 Swift/Xcode 中的线程/队列层次结构?

c++ - 增加计数器时避免竞争条件

c - 与没有互斥锁的工作线程交互

python - TensorFlow 数据不适用于多输入 keras 模型

tensorflow 数据集 shuffle 然后批处理或批处理然后 shuffle

python - 将 tf.dataset 作为字典的键传递

c++ - 在多线程 C++11 程序中未处理异常时会发生什么?

python-3.x - 在 tensorflow 中获取随机 Gamma 分布,如 numpy.random.gamma

python - 将 .pb 文件转换为 .ckpt (tensorflow)

python - 在 tensorflow 中对不平衡数据集进行二次采样