Spec-Zone.ru › TensorFlow 2.3

tf.tpu.experimental.embedding.TPUEmbedding

API TPUEmbedding среднего уровня.

Просмотр псевдонимов

Псевдонимы совместимости для миграции

См. Руководство по миграции для получения дополнительных сведений.

tf.compat.v1.tpu.experimental.embedding.TPUEmbedding

tf.tpu.experimental.embedding.TPUEmbedding(
    feature_config, batch_size, optimizer,
    pipeline_execution_with_tensor_core=False, initialize_tpu_embedding=True
)
Примечание: При создании экземпляра в рамках TPUStrategy, этот класс может быть создан только один раз за вызов tf.tpu.experimental.initialize_tpu_system. Если вы хотите повторно инициализировать движок встраивания, вы также должны повторно инициализировать tpu. Это очистит все переменные с TPU, поэтому убедитесь, что вы создали контрольную точку перед этим. Если требуется дальнейшее создание экземпляров класса, установите аргумент initialize_tpu_embedding в значение False.

Этот класс можно использовать для поддержки обучения больших встраиваний на TPU. При создании экземпляра этого класса необходимо указать полный набор таблиц и признаков, которые ожидается найти в этих таблицах. См. документацию tf.tpu.experimental.embedding.TableConfig и tf.tpu.experimental.embedding.FeatureConfig для получения подробной информации о полном наборе параметров. Здесь мы рассмотрим основное использование.

Примечание: несколько FeatureConfig объектов могут использовать один и тот же объект TableConfig, позволяя разным признакам использовать одну и ту же таблицу:
table_config_one = tf.tpu.experimental.embedding.TableConfig(
    vocabulary_size=...,
    dim=...)
table_config_two = tf.tpu.experimental.embedding.TableConfig(
    vocabulary_size=...,
    dim=...)
feature_config = {
    'feature_one': tf.tpu.experimental.embedding.FeatureConfig(
        table=table_config_one),
    'feature_two': tf.tpu.experimental.embedding.FeatureConfig(
        table=table_config_one),
    'feature_three': tf.tpu.experimental.embedding.FeatureConfig(
        table=table_config_two)}

Существует два режима использования класса TPUEmbedding. Это зависит от того, создан ли класс в рамках области TPUStrategy или нет.

В рамках TPUStrategy, мы разрешаем доступ к методу enqueue, dequeue и apply_gradients. Ниже приведены примеры использования этих методов для обучения и оценки вашей модели. В случае с CPU, доступен только свойство embedding_tables, которое предоставляет доступ к таблицам встраивания, что позволяет использовать их для выполнения оценки/предсказания модели на CPU.

Сначала рассмотрим режим TPUStrategy. Настройка выглядит следующим образом:

strategy = tf.distribute.TPUStrategy(...)
with strategy.scope():
  embedding = tf.tpu.experimental.embedding.TPUEmbedding(
      feature_config=feature_config,
      batch_size=1024,
      optimizer=tf.tpu.experimental.embedding.SGD(0.1))

При создании распределенного набора данных, который должен быть передан в операцию очереди, должен быть указан специальный параметр ввода:

distributed_dataset = (
    strategy.experimental_distribute_datasets_from_function(
        dataset_fn=...,
        options=tf.distribute.InputOptions(
            experimental_prefetch_to_device=False))
dataset_iterator = iter(distributed_dataset)

Для использования этого API на TPU необходимо использовать пользовательский цикл обучения. Ниже приведен пример шага обучения и оценки:

@tf.function
def training_step(dataset_iterator, num_steps):
  def tpu_step(tpu_features):
    with tf.GradientTape() as tape:
      activations = embedding.dequeue()
      tape.watch(activations)
      model_output = model(activations)
      loss = ...  # some function of labels and model_output

    embedding_gradients = tape.gradient(loss, activations)
    embedding.apply_gradients(embedding_gradients)
    # Insert your model gradient and optimizer application here

  for _ in tf.range(num_steps):
    embedding_features, tpu_features = next(dataset_iterator)
    embedding.enqueue(embedding_features, training=True)
    strategy.run(tpu_step, args=(embedding_features, ))

@tf.function
def evalution_step(dataset_iterator, num_steps):
  def tpu_step(tpu_features):
    activations = embedding.dequeue()
    model_output = model(activations)
    # Insert your evaluation code here.

  for _ in tf.range(num_steps):
    embedding_features, tpu_features = next(dataset_iterator)
    embedding.enqueue(embedding_features, training=False)
    strategy.run(tpu_step, args=(embedding_features, ))
Примечание: Вызовы к enqueue имеют training установленным в True при использовании embedding.apply_gradients и установленным в False при отсутствии embedding.apply_gradients в функции. Если вы не следуете этой схеме, вы можете вызвать ошибку или заблокировать tpu.

В приведенных выше примерах предполагается, что пользователь имеет набор данных, возвращающий кортеж, где первый элемент кортежа соответствует структуре, переданной как аргумент feature_config инициализатору объекта. Также мы используем tf.range для получения tf.while_loop с целью повышения производительности.

При создании контрольной точки вашей модели необходимо включать в неё объект tf.tpu.experimental.embedding.TPUEmbedding. Это отслеживаемый объект, и его сохранение позволит сохранить таблицы встраивания и переменные оптимизатора слотов:

checkpoint = tf.train.Checkpoint(model=model, embedding=embedding)
checkpoint.save(...)

На CPU доступно только свойство embedding_table. Это позволит восстановить контрольную точку в объекте и получить доступ к переменным таблиц:

model = model_fn(...)
embedding = tf.tpu.experimental.embedding.TPUEmbedding(
    feature_config=feature_config,
    batch_size=1024,
    optimizer=tf.tpu.experimental.embedding.SGD(0.1))
checkpoint = tf.train.Checkpoint(model=model, embedding=embedding)
checkpoint.restore(...)

tables = embedding.embedding_tables

Теперь вы можете использовать таблицу в функциях, таких как tf.nn.embedding_lookup, для выполнения поиска встраивания и передачи в вашу модель.

Аргументы
feature_config Вложенная структура конфигураций tf.tpu.experimental.embedding.FeatureConfig.
batch_size Глобальный размер пакета, который вы намерены использовать. Обратите внимание, что он фиксирован, и для обучения и оценки должен использоваться один и тот же размер пакета.
optimizer Экземпляр одного из tf.tpu.experimental.embedding.SGD, tf.tpu.experimental.embedding.Adagrad или tf.tpu.experimental.embedding.Adam.
pipeline_execution_with_tensor_core Если True, вычисления TPU-встраивания будут перекрываться с вычислениями TensorCore (и, следовательно, будут на один шаг отставать). Установите в True для улучшения производительности.
initialize_tpu_embedding Если False, движок TPU-встраивания не будет инициализирован. Если это значение установлено в False, а другой экземпляр этого класса не инициализировал движок TPU-встраивания, создание этого объекта завершится ошибкой.
Возможные исключения
ValueError Если оптимизатор не является одним из tf.tpu.experimental.embedding.(SGD, Adam или Adagrad).
Атрибуты
embedding_tables Возвращает словарь таблиц встраивания, индексированный по TableConfig.

Это свойство работает только в том случае, если объект TPUEmbedding создан вне стратегии TPU. Оно предназначено для использования в поиске на CPU при создании контрольной точки серверного API.

Методы

apply_gradients

Просмотреть исходный код

apply_gradients(
    gradients, name=None
)

Применяет обновление градиента к таблицам встраивания.

Если градиент None передан в любой позиции вложенной структуры, для этого признака будет применено обновление градиента с нулевым градиентом. Для оптимизаторов, таких как SGD или Adagrad, это эквивалентно отсутствию обновления. Для ленивого Adam и других оптимизаторов с разреженным применением и затуханием убедитесь, что вы понимаете влияние применения нулевого градиента.

strategy = tf.distribute.TPUStrategy(...)
with strategy.scope():
  embedding = tf.tpu.experimental.embedding.TPUEmbedding(...)

distributed_dataset = (
    strategy.experimental_distribute_datasets_from_function(
        dataset_fn=...,
        options=tf.distribute.InputOptions(
            experimental_prefetch_to_device=False))
dataset_iterator = iter(distributed_dataset)

@tf.function
def training_step():
  def tpu_step(tpu_features):
    with tf.GradientTape() as tape:
      activations = embedding.dequeue()
      tape.watch(activations)

      loss = ... #  some computation involving activations

    embedding_gradients = tape.gradient(loss, activations)
    embedding.apply_gradients(embedding_gradients)

  embedding_features, tpu_features = next(dataset_iterator)
  embedding.enqueue(embedding_features, training=True)
  strategy.run(tpu_step, args=(embedding_features, ))

training_step()
Аргументы
gradients Вложенная структура градиентов, структура которой соответствует структуре feature_config , переданной в этот объект.
name Имя базовой операции.
Возможные исключения
RuntimeError Если вызов выполнен, когда объект не был создан в рамках TPUStrategy.
ValueError Если передан не-tf.Tensor не-None градиент, или tf.Tensor с неправильной формой. Также, если размер любого последовательности в gradients не совпадает с соответствующей последовательностью в feature_config.
TypeError Если тип любой последовательности в gradients не совпадает с соответствующей последовательностью в feature_config.

dequeue

Просмотреть исходный код

dequeue(
    name=None
)

Получение результатов встраивания.

Возвращает вложенную структуру объектов tf.Tensor, соответствующую структуре аргумента feature_config для класса TPUEmbedding. Форма выходных тензоров — (batch_size, dim), где batch_size — размер пакета на ядро, dim — размерность соответствующего TableConfig. Если соответствующий FeatureConfig признака имеет max_sequence_length больше 0, результат будет последовательностью формы (batch_size, max_sequence_length, dim) вместо этого.

strategy = tf.distribute.TPUStrategy(...)
with strategy.scope():
  embedding = tf.tpu.experimental.embedding.TPUEmbedding(...)

distributed_dataset = (
    strategy.experimental_distribute_datasets_from_function(
        dataset_fn=...,
        options=tf.distribute.InputOptions(
            experimental_prefetch_to_device=False))
dataset_iterator = iter(distributed_dataset)

@tf.function
def training_step():
  def tpu_step(tpu_features):
    with tf.GradientTape() as tape:
      activations = embedding.dequeue()
      tape.watch(activations)

      loss = ... #  some computation involving activations

    embedding_gradients = tape.gradient(loss, activations)
    embedding.apply_gradients(embedding_gradients)

  embedding_features, tpu_features = next(dataset_iterator)
  embedding.enqueue(embedding_features, training=True)
  strategy.run(tpu_step, args=(embedding_features, ))

training_step()
Аргументы
name Имя базовой операции.
Возвращаемые значения
Вложенная структура тензоров, имеющая ту же структуру, что и feature_config

переданная в этот экземпляр объекта TPUEmbedding.

Возможные исключения
RuntimeError Если вызов выполнен, когда объект не был создан в рамках TPUStrategy.

enqueue

Просмотреть исходный код

enqueue(
    features, weights=None, training=True, name=None
)

Загрузка тензоров id для поиска встраивания.

Эта функция загружает структуру признаков для поиска в таблицах встраивания. Мы ожидаем, что размер пакета каждого из тензоров в признаках соответствует размеру пакета на ядро. Это автоматически произойдет, если ваш набор данных сгруппирован по глобальному размеру пакета и вы используете tf.distribute.TPUStrategy experimental_distribute_dataset, или если вы используете experimental_distribute_datasets_from_function и группируете по размеру пакета на ядро, вычисленному контекстом, переданным вашей функции ввода.

strategy = tf.distribute.TPUStrategy(...)
with strategy.scope():
  embedding = tf.tpu.experimental.embedding.TPUEmbedding(...)

distributed_dataset = (
    strategy.experimental_distribute_datasets_from_function(
        dataset_fn=...,
        options=tf.distribute.InputOptions(
            experimental_prefetch_to_device=False))
dataset_iterator = iter(distributed_dataset)

@tf.function
def training_step():
  def tpu_step(tpu_features):
    with tf.GradientTape() as tape:
      activations = embedding.dequeue()
      tape.watch(activations)

      loss = ... #  some computation involving activations

    embedding_gradients = tape.gradient(loss, activations)
    embedding.apply_gradients(embedding_gradients)

  embedding_features, tpu_features = next(dataset_iterator)
  embedding.enqueue(embedding_features, training=True)
  strategy.run(tpu_step, args=(embedding_features,))

training_step()
Примечание: Необходимо указать training=True при использовании embedding.apply_gradients и training=False при отсутствии embedding.apply_gradients (например, для замороженных встраиваний или при оценке).
Аргументы
features Вложенная структура из tf.Tensor, tf.SparseTensor или tf.RaggedTensor, со структурой, совпадающей со структурой feature_config. Входные данные будут приведены к типу tf.int32. В одном вызове поддерживается только один тип из tf.SparseTensor или tf.RaggedTensor.
weights Если не None, вложенная структура из tf.Tensor, tf.SparseTensor или tf.RaggedTensor, соответствующая вышеописанной, за исключением того, что тензоры должны быть плавающего типа (и они будут приведены к типу tf.float32). Для tf.SparseTensor мы предполагаем, что indices одинаковы для параллельных записей из features, и аналогично для tf.RaggedTensor мы предполагаем, что row_splits одинаковы.
training По умолчанию True. Если False, добавляйте пакет как пакет вывода (только прямой проход). Не вызывайте apply_gradients, когда это False, так как это может привести к тупику. имя: имя базовой операции.
Исключения
ValueError При вызове внутри вызова strategy.run и входные данные не берутся непосредственно из аргументов вызова strategy.run. Также, если размер любого последовательности в features не совпадает с соответствующей последовательностью в feature_config. Аналогично для weights, если не None.
RuntimeError При вызове внутри вызова strategy.run и внутри XLA потока управления.
TypeError Если тип любой последовательности в features не совпадает с соответствующей последовательностью в feature_config. Аналогично для weights, если не None.

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/tpu/experimental/embedding/TPUEmbedding

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API