Импортировать tflearn очень медленно

Импорт tflearn занимает больше времени по сравнению с другими модулями.

В недавно созданной виртуальной среде с только tflearn и минимальными зависимостями, установленными с pip:

  • import numpy as np занимает ~0,18 с
  • import tensorflow as tf занимает ~0,90 с
  • import tflearn занимает ~3,1 с (и просит меня установить h5py и scipy).

После установки h5py и scipy, как и предполагалось, время, затрачиваемое import tflearn идет до ~3,5 с. Как я могу сократить время импорта?

(Все вышеперечисленные тесты выполняются путем помещения оператора в test.py и запуска time python test.py несколько раз. Сообщаемое время является "реальным" временем, сообщаемым time Встроенный Bash.)

2 ответа

Решение

Краткий ответ

Сделайте свою первоначальную работу в Jupyter или что-то еще, что имеет долгоживущий сеанс интерпретатора, так что вам не нужно так долго ждать импорта.

Длинный ответ

Ты можешь использовать python -v отслеживать импорт. Я установил moreutils от apt и tensorflow а также tflearn от pip в нетронутом python:3.6-stretch Контейнер Docker...

root@10e4bcd91377:/# python -v -c 'import tensorflow' 2>&1 | ts '%H:%M:%.S' | grep 'import ' | wc -l
954
root@10e4bcd91377:/# python -v -c 'import tflearn' 2>&1 | ts '%H:%M:%.S' | grep 'import ' | wc -l
1768

Сразу видно, что импорт tflearn импортирует много пакетов Какие?

# python -v -c 'import tflearn' 2>&1 | grep 'import ' | cut -f1 -d# | sort | uniq > tflearn-imports.txt
# python -v -c 'import tensorflow' 2>&1 | grep 'import ' | cut -f1 -d# | sort | uniq > tensorflow-imports.txt
# diff --suppress-common-lines tensorflow-imports.txt tflearn-imports.txt

Я избавлю от 831 строки вывода, но похоже, tflearn импортирует все tensorflow.contrib, что занимает довольно много времени, и это не что-то импортирующее tensorflow сам делает. Вооружившись этой информацией, мы можем посмотреть на оригинал python -v -c 'import tflearn' 2>&1 вывод - похоже tflearn.variables модуль импортирует tensorflow.contrib...

# <snip>
import 'tensorflow.contrib.summary.summary'
import 'tensorflow.contrib'
import 'tflearn.variables'
import 'tflearn.config'
# <snip>

Может ли это быть from tensorflow.contrib.framework.python.ops import add_arg_scope as contrib_add_arg_scope заявление? Давайте разберемся...

# time python -v -c 'from tensorflow.contrib.framework.python.ops import add_arg_scope as contrib_add_arg_scope' 2>&1 | grep 'import ' | wc -l
1727

real    0m4.010s
user    0m3.820s
sys 0m0.410s
root@10e4bcd91377:/#

Аюп, похоже на это! Из-за того, как работает импорт Python, импорт подмодуля должен оценивать весь пакет, и, поскольку tensorflow.contrib не использует ленивый загрузчик Tensorflow's Python (который упоминает contrib ), это займет некоторое время.

(Раньше здесь обсуждался вопрос о продаже в модуле, но это не имеет значения, потому что:)

К сожалению, есть и другие места в tflearn который также импортирует биты и кусочки из contrib так что избавление от этой зависимости мало поможет.

Некоторые импортированные модули инициализируются, когда вы начинаете их использовать, некоторые нет. tflearn инициализируйте, когда вы импортируете его, и поскольку у него много зависимостей, неудивительно, что это занимает так много времени.

SO QA ниже даст вам представление об оптимизации в течение длительного времени.

повышение скорости импорта модуля Python

Удачи

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