【发布时间】:2019-02-19 11:25:39
【问题描述】:
所以我知道如何定义 epoch、训练步数、批量大小和这类东西,但我真的很难理解 TPU 术语,比如训练循环、每个循环的迭代次数等等。我读了this,但我仍然感到困惑。
例如,我如何对每个循环的迭代时间进行基准测试。
任何解释都会对我有很大帮助。谢谢!
【问题讨论】:
标签: tensorflow google-cloud-platform google-compute-engine google-cloud-tpu
所以我知道如何定义 epoch、训练步数、批量大小和这类东西,但我真的很难理解 TPU 术语,比如训练循环、每个循环的迭代次数等等。我读了this,但我仍然感到困惑。
例如,我如何对每个循环的迭代时间进行基准测试。
任何解释都会对我有很大帮助。谢谢!
【问题讨论】:
标签: tensorflow google-cloud-platform google-compute-engine google-cloud-tpu
正如其他答案所描述的,iterations_per_loop 是一个调整参数,用于控制 TPU 在再次签入之前完成的工作量。较小的数字可让您更频繁地检查结果(并对其进行基准测试),而较大的数字可减少同步带来的开销。
这与熟悉的网络或文件缓冲技术没有什么不同;更改其值会影响性能,但不会影响您的最终结果。相比之下,num_epochs、train_steps 或 train_batch_size 等 ML 超参数会改变您的结果。
编辑:在下面添加伪代码插图。 理论上, 训练循环的功能如下:
def process_on_TPU(examples, train_batch_size, iterations_per_loop):
# The TPU will run `iterations_per_loop` training iterations before returning to the host
for i in range(0, iterations_per_loop):
# on every iteration, the TPU will compute `train_batch_size` examples,
# calculating the gradient from every example in the given batch
compute(examples[i * train_batch_size : (i + 1) * train_batch_size])
# assume each entry in `example` is a single training example
for b in range(0, train_steps, train_batch_size * iterations_per_loop)
process_on_TPU(examples[b:b + train_batch_size * iterations_per_loop],
train_batch_size,
iterations_per_loop)
由此看来,train_batch_size 和iterations_per_loop 似乎只是完成同一件事的两种不同方式。然而,这种情况并非如此; train_batch_size 影响学习率,因为(至少在 ResNet-50 中)梯度是在每次迭代时根据批次中每个示例的梯度平均值计算的。每 50k 示例采取 50 步将产生与每 50k 示例采取 1k 步不同的结果,因为后一种情况更频繁地计算梯度。
编辑 2: 下面是一种可视化正在发生的事情的方法,带有赛车的比喻。将 TPU 想象成一场距离为 train_steps 示例的比赛,它的步幅让它每一步覆盖一批示例。比赛在比总比赛距离短的赛道上进行;单圈的长度是你的训练样本总数,赛道上的每一圈都是一个 epoch。您可以将iterations_per_loop 视为 TPU 可以停在某种“水站”的点,在该点上,训练会因各种任务(基准测试、检查点、其他内务管理)而暂时暂停。
【讨论】:
train_batch_size * iterations_per_loop。我添加了一幅漫画来帮助说明训练循环。
+1
通过“火车循环”,我假设它与"training loop" 的含义相同。训练循环是遍历每个 epoch 以便为模型提供数据的循环。
每个循环的迭代次数与 Cloud TPU 处理训练循环的方式有关。为了分摊 TPU 启动成本,模型训练步骤被包装在一个 tf.while_loop 中,这样一个 Session 运行实际上会为一个训练循环运行多次迭代。
正因为如此,Cloud TPU 会在返回主机之前运行指定次数的训练循环迭代。因此,iterations_per_loop 是一个 session.run 调用将运行多少次迭代。
【讨论】:
TPU 的字面意思是“张量处理单元”,它是一种用于计算的硬件设备,与使用 GPU 的方式完全相同。 TPU 实际上是 Google 专有的 GPU。 GPU 与 TPU 之间存在技术差异,主要是关于速度和功耗,以及浮点精度的一些问题,但您无需关心细节。
iterations_per_loop 似乎是通过向 TPU 加载多个训练批次来提高效率。将大量数据从主存传输到 GPU/TPU 时,通常存在硬件带宽限制。
您引用的代码似乎将 iterations_per_loop 训练批次数传递给 TPU,然后运行 iterations_per_loop 训练步数,然后暂停以从主内存向 TPU 内存进行另一次数据传输。
虽然我很惊讶地看到这一点,但我希望异步后台数据传输现在成为可能。
我唯一的免责声明是,虽然我精通 Tensorflow,并且在论文和文章中看过 TPU 的演变,但我没有直接体验过 Google API 或在 TPU 上运行,所以我从您链接到的文档中阅读的内容推断。
【讨论】: