Импортировать 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
Удачи