ELMO встраивание начала сеанса - PullRequest
1 голос
/ 29 апреля 2019

У меня ошибка при применении встраивания Elmo к моим данным. У меня 7255 предложений.

embeddings = embed(
    sentences,
    signature="default",
    as_dict=True)['default']

#Start a session and run ELMo to return the embeddings in variable x
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  sess.run(tf.tables_initializer())
  x = sess.run(embeddings)

Ошибка:

ResourceExhaustedError: OOM при выделении тензора с формой [36021075,50] и типом int32 on / job: localhost / replica: 0 / task: 0 / device: CPU: 0 от процессора-распределителя [[node module_apply_default / map / TensorArrayStack / TensorArrayGatherV3 (определено в C: \ Users ... \ envs \ tf_36 \ lib \ site-packages \ tenorflow_hub \ native_module.py: 547)]] Подсказка: если вы хотите увидеть список распределенных тензоров при появлении OOM, добавьте report_tensor_allocations_upon_oom в RunOptions для информации о текущем распределении.

1 Ответ

1 голос
/ 29 апреля 2019

ELMo - большая модель. Есть 2048-мерные вложения слов, 4096-мерные состояния LSTM в 2 слоях и 2 направлениях. Только это 18 КБ с плавающей запятой, 71 КБ на слово (и это намного больше: промежуточные проекции в LSTM, уровень символов CNN для представления слов). У вас есть 7 255 предложений, среднее предложение - 25 слов, это дает 12 ГБ ОЗУ, но это очень консервативная оценка.

Вам нужно разбить предложения на пакеты и обработать пакеты итеративно. Есть много способов, как это сделать, и я не знаю, какую реализацию вы используете и что именно находится в переменной sentences. Но вы, вероятно, можете вызвать tf.split на sentences и получить список объектов, для которых сеанс вызова независимо, или, если вы используете tf.dataset, вы можете использовать пакетную обработку, предоставляемую API набора данных. Вы также всегда можете разделить свои данные и использовать несколько входных файлов.

...