Код Tensorflow замедляется с каждой итерацией - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь провести 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))

...