ELMO отсутсвует воспроизводимость результата получения векторов

Всем привет! Заметил такую особенность, что на одних и тех же входных данных при разных запусках, получаются разные вектора ELMO. Нормальная ли это ситуация?

Вектора получаются таким образом:
vectors = elmo([tx.split() for tx in X_train])
vectors = np.array(vectors)
vectors3 = elmo([tx.split() for tx in X_train])
vectors3 = np.array(vectors3)

Сравнение результатов двух прогонов: np.testing.assert_allclose(vectors3, vectors, rtol = 1e-04)


Not equal to tolerance rtol=0.0001, atol=0

Mismatched elements: 55296 / 58368 (94.7%)
Max absolute difference: 0.0737164
Max relative difference: 231.68636

Что не помогло:

  • фиксация параметра seed внутри elmo
    vectors =elmo([tx.split() for tx in X_train], seed=42)
    *тут как понимаю просто некорректно передаются сиды, при этом elmo не ругается
  • фиксация параметра seed для tf и других библиотек
seed = 42
os.environ['PYTHONHASHSEED'] = str(seed)
# TF RNG
os.environ['PYTHONHASHSEED']=str(seed)
os.environ['TF_CUDNN_DETERMINISTIC'] = '1'  # new flag present in tf 2.0+
tf.set_random_seed(seed)
# Python RNG
np.random.seed(seed)
random.seed(seed)

Что помогло:

  • при использования ELMO напрямую через tf_hub получается добиться детерминированности, но при этом очень сильно падает производительность. Из-за этого данный способ неработоспособен.
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    embeddings = elmo(["тестовый набор"], signature="default", as_dict=True)["elmo"]
    embeddings = sess.run(embeddings)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    embeddings3 = elmo(["тестовый набор"], signature="default", as_dict=True)["elmo"]
    embeddings3 = sess.run(embeddings3)

Что помогло уменьшить проблему:
Добавил tf.global_variables_initializer() перед каждым вызовом elmo. Также добавил tqdm для детализации процесса получения векторов.

def elmo_custom(data):
    vectors, vectors_test = list(), list()
    for tx in tqdm_notebook(data):
        tf.global_variables_initializer()
        vec=elmo([tx.split()])
        vectors.append(vec)
    vectors = np.array(vectors)
    vectors = np.squeeze(vectors)
    return vectors
vectors2 = elmo_custom(X_train)
vectors3 = elmo_custom(X_train)

Проверка схожести двух векторов:
np.testing.assert_allclose(vectors3, vectors2, rtol = 1e-04)

AssertionError: 
Not equal to tolerance rtol=0.0001, atol=0

Mismatched elements: 5939 / 58368 (10.2%)

Надо сбрасывать стейты напрямую в LSTM внутри ELMo, это быстро будет работать, но надо залезать в обертку на нижний уровень модели. Думаю можно во время рантайма (инференса) напрямую сбрасывать стейты