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

1. Введение

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

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

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

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

Конкретно:

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

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

Поделитесь с нами тем, что вы конвертируете!

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

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

1aee0ede85885520.png

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

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

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

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

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

  • Выполнение WebGL на видеокарте устройства (GPU) — это самый быстрый способ запуска больших моделей (размером более 3 МБ) с ускорением GPU.
  • Выполнение веб-сборки (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 вы можете полностью использовать возможности видеокарты более низкого уровня, что приводит к сокращению времени обучения и вывода. Производительность находится на одном уровне с реализацией Python TensorFlow, поскольку они оба используют один и тот же бэкэнд 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 в качестве базового образа, если вы решите продолжить работу на облачной виртуальной машине.

На момент написания мы можем выбрать образ 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:

тест.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, который мы создали в первом разделе, и обновим код следующим образом:

тест.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 ), мы теперь должны увидеть несколько новых файлов и папок, созданных в нашем текущем каталоге:

  • test.py
  • save_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 тензорного потока вместо keras.
  • tf_frozen_model — для загрузки модели, содержащей замороженные веса.
  • tf_hub — для загрузки модели, созданной из концентратора тензорного потока.

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

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

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

  • модель.json
  • Группа1-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/ , который генерирует ошибка из скопированного пути.

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

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

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

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

скрипт.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 в начале этой лаборатории, мы можем подтвердить, что это та же самая сеть, которую мы создали, с 1 плотным входом и одним плотным слоем с 1 узлом.

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

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

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

На момент написания одной из таких функций в 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
  3. Установите конвертер командной строки TensorFlow.js.
  4. Используйте конвертер командной строки TensorFlow.js для создания необходимых файлов на стороне клиента.
  5. Используйте сгенерированные файлы в реальном веб-приложении.
  6. Определите модели, которые не будут конвертироваться, и что необходимо реализовать, чтобы они могли конвертироваться в будущем.

Что дальше?

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

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

Веб-сайты, которые стоит проверить