tf.tpu.experimental.embedding.TPUEmbedding
API 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. Это свойство работает только в том случае, если объект |
Методы
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