ТПУ терминологическая путаница
Так что я знаю, как определяются эпохи, этапы обучения, размеры пакетов и тому подобное, но мне очень трудно обернуть голову вокруг терминологии TPU, такой как циклы поезда, итерации для цикла и так далее. Я читал это, но я все еще в замешательстве.
Также, как я могу сравнить время для итераций для цикла, например.
Любое объяснение мне очень помогло бы там. Спасибо!
3 ответа
"Поездная петля", я предполагаю, что это то же значение, что и "тренировочная петля". Обучающий цикл - это цикл, который проходит через каждую эпоху, чтобы питать модель.
Количество итераций в цикле связано с тем, как Cloud TPU обрабатывает цикл обучения. Чтобы амортизировать стоимость запуска TPU, этап обучения модели заключен в tf. while_loop, так что один запуск сеанса фактически выполняет много итераций для одного цикла обучения.
Из-за этого Cloud TPU выполняет заданное количество итераций цикла обучения, прежде чем вернуться на хост. Следовательно, iterations_per_loop - это количество итераций, которые будут выполняться за один вызов session.run.
Как описали другие ответы, 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) градиент вычисляется на каждой итерации из среднего значения градиента для каждого примера в пакете. Выполнение 50 шагов на 50 тыс. Примеров приведет к отличному результату от 1 тыс. Шагов на 50 тыс. Примеров, поскольку в последнем случае вычисление градиента выполняется гораздо чаще.
РЕДАКТИРОВАТЬ 2: Ниже представлен способ визуализации происходящего с помощью гоночной метафоры. Думайте о ТПУ как о гонке, которая имеет дистанцию train_steps
примеры, и его шаг позволяет ему покрыть серию примеров за шаг. Гонка проходит по трассе, которая короче общей дистанции гонки; длина круга - это общее количество тренировочных примеров, и каждый круг на трассе - одна эпоха. Вы можете думать о iterations_per_loop
как точка, в которой TPU может остановиться на "водной станции", где обучение временно приостанавливается для выполнения различных задач (бенчмаркинг, контрольно-пропускные пункты, другие операции по дому).
TPU буквально означает "Tensor Processing Unit", это аппаратное устройство, используемое для вычислений точно так же, как и графический процессор. TPU являются собственными графическими процессорами Google. Существуют технические различия между графическим процессором и ТПУ, в основном касающиеся скорости и энергопотребления, а также некоторые проблемы точности с плавающей запятой, но вам не нужно заботиться о деталях.
iterations_per_loop
По-видимому, это попытка повысить эффективность путем загрузки ТПУ несколькими тренировочными партиями. При передаче больших объемов данных из основной памяти в GPU / TPU часто возникают аппаратные ограничения пропускной способности.
Похоже, что код, на который вы ссылаетесь, передается iterations_per_loop
количество тренировочных партий в ТПУ, затем работает iterations_per_loop
количество этапов обучения перед паузой для повторной передачи данных из основной памяти в память TPU.
Я довольно удивлен, увидев, что, тем не менее, я ожидаю, что асинхронная фоновая передача данных станет возможной уже сейчас.
Мой единственный отказ от ответственности заключается в том, что, хотя я хорошо знаком с Tensorflow и наблюдаю за эволюцией TPU в статьях и статьях, у меня нет непосредственного опыта работы с API Google или работы с TPU, поэтому я делаю выводы из того, что я прочитал в документация, на которую вы ссылались.