Ускорение вывода на GPT2 - оптимизация tf.sess.run()

Я пытаюсь оптимизировать время вывода на GPT2. Текущее время создания образца после вызова скрипта в Google Colab составляет 55 секунд. Я ставил временные метки, чтобы попытаться определить узкое место. Это код:

       for _ in range(nsamples // batch_size):
            out = sess.run(output, feed_dict={
                context: [context_tokens for _ in range(batch_size)]
            })[:, len(context_tokens):]
            for i in range(batch_size):
                generated += 1
                text = enc.decode(out[i])
                print("=" * 40 + " SAMPLE " + str(generated) + " " + "=" * 40)
                print(text)
        print("=" * 80)

Линия

      out = sess.run(output, feed_dict={
                context: [context_tokens for _ in range(batch_size)]
            })[:, len(context_tokens):] 

вот в чем заключается сложность. Есть ли у кого-нибудь способ улучшить этот фрагмент кода? Большое спасибо!

1 ответ

batch_size установлен в 1 в GPT2, и нет способа изменить это без сбоя процесса. Таким образом, «[context_tokens for _ in range (batch_size)]» означает «[context_tokens for _ in range(1)]» означает «[context_tokens]», что не сильно улучшит скорость, но безопасно для реализации и заставляет смотреть на код немного разумнее. Настоящая сложность заключается в том, что у вас в оперативной памяти есть 6-гигабайтный компьютер, к которому вы получаете доступ в этом сеансе.

На практике, чем меньше токенов вы отправляете и чем меньше они обрабатываются, тем быстрее будет выполняться эта часть. Поскольку каждый токен необходимо отправить через AI GPT2. Но, следовательно, ответ будет менее «умным».

Кстати, // это операция целочисленного деления, поэтому nsamples // batch_size = nsamples/1 = nsamples size. И из того, что я видел, nsamples было 1, когда я напечатал его значение в print(nsamples). Таким образом, цикл for - это еще один цикл одного элемента, что означает, что цикл может быть удален.

GPT2 - это просто реализация тензорного потока. Посмотрите: как построить график в тензорном потоке; как вызвать сеанс для этого графа; как заставить заставку сохранять переменные в этом сеансе и как использовать заставку для восстановления сеанса. Вы узнаете о контрольных точках, метафайлах и других реализациях, которые сделают ваши файлы более понятными.

Модуль tensorflow находится в Lib, site-packages, tensorflow_core (по крайней мере, в вилке AI Dungeon 2 Henk717). Большая часть обработки происходит в подкаталогах python / ops и framework. Вы увидите их всплывающее окно, если ваша кодировка нарушает ожидания, которых ожидал tf.

Если этот вопрос касается реализации в AI Dungeon, лучшее, что я смог реализовать, - это рекурсивный вызов generator.generate, который завершается попыткой, кроме KeyboardInterrupt: с печатью (token, end = '', flush = True) для каждый токен по мере их создания. Таким образом, вы можете просматривать каждый жетон по мере его генерации ИИ, а не ждать 55 секунд звукового сигнала.

Кроме того, предупреждения Cuda нуждаются в одинарных кавычках, а не в двойных, поэтому import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'not "3" Это снимет предупреждения cuda при импорте тензорного потока.

Далее следуют обесценения, которые появляются из-за реализации GPT2 в версиях tenorflow выше 1.5.

Чтобы отключить их, tfv = tf.compat.v1tfv.set_verbosity(tfv.logging.Error) - это все, что вам нужно. Предупреждения импортировать не нужно.

Даже в этом случае между инициализацией tf, начальной генерацией образца и загрузкой модуля в RAM проходит много времени. Я добавил в model.shape_list(x): следующую строку print("_",end ='',flush=True) И, по крайней мере, для модуля, который создается для локализации его на машине, вы можете просмотреть "индикатор выполнения" своего рода.

Другие вопросы по тегам