Я пытаюсь провести elmo tenorflow, используя GPU на Google Cloud Platform в python 3.x на Ubuntu 18.04. Код выполняется на экземпляре Compute Engine с типом машины n1-standard-4 (4 виртуальных ЦП, 15 ГБ памяти), 1 графическим процессором NVIDIA Tesla K80 и стандартным постоянным диском объемом 100 ГБ.
Мой код замедляется после каждогораунд / итерация (код ниже) - есть ли способ сохранить скорость выполнения каждого раунда / итерации такой же быстрой, какой она была для первых нескольких раундов / итераций?
Я пробовал tf.compat.v1.reset_default_graph (), но это дает RuntimeError: модуль должен быть применен к графу, для которого он был создан.
Я пробовал многопроцессорный пул Python с пулом.apply (ref: решение nathandouglas на https://github.com/tensorflow/tensorflow/issues/17048)
Я попробовал решение, предлагаемое здесь: https://github.com/tensorflow/tensorflow/issues/1578 т.е.
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)
Вот еще один пост, который я упомянул, чтобы найтирешения, которые не сработали - https://github.com/tensorflow/tensorflow/issues/19731
#Code snippets here:
def elmo_vectors(x):
embeddings = elmo(x.tolist(), signature="default", as_dict=True)["elmo"]
with tf.compat.v1.Session(config=config) as sess:
sess.run(tf.compat.v1.global_variables_initializer())
sess.run(tf.compat.v1.tables_initializer())
# return average of ELMo features
return_val = sess.run(tf.reduce_mean(embeddings,1))
sess.close()
return return_val
# some code not related to question here
list_train = [train[i:i+100] for i in range(0,train.shape[0],100)]
print ("start training elmo")
counter=0
elmo_train=[]
for x in list_train:
counter=counter+1
print ("in sample testing round/iteration ", counter)
elmo_train.append(elmo_vectors(x))
# some code not related to question here
#With the multiprocessing pool trial i did this:
import multiprocessing as mp
def process_elmo(x):
pool = mp.Pool(1)
xyz = pool.apply(elmo_vectors, (x,))
pool.terminate()
pool.join()
return xyz
# but using pool stays hanged up, code does not return. Upon using
# Keyboard interrupt (Ctrl+C), i get a traceback that mentions
# "...line xyz, stuck at wait signaled = self._cond.wait(timeout)" #
# and "...line def, in wait waiter.acquire()"
1.) Я ожидал, что процесс пула вернется, но он застрял. 2.) Я хочу, чтобы скорость / производительность моего кода оставалась такой же быстрой, как и первые несколько раундов / итераций - со временем он замедляется по мере того, как проходит больше итераций (и кода в конце концов, примерно через 12 часов и~ 500 раундов, завершается сообщением: завершается вызов после выброса экземпляра 'std :: bad_alloc' what (): std :: bad_alloc))