Компиляция модели с использованием BERT в качестве хаба. Сбой в KerasLayer в области TPUStrategy - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь использовать BERT Multilingual из TensorFlow Hub (https://tfhub.dev/google/bert_multi_cased_L-12_H-768_A-12/1) в качестве слоя в модели Keras. Обучение модели без использования стратегии распространения работает нормально. Однако при попытке использовать TPU Google Cloud с помощью стратегии распространения обучение модели завершается с ошибкой:

ValueError: Variable (<tf.Variable 'bert/embeddings/word_embeddings:0' shape=(119547, 768) dtype=float32>) was not created in the distribution strategy scope of (<tensorflow.python.distribute.tpu_strategy.TPUStrategy object at 0x7fc7b01d52e8>). It is most likely due to not all layers or the model or optimizer being created outside the distribution strategy scope. Try to make sure your code looks similar to the following.
with strategy.scope():
  model=_create_model()
  model.compile(...)

Вот мой код для построения и обучения модели:

def bert_model():
    in_id = tf.keras.layers.Input(shape=(MAX_SEQ_LENGTH,), name="input_ids", dtype=np.int32)
    in_mask = tf.keras.layers.Input(shape=(MAX_SEQ_LENGTH,), name="input_masks", dtype=np.int32)
    in_segment = tf.keras.layers.Input(shape=(MAX_SEQ_LENGTH,), name="segment_ids", dtype=np.int32)
    bert_inputs = {"input_ids": in_id, "input_mask": in_mask, "segment_ids": in_segment}

    bert_output = hub.KerasLayer(BERT_MODEL_HUB, trainable=True, signature="tokens", output_key="pooled_output")(bert_inputs)

    dense = tf.keras.layers.Dense(256, input_shape=(768,), activation='relu')(bert_output)
    pred = tf.keras.layers.Dense(len(unique_labels), activation='sigmoid')(dense)

    return tf.keras.models.Model(inputs=bert_inputs, outputs=pred)

resolver = tf.distribute.cluster_resolver.TPUClusterResolver(TPU_ADDRESS)
tf.config.experimental_connect_to_host(resolver.master())
tf.tpu.experimental.initialize_tpu_system(resolver)
strategy = tf.distribute.experimental.TPUStrategy(resolver)

with strategy.scope():
    model = bert_model()

    model.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE),
        loss=tf.keras.losses.binary_crossentropy,
        metrics=["accuracy"]
    )

Я использую Python 3.5.3 и TensorFlow v2.0.0-rc2-26-g64c3d38 с поддержкой графического процессора.

1 Ответ

1 голос
/ 09 января 2020

Вероятно, ошибка в TF2.0. Ян также спросил, и обходные пути (обновление) обсуждаются, в https://github.com/tensorflow/hub/issues/469

...