所以我知道如何定义 epochs、train steps、batch size 和这类东西,但我真的很难理解 TPU 术语,比如 train loops、iterations per loop 等等。我读了这个,但我仍然感到困惑。
另外,例如,我如何对每个循环的迭代时间进行基准测试。
任何解释都会对我有很大帮助。谢谢!
所以我知道如何定义 epochs、train steps、batch size 和这类东西,但我真的很难理解 TPU 术语,比如 train loops、iterations per loop 等等。我读了这个,但我仍然感到困惑。
另外,例如,我如何对每个循环的迭代时间进行基准测试。
任何解释都会对我有很大帮助。谢谢!
正如其他答案所描述的,iterations_per_loop
是一个调整参数,用于控制 TPU 在再次签入之前完成的工作量。较小的数字可让您更频繁地检查结果(并对其进行基准测试),而较高的数字可减少同步导致的开销。
这与熟悉的网络或文件缓冲技术没有什么不同;更改其值会影响性能,但不会影响您的最终结果。相反,ML 超参数如num_epochs
、train_steps
或train_batch_size
会改变你的结果。
编辑:在伪代码中添加插图,如下。 从概念上讲,训练循环的功能如下:
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 视为可以在某种“水站”处停止的点,在该点上,训练暂时暂停以执行各种任务(基准测试、检查点、其他内务管理)。
通过“训练循环”,我假设它与“训练循环”的含义相同。训练循环是遍历每个 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 上运行,所以我从我在您链接到的文档。