TensorFlow.js: преобразование сохраненной модели Python в формат TensorFlow.js.

1. Введение

Итак, вы сделали свои первые шаги в TensorFlow.js , попробовали наши готовые модели или, может быть, даже создали свои собственные — но вы увидели передовые исследования в области Python и вам любопытно узнать, можно ли их реализовать в веб-браузере, чтобы воплотить вашу крутую идею в жизнь для миллионов людей масштабируемым способом. Знакомо? Если да, то CodeLab для вас!

Команда TensorFlow.js создала удобный инструмент для преобразования моделей в формате SavedModel в формат TensorFlow.js с помощью конвертера командной строки, чтобы вы могли с удовольствием использовать такие модели в масштабах, характерных для веб-технологий.

Что вы узнаете

В этом практическом занятии вы узнаете, как использовать конвертер командной строки TensorFlow.js для преобразования сгенерированной на Python модели SavedModel в формат model.json, необходимый для выполнения на стороне клиента в веб-браузере.

Конкретно:

  • Как создать простую модель машинного обучения на Python и сохранить её в формате, необходимом для конвертера TensorFlow.js.
  • Как установить и использовать конвертер TensorFlow.js для сохраненной модели, экспортированной из Python.
  • Возьмите полученные в результате конвертации файлы и используйте их в своем веб-приложении на JavaScript.
  • Разберитесь, что делать, если что-то пойдет не так (не все модели будут конвертироваться), и какие у вас есть варианты.

Представьте, что вы можете взять результаты недавно опубликованных исследований и сделать эту модель доступной миллионам разработчиков JavaScript по всему миру. Или, может быть, вы сами используете её в своём собственном проекте, который сможет запустить любой человек в мире в веб-браузере, поскольку не потребуется никаких сложных зависимостей или настройки среды. Готовы приступить к разработке? Вперёд!

Поделитесь с нами результатами своей работы!

Вы можете использовать полученные сегодня знания, чтобы попытаться адаптировать некоторые из ваших любимых моделей из Python. Если вам это удастся и вы создадите работающий демонстрационный веб-сайт с использованием модели, отметьте нас в социальных сетях, используя хэштег #MadeWithTFJS , чтобы получить шанс на публикацию вашего проекта в нашем блоге TensorFlow или даже на будущих мероприятиях по демонстрации проектов . Мы будем рады видеть больше потрясающих исследований, переносимых в интернет, и дать возможность большему числу людей использовать такие модели инновационными или творческими способами, как в этом замечательном примере .

2. Что такое TensorFlow.js?

1aee0ede85885520.png

TensorFlow.js — это библиотека машинного обучения с открытым исходным кодом , которая может работать везде, где работает JavaScript. Она основана на оригинальной библиотеке TensorFlow, написанной на Python , и стремится воссоздать этот опыт разработки и набор API для экосистемы JavaScript.

Где его можно использовать?

Благодаря переносимости JavaScript, теперь вы можете писать код на одном языке и с легкостью выполнять машинное обучение на всех следующих платформах:

  • Клиентская часть в веб-браузере с использованием чистого JavaScript.
  • Node.js используется на стороне сервера и даже для устройств IoT, таких как Raspberry Pi.
  • Настольные приложения, использующие Electron
  • Нативные мобильные приложения, созданные с использованием React Native.

TensorFlow.js также поддерживает несколько бэкендов в каждой из этих сред (фактические аппаратные среды, в которых он может выполняться, например, ЦП или WebGL. В данном контексте «бэкенд» не означает серверную среду — бэкенд для выполнения может быть клиентской стороной, например, в WebGL), чтобы обеспечить совместимость и высокую скорость работы. В настоящее время TensorFlow.js поддерживает:

  • Выполнение WebGL на графическом процессоре устройства (GPU) — это самый быстрый способ выполнения больших моделей (размером более 3 МБ) с ускорением GPU.
  • Выполнение Web Assembly (WASM) на ЦП — для повышения производительности ЦП на устройствах, включая, например, мобильные телефоны старого поколения. Это лучше подходит для небольших моделей (размером менее 3 МБ), которые на самом деле могут работать на ЦП быстрее с WASM, чем с WebGL, из-за накладных расходов на загрузку контента в графический процессор.
  • Выполнение на ЦП — это резервный вариант на случай, если ни одна из других сред недоступна. Это самый медленный из трех вариантов, но он всегда доступен.

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

Сверхспособности на стороне клиента

Запуск TensorFlow.js в веб-браузере на клиентском компьютере может привести к ряду преимуществ, которые стоит учитывать.

Конфиденциальность

Вы можете как обучать, так и классифицировать данные на клиентском компьютере, не отправляя их на сторонний веб-сервер. В некоторых случаях это может быть необходимо для соблюдения местных законов, таких как GDPR, или при обработке данных, которые пользователь хочет хранить на своем компьютере и не отправлять третьим лицам.

Скорость

Поскольку вам не нужно отправлять данные на удаленный сервер, процесс классификации данных может быть быстрее. Более того, у вас есть прямой доступ к датчикам устройства, таким как камера, микрофон, GPS, акселерометр и другие, если пользователь предоставит вам такой доступ.

Охват и масштаб

Одним щелчком мыши любой человек в мире может перейти по отправленной вами ссылке, открыть веб-страницу в своем браузере и использовать созданный вами функционал. Нет необходимости в сложной серверной настройке Linux с драйверами CUDA и многим другим, чтобы просто использовать систему машинного обучения.

Расходы

Отсутствие серверов означает, что вам нужно платить только за CDN для размещения ваших HTML, CSS, JS и файлов моделей. Стоимость CDN намного ниже, чем содержание сервера (возможно, с подключенной видеокартой), работающего круглосуточно.

Функции на стороне сервера

Использование реализации TensorFlow.js в Node.js позволяет реализовать следующие возможности.

Полная поддержка CUDA

На стороне сервера для ускорения работы с видеокартой необходимо установить драйверы NVIDIA CUDA , чтобы TensorFlow мог работать с видеокартой (в отличие от браузера, который использует WebGL — установка не требуется). Однако полная поддержка CUDA позволяет в полной мере использовать возможности видеокарты на более низком уровне, что приводит к ускорению обучения и вывода результатов. Производительность сопоставима с реализацией TensorFlow на Python, поскольку обе используют один и тот же бэкенд на C++.

Размер модели

Для передовых моделей, полученных в результате исследований, вы можете работать с очень большими моделями, размером, возможно, в гигабайты. В настоящее время такие модели нельзя запускать в веб-браузере из-за ограничений на использование памяти на вкладку браузера. Для запуска таких больших моделей вы можете использовать Node.js на собственном сервере с необходимыми аппаратными характеристиками для эффективного запуска подобных моделей.

Интернет вещей

Node.js поддерживается на популярных одноплатных компьютерах, таких как Raspberry Pi , что, в свою очередь, означает, что вы можете запускать модели TensorFlow.js и на таких устройствах.

Скорость

Node.js написан на JavaScript, что означает, что он выигрывает от компиляции «на лету». Это значит, что вы часто можете наблюдать повышение производительности при использовании Node.js, поскольку он будет оптимизирован во время выполнения, особенно для любой предварительной обработки, которую вы можете выполнять. Отличный пример этого можно увидеть в этом тематическом исследовании , которое показывает, как Hugging Face использовала Node.js для получения двукратного повышения производительности своей модели обработки естественного языка.

Теперь, когда вы понимаете основы TensorFlow.js, где он может работать и некоторые из его преимуществ, давайте начнем делать с ним полезные вещи!

3. Настройка системы

В этом уроке мы будем использовать Ubuntu — популярный дистрибутив Linux, которым пользуются многие, и который доступен в Google Cloud Compute Engine в качестве базового образа, если вы решите следовать инструкциям на виртуальной машине в облаке.

На момент написания этой статьи при создании нового экземпляра Compute Engine без операционной системы можно выбрать образ Ubuntu 18.04.4 LTS, который мы и будем использовать. Конечно, вы можете использовать свою собственную машину или даже другую операционную систему, если захотите, но инструкции по установке и зависимости могут отличаться в зависимости от системы.

Установка TensorFlow (версия для Python)

Итак, поскольку вы, вероятно, пытаетесь преобразовать какую-либо существующую модель на основе Python, которую вы нашли или собираетесь написать, прежде чем мы сможем экспортировать файл "SavedModel" из Python, вам потребуется установить версию TensorFlow на Python на вашем экземпляре, если файл "SavedModel" еще не доступен для загрузки.

Подключитесь к созданной вами выше облачной машине по SSH, а затем введите в окне терминала следующее:

Окно терминала:

sudo apt update
sudo apt-get install python3

Это гарантирует установку Python 3 на компьютере. Для использования TensorFlow необходимо установить Python 3.4 или более позднюю версию.

Чтобы убедиться в установке правильной версии, введите следующее:

Окно терминала:

python3 --version

Вы должны увидеть вывод с указанием номера версии, например, Python 3.6.9 . Если это отображается корректно и версия выше 3.4, мы готовы продолжить.

Далее мы установим PIP для Python 3, который является менеджером пакетов Python, а затем обновим его. Введите:

Окно терминала:

sudo apt install python3-pip
pip3 install --upgrade pip

Ещё раз мы можем проверить установку pip3 с помощью:

Окно терминала:

pip3 --version

На момент написания этой статьи после выполнения данной команды в терминале отображается вывод pip 20.2.3 .

Прежде чем устанавливать TensorFlow, необходимо, чтобы пакет Python "setuptools" был версии 41.0.0 или выше. Выполните следующую команду, чтобы убедиться, что он обновлен до последней версии:

Окно терминала:

pip3 install -U setuptools

Наконец, мы можем установить TensorFlow для Python:

Окно терминала:

pip3 install tensorflow

Выполнение этой процедуры может занять некоторое время, поэтому, пожалуйста, подождите, пока она завершится.

Давайте проверим правильность установки TensorFlow. Создайте файл Python с именем test.py в текущей директории:

Окно терминала:

nano test.py

После запуска nano мы можем написать код на Python для вывода версии установленного TensorFlow:

test.py:

import tensorflow as tf
print(tf.__version__)

Нажмите CTRL + O , чтобы записать изменения на диск, а затем CTRL + X , чтобы выйти из редактора nano.

Теперь мы можем запустить этот файл Python, чтобы увидеть версию TensorFlow, выведенную на экран:

Окно терминала:

python3 test.py

На момент написания этой статьи в консоль выводится 2.3.1 , указывающая на установленную у нас версию TensorFlow Python.

4. Создание модели на Python

На следующем этапе этого практического занятия мы рассмотрим создание простой модели на Python, чтобы показать, как сохранить полученную обученную модель в формате "SavedModel" для последующего использования с нашим конвертером командной строки TensorFlow.js. Принцип будет аналогичным для любой модели Python, которую вы пытаетесь преобразовать, но мы сделаем этот код простым, чтобы все могли его понять.

Давайте отредактируем файл test.py, созданный в первом разделе, и обновим код следующим образом:

test.py:

import tensorflow as tf
print(tf.__version__)

# Import NumPy - package for working with arrays in Python.
import numpy as np

# Import useful keras functions - this is similar to the
# TensorFlow.js Layers API functionality.
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

# Create a new dense layer with 1 unit, and input shape of [1].
layer0 = Dense(units=1, input_shape=[1])
model = Sequential([layer0])

# Compile the model using stochastic gradient descent as optimiser
# and the mean squared error loss function.
model.compile(optimizer='sgd', loss='mean_absolute_error')

# Provide some training data! Here we are using some fictional data 
# for house square footage and house price (which is simply 1000x the 
# square footage) which our model must learn for itself.
xs = np.array([800.0, 850.0, 900.0, 950.0, 980.0, 1000.0, 1050.0, 1075.0, 1100.0, 1150.0, 1200.0, 1250.0, 1300.0, 1400.0, 1500.0, 1600.0, 1700.0, 1800.0, 1900.0, 2000.0], dtype=float)

ys = np.array([800000.0, 850000.0, 900000.0, 950000.0, 980000.0, 1000000.0, 1050000.0, 1075000.0, 1100000.0, 1150000.0, 1200000.0,  1250000.0, 1300000.0, 1400000.0, 1500000.0, 1600000.0, 1700000.0, 1800000.0, 1900000.0, 2000000.0], dtype=float)

# Train the model for 500 epochs.
model.fit(xs, ys, epochs=500, verbose=0)

# Test the trained model on a test input value
print(model.predict([1200.0]))

# Save the model we just trained to the "SavedModel" format to the
# same directory our test.py file is located.
tf.saved_model.save(model, './')

Этот код обучит очень простую линейную регрессию, чтобы научиться оценивать взаимосвязь между нашими x (входными данными) и y (выходными данными). Затем мы сохраним полученную обученную модель на диск. Подробнее о том, что делает каждая строка кода, см. в комментариях.

Если после запуска этой программы (вызовом python3 test.py ) мы проверим нашу директорию, мы должны увидеть новые файлы и папки, созданные в текущей директории:

  • тест.py
  • saved_model.pb
  • ресурсы
  • переменные

Теперь мы сгенерировали файлы, необходимые для работы конвертера TensorFlow.js, который преобразует эту модель для запуска в браузере!

5. Преобразование SavedModel в формат TensorFlow.js

Установите конвертер TensorFlow.js.

Для установки конвертера выполните следующую команду:

Окно терминала:

pip3 install tensorflowjs

Это было легко.

Предположим, мы используем конвертер командной строки ( tensorflowjs_converter ), а не мастер, показанный выше. В этом случае мы можем вызвать следующую команду для преобразования только что созданной сохраненной модели и явно передать параметры конвертеру:

Окно терминала:

tensorflowjs_converter \
    --input_format=keras_saved_model \
    ./ \
    ./predict_houses_tfjs

Что здесь происходит? Во-первых, мы вызываем только что установленный бинарный файл tensorflowjs_converter и указываем, что пытаемся преобразовать сохраненную модель Keras.

В приведенном выше примере кода вы заметите, что мы импортировали Keras и использовали его API для работы с высокоуровневыми слоями, чтобы создать нашу модель. Если бы вы не использовали Keras в своем коде на Python, вы могли бы использовать другой формат ввода:

  • keras — для загрузки формата keras (тип файла HDF5)
  • tf_saved_model — для загрузки модели, использующей основные API TensorFlow вместо Keras.
  • tf_frozen_model — для загрузки модели, содержащей замороженные веса.
  • tf_hub - для загрузки модели, сгенерированной из TensorFlow Hub.

Подробнее об этих других форматах вы можете узнать здесь .

Следующие 2 параметра указывают, в какой папке находится сохраненная модель — в приведенном выше примере мы указываем текущий каталог, а затем, наконец, указываем каталог, в который хотим вывести результат преобразования, — это папка с именем " predict_houses_tfjs " в текущем каталоге.

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

  • model.json
  • Group1-shard1of1.bin

Это файлы, необходимые для запуска модели в веб-браузере. Сохраните эти файлы, так как мы будем использовать их в следующем разделе.

6. Использование преобразованной модели в браузере

Разместите преобразованные файлы

Сначала нам нужно разместить наш model.json и сгенерированные файлы *.bin на веб-сервере, чтобы мы могли получить к ним доступ через нашу веб-страницу. Для этой демонстрации мы будем использовать Glitch.com , чтобы вам было проще следовать инструкциям. Однако, если у вас есть опыт веб-разработки, вы можете вместо этого запустить простой HTTP-сервер на вашем текущем экземпляре сервера Ubuntu. Выбор за вами.

Загрузка файлов на Glitch

  1. Войдите на Glitch.com
  2. Воспользуйтесь этой ссылкой, чтобы клонировать наш шаблонный проект TensorFlow.js . Он содержит базовые HTML, CSS и JS файлы, которые импортируют библиотеку TensorFlow.js и готовы к использованию.
  3. В левой панели щелкните папку "Ресурсы".
  4. Нажмите «Загрузить ресурс» и выберите файл group1-shard1of1.bin для загрузки в эту папку. После загрузки он должен выглядеть примерно так: 25a2251c7f165184.png
  5. Если вы щёлкнете по только что загруженному файлу group1-shard1of1.bin вы сможете скопировать URL-адрес этого файла. Скопируйте этот путь, как показано ниже: 92ded8d46442c404.png
  6. Теперь отредактируйте файл model.json с помощью вашего любимого текстового редактора на локальном компьютере и найдите (используя CTRL+F) файл group1-shard1of1.bin , который будет упомянут где-то в нем.

Замените это имя файла на URL-адрес, скопированный вами на шаге 5, но удалите из скопированного пути префикс https://cdn.glitch.com/ , который генерирует glitch.

После редактирования должно получиться примерно так (обратите внимание, что начальный путь к серверу был удален, поэтому сохранилось только имя загружаемого файла): d5a338f2dc1f31d4.png 7. Теперь сохраните и загрузите отредактированный файл model.json в Glitch, нажав на раздел assets, а затем нажав кнопку «Загрузить ресурс» (важно) . Если вы не используете физическую кнопку и перетаскиваете файл, он будет загружен как редактируемый файл, а не на CDN, который будет находиться не в той же папке, и будет использоваться относительный путь, когда TensorFlow.js попытается загрузить бинарные файлы для данной модели. Если вы все сделали правильно, вы должны увидеть 2 файла в папке assets , примерно такого вида: 51a6dbd5d3097ffc.png

Отлично! Теперь мы готовы использовать сохраненные файлы с реальным кодом в браузере.

Загрузка модели

Теперь, когда мы разместили преобразованные файлы, мы можем написать простую веб-страницу для загрузки этих файлов и использования их для прогнозирования. Откройте script.js в папке проекта Glitch и замените его содержимое следующим кодом после того, как вы изменили const MODEL_URL , чтобы она указывала на сгенерированную ссылку Glitch.com для вашего файла model.json , который вы загрузили на Glitch:

script.js:

// Grab a reference to our status text element on the web page.
// Initially we print out the loaded version of TFJS.
const status = document.getElementById('status');
status.innerText = 'Loaded TensorFlow.js - version: ' + tf.version.tfjs;

// Specify location of our Model.json file we uploaded to the Glitch.com CDN.
const MODEL_URL = YOUR MODEL.JSON URL HERE! CHANGE THIS!';
// Specify a test value we wish to use in our prediction.
// Here we use 950, so we expect the result to be close to 950,000.
const TEST_VALUE = 950.0

// Create an asynchronous function.
async function run() {
    // Load the model from the CDN.
    const model = await tf.loadLayersModel(MODEL_URL);

    // Print out the architecture of the loaded model.
    // This is useful to see that it matches what we built in Python.
    console.log(model.summary());

    // Create a 1 dimensional tensor with our test value.
    const input = tf.tensor1d([TEST_VALUE]);

    // Actually make the prediction.
    const result = model.predict(input);

    // Grab the result of prediction using dataSync method
    // which ensures we do this synchronously.
    status.innerText = 'Input of ' + TEST_VALUE + 
        'sqft predicted as $' + result.dataSync()[0];
}

// Call our function to start the prediction!
run();

При выполнении приведенного выше кода после изменения константы MODEL_URL таким образом, чтобы она указывала на путь к вашему файлу model.json получается результат, показанный ниже.

c5e8457213058ec3.png

Если мы посмотрим в консоль веб-браузера (нажмите F12, чтобы открыть инструменты разработчика в браузере), мы также увидим описание загруженной модели, которое выводит:

35e79d70dbd66f27.png

Сравнивая это с нашим кодом на Python, который мы использовали в начале этого практического занятия, мы можем подтвердить, что это та же самая нейронная сеть, которую мы создали с одним полносвязным входным слоем и одним полносвязным слоем с одним узлом.

Поздравляем! Вы только что запустили преобразованную модель, обученную на Python, в веб-браузере!

7. Модели, которые не конвертируются

В некоторых случаях более сложные модели, компилируемые для использования менее распространенных операций, могут не поддерживаться для преобразования. Браузерная версия TensorFlow.js представляет собой полную переработку TensorFlow, и поэтому в настоящее время мы не поддерживаем все низкоуровневые операции, которые есть в API TensorFlow C++ (их тысячи), хотя со временем, по мере нашего роста и стабилизации основных операций, будут добавляться новые.

На момент написания этой статьи одной из таких функций в TensorFlow Python, которая генерирует неподдерживаемую операцию при экспорте в качестве сохраненной модели, является linalg.diag . Если мы попытаемся преобразовать сохраненную модель, использующую эту функцию, в Python (который поддерживает генерируемые ею операции), мы увидим ошибку, аналогичную показанной ниже:

5df94fc652393e00.png

Здесь красным выделено, что вызов linalg.diag в результате компиляции создает операцию с именем MatrixDiagV3 которая на момент написания этого практического задания не поддерживается TensorFlow.js в веб-браузере.

Что делать?

У вас есть два варианта.

  1. Реализуйте эту отсутствующую операцию в TensorFlow.js — мы являемся проектом с открытым исходным кодом и приветствуем вклад в такие вещи, как новые операции. Ознакомьтесь с этим руководством по написанию новых операций для TensorFlow.js. Если вам это удастся, вы можете использовать флаг Skip_op_check в нашем конвертере командной строки, чтобы игнорировать эту ошибку и продолжить преобразование в любом случае (он будет предполагать, что эта операция доступна в вашей новой сборке TensorFlow.js, которую вы создали и в которой поддерживается отсутствующая операция).
  2. Определите, какая часть вашего кода на Python привела к неподдерживаемой операции в экспортированном файле savedmodel . В небольшом фрагменте кода это легко найти, но в более сложных моделях это может потребовать довольно длительного исследования, поскольку в настоящее время нет метода для идентификации вызова высокоуровневой функции Python, которая привела к данной операции, уже находящейся в формате файла savedmodel . Однако, найдя этот метод, вы потенциально можете изменить его, используя другой поддерживаемый метод.

8. Поздравляем!

Поздравляем, вы сделали первые шаги в использовании модели Python через TensorFlow.js в веб-браузере!

Краткий обзор

В этой практической работе по программированию мы научились:

  1. Настройте нашу среду Linux для установки TensorFlow на основе Python.
  2. Экспорт файла Python 'SavedModel'
  3. Установите конвертер командной строки TensorFlow.js.
  4. Используйте конвертер командной строки TensorFlow.js для создания необходимых файлов на стороне клиента.
  5. Используйте сгенерированные файлы в реальном веб-приложении.
  6. Определите модели, которые не будут конвертированы, и что необходимо внедрить, чтобы обеспечить их конвертацию в будущем.

Что дальше?

Не забудьте отметить нас в своих работах, используя хэштег #MadeWithTFJS , чтобы получить шанс попасть в наши публикации в социальных сетях или даже на будущие мероприятия TensorFlow. Мы будем рады увидеть, что вы конвертируете и используете на стороне клиента в браузере!

Больше практических заданий по TensorFlow.js для более глубокого изучения темы.

Сайты, которые стоит посмотреть