In [ ]:
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Автоматическое обновление кода до TensorFlow 2

Смотрите на TensorFlow.org Изучайте код на GitHub Скачайте ноутбук

Note: Вся информация в этом разделе переведена с помощью русскоговорящего Tensorflow сообщества на общественных началах. Поскольку этот перевод не является официальным, мы не гарантируем что он на 100% аккуратен и соответствует официальной документации на английском языке. Если у вас есть предложение как исправить этот перевод, мы будем очень рады увидеть pull request в tensorflow/docs репозиторий GitHub. Если вы хотите помочь сделать документацию по Tensorflow лучше (сделать сам перевод или проверить перевод подготовленный кем-то другим), напишите нам на docs-ru@tensorflow.org list.

TensorFlow 2.0 включает много изменений API, таких как изменение порядка аргументов, переименование символов и изменение значений по умолчанию для параметров. Ручное исправление всех этих модификаций утомительно и подвержено ошибкам. Чтобы упростить изменения и сделать ваш переход на TF 2.0 как можно более плавным, команда TensorFlow создала утилиту tf_upgrade_v2, помогающую перейти от legacy кода к новому API.

Примечание: tf_upgrade_v2 устанавливается автоматически для TensorFlow 1.13 и более поздних версий (включая все сборки TF 2.0).

Типичное использование выглядит так:

tf_upgrade_v2 \
  --intree my_project/ \
  --outtree my_project_v2/ \
  --reportfile report.txt

Это ускорит процесс обновления за счет конвертации существующих скриптов TensorFlow 1.x Python в TensorFlow 2.0.

Скрипт конвертации максимально автоматизирует процесс, но все еще существуют синтаксические и стилистические изменения, которые не могут быть выполнены скриптом.

Модули совместимости

Некоторые символы API не могут быть обновлены просто с использованием замены строк. Чтобы гарантировать поддержку вашего кода в TensorFlow 2.0, скрипт обновления включает в себя модуль compat.v1. Этот модуль заменяет символы TF 1.x, такие как tf.foo, на эквивалентную ссылкуtf.compat.v1.foo. Хотя модуль совместимости хорош, мы рекомендуем вам вручную вычитать замены и перенести их на новые API в пространстве имен tf. * вместо пространства имен tf.compat.v1 как можно быстрее.

Из-за депрекации модулей TensorFlow 2.x (например, tf.flags иtf.contrib) некоторые изменения не могут быть обойдены путем переключения на compat.v1. Обновление этого кода может потребовать использования дополнительной библиотеки (например, [absl.flags] (https://github.com/abseil/abseil-py)) или переключения на пакет в [tenorflow / addons] (http: //www.github.com/tensorflow/addons).

Рекомендуемый процесс обновления

Оставшаяся часть руководства демонстрирует использование скрипта обновления. Хоть скрипт обновления прост в использовании, очень рекомендуем вам использовать скрипт как часть следующего процесса:

  1. Модульное тестирование : убедитесь, что в обновляемом коде имеется набор модульных тестов с разумным охватом. Это код Python, поэтому язык не защитит вас от многих классов ошибок. Также убедитесь, что все ваши зависимости были обновлены до совместимых с TensorFlow 2.0.

  2. Установите TensorFlow 1.14: Обновите ваш TensorFlow до последней версии TensorFlow 1.x, как минимум 1.14. Она включает финальный API TensorFlow 2.0 в tf.compat.v2.

  3. Протестируйте с 1.14: Убедитесь, что ваши модульные тесты проходят на этом этапе. Вы будете повторно запускать их в процессе обновления поэтому важно начать с зеленого цвета.

  4. Запустите скрипт обновления: Запустите tf_upgrade_v2 на всем дереве исходного кода включая тесты. Это обновит ваш код до формата в котором он использует только символы доступные в TensorFlow 2.0. Устаревшие символы будут доступны с tf.compat.v1. Это впоследствии потребует ручного внимания, но не сразу.

  5. Запустите ковертированные тесты с TensorFlow 1.14: Ваш код должен все еще запускаться правильно в TensorFlow 1.14. Запустите снова модульные тесты. Любая ошибка в ваших тестах на этом этапе значит, что в скрипте обновления есть ошибка. Сообщите нам пожалуйста об этом.

  6. Проверьте отчет обновления на наличие предупреждений и ошибок: Скрипт пишет файл отчета объясняющий все конвертации которые вам нужно перепроверить, или все действия которые нужно совершить вручную. Например: Любые оставшиеся экземпляры contrib требуют ручного удаления. Пожалуйста, обратитесь к RFC для получения дополнительных инструкций.

  7. Установите TensorFlow 2.0: В этом месте переключение на TensorFlow 2.0 должно быть безопасно.

  8. Протестируйте с v1.disable_v2_behavior: Перезапустите ваши тесты с v1.disable_v2_behavior () в основной функции тестов результаты должны быть те же, что и при запуске под 1.14.

  9. Включите V2 Behavior: Сейчас, когда ваши тесты работают с использованием API v2, вы можете начать смотреть включение v2 behavior. В зависимости от того, как написан ваш код, это может потребовать некоторых изменений. См. [Руководство по миграции] (migrate.ipynb) для деталей.

Использование скрипта обновления

Установка

Перед началом убедитесь, что TensorlFlow 2.0 установлен.


In [ ]:
try:
  import tensorflow.compat.v2 as tf
except Exception:
  pass

tf.enable_v2_behavior()

print(tf.__version__)

Склонируйте git репозиторий tensorflow/models чтобы у вас был какой-нибудь код для проверки:


In [ ]:
!git clone --branch r1.13.0 --depth 1 https://github.com/tensorflow/models

Прочитайте help

Скрипт должен быть установлен с TensorFlow. Здесь встроенная помощь:


In [ ]:
!tf_upgrade_v2 -h

Пример кода TF1

Здесь простой скрипт TensorFlow 1.0:


In [ ]:
!head -n 65 models/samples/cookbook/regression/custom_regression.py | tail -n 10

С установленным TensorFlow 2.0 он не запускается:


In [ ]:
!(cd models/samples/cookbook/regression && python custom_regression.py)

Отдельный файл

Скрипт обновления может быть запущен на отдельном файле Python:


In [ ]:
!tf_upgrade_v2 \
  --infile models/samples/cookbook/regression/custom_regression.py \
  --outfile /tmp/custom_regression_v2.py

Скрипт выведет ошибки если не сможет найти исправления для кода.

Дерево каталогов

Типичные проекты, включая этот простой пример, используют более одного файла. Обычно хочется обновить весь пакет, поэтому скрипт может быть также запущен на дереве каталогов:


In [ ]:
# обновить файлы .py и скопировать остальные файлы в outtree
!tf_upgrade_v2 \
    --intree models/samples/cookbook/regression/ \
    --outtree regression_v2/ \
    --reportfile tree_report.txt

Обратите внимание на одно замечание по поводу функции dataset.make_one_shot_iterator.

Сейчас скрипт работает с TensorFlow 2.0:

Обратите внимание, что из-за модуля tf.compat.v1, сконвертированный скрипт также будет запускаться в TensorFlow 1.14.


In [ ]:
!(cd regression_v2 && python custom_regression.py 2>&1) | tail

Детальный отчет

Скрипт также публикует подробный список изменений. В этом примере он нашел одну возможно небезопасную трансформацию и добавил предупреждение в начало файла:


In [ ]:
!head -n 20 tree_report.txt

Обратите внимание вновь на одно замечание о Dataset.make_one_shot_iterator function.

В остальных случаях результат объяснит причину для нетривиальных изменений:


In [ ]:
%%writefile dropout.py
import tensorflow as tf

d = tf.nn.dropout(tf.range(10), 0.2)
z = tf.zeros_like(d, optimize=False)

In [ ]:
!tf_upgrade_v2 \
  --infile dropout.py \
  --outfile dropout_v2.py \
  --reportfile dropout_report.txt > /dev/null

In [ ]:
!cat dropout_report.txt

Вот измененное содержимое файла, обратите внимание, как скрипт добавляет имена аргументов для работы с перемещенными и переименованными аргументами:


In [ ]:
!cat dropout_v2.py

Больший проект может содержать мало ошибок. Например, конвертируеме модель deeplab:


In [ ]:
!tf_upgrade_v2 \
    --intree models/research/deeplab \
    --outtree deeplab_v2 \
    --reportfile deeplab_report.txt > /dev/null

Это сгенерировало выходные файлы:


In [ ]:
!ls deeplab_v2

Но там были ошибки. Отчет поможет вам точно определить, что нужно исправить, прежде чем запускать скрипт. Вот первые три ошибки:


In [ ]:
!cat deeplab_report.txt | grep -i models/research/deeplab | grep -i error | head -n 3

"Безопасный" режим

У скрипт конвертации есть также менее инвазивный БЕЗОПАСНЫЙ режим который просто меняет импорты для использования модуля tensorflow.compat.v1:


In [ ]:
!cat dropout.py

In [ ]:
!tf_upgrade_v2 --mode SAFETY --infile dropout.py --outfile dropout_v2_safe.py > /dev/null

In [ ]:
!cat dropout_v2_safe.py

Как вы можете видеть это не обновляет ваш код, но позволяет TensorFlow 1 коду запускаться в TensorFlow 2

Предостережения

  • Не обновляйте части вашего кода вручную перед запуском скрипта. В частности, функции с переупорядоченными аргументами, такие как tf.argmax илиtf.batch_to_space, вынудят скрипт неправильно добавить аргументы ключевых слов, что запутает ваш существующий код.

  • Скрипт предполагает, что tensorflow импортирован с использованием import tensorflow as tf.

  • Скрипт не переупорядочивает аргументы. Вместо этого скрипт добавляет ключевые слова аргументов к функциям у которых аргументы поменяли порядок.

  • Проверьте tf2up.ml для подходящего инструмента обновления ноутбуков Jupyter и файлов Python в репозитории GitHub.

Чтобы сообщить об ошибках в скрипте обновления или отправить запрос на добавление функции, отправьте сообщение об ошибке на GitHub. И если вы тестируете TensorFlow 2.0, мы хотим знать об этом! Вступайте в сообщество тестирования TF 2.0 и отправляйте вопросы и обсуждения на testing@tensorflow.org.