ТПУ терминологическая путаница

Так что я знаю, как определяются эпохи, этапы обучения, размеры пакетов и тому подобное, но мне очень трудно обернуть голову вокруг терминологии 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 может остановиться на "водной станции", где обучение временно приостанавливается для выполнения различных задач (бенчмаркинг, контрольно-пропускные пункты, другие операции по дому).

ТПУ ML Тренировочная петля

TPU буквально означает "Tensor Processing Unit", это аппаратное устройство, используемое для вычислений точно так же, как и графический процессор. TPU являются собственными графическими процессорами Google. Существуют технические различия между графическим процессором и ТПУ, в основном касающиеся скорости и энергопотребления, а также некоторые проблемы точности с плавающей запятой, но вам не нужно заботиться о деталях.

iterations_per_loop По-видимому, это попытка повысить эффективность путем загрузки ТПУ несколькими тренировочными партиями. При передаче больших объемов данных из основной памяти в GPU / TPU часто возникают аппаратные ограничения пропускной способности.

Похоже, что код, на который вы ссылаетесь, передается iterations_per_loop количество тренировочных партий в ТПУ, затем работает iterations_per_loop количество этапов обучения перед паузой для повторной передачи данных из основной памяти в память TPU.

Я довольно удивлен, увидев, что, тем не менее, я ожидаю, что асинхронная фоновая передача данных станет возможной уже сейчас.

Мой единственный отказ от ответственности заключается в том, что, хотя я хорошо знаком с Tensorflow и наблюдаю за эволюцией TPU в статьях и статьях, у меня нет непосредственного опыта работы с API Google или работы с TPU, поэтому я делаю выводы из того, что я прочитал в документация, на которую вы ссылались.

Другие вопросы по тегам