Запуск моделей TensorFlow.js на сервере Node.js

Этот пост является четвертым из моей серии о AutoML Vision Edge в Google Cloud. В публикации будет рассказано об использовании Tensorflow.js моделей на NodeJS серверах. Если вы до сих пор не следите за серией AutoML Vision Edge, вот некоторые итоги:

Мы начали эту серию с изучения того, как можно обучить и запустить логический вывод на готовой к работе модели машинного обучения за несколько часов с помощью AutoML Google Cloud.

В первом посте мы использовали формат .tflite, предоставленный AutoML, для выполнения вывода на устройстве.



Во втором посте мы использовали Python для выполнения вывода в формате TF Saved Model, доступном нам как .pb файл.



В третьем посте мы использовали формат tf.js, а также загрузили и запустили модель прямо в браузере.



В этом посте мы узнаем, как использовать формат Tf.js модели AutoML на сервере, а не в браузере. Если вы новичок в этой серии, я бы порекомендовал пройти часть 1 серии, прежде чем читать дальше.

TensorFlow.js с Node.js

TensorFlow.js был расширен для работы на Node.js с использованием библиотеки расширений под названием tfjs-node. Это позволяет использовать TensorFlow.js в серверных приложениях JavaScript без использования Python.

Если вы занимаетесь веб-разработкой или работаете над мобильным приложением, использующим серверы Node.js, вы можете легко использовать AutoML с tfjs-node для обучения и выполнения логического вывода в своем приложении. Это удалит любые дополнительные зависимости, такие как изменение языка на Python (или поиск дополнительного разработчика Python для завершения проекта). И клиент, и сервер могут быть написаны на JavaScript, а модели машинного обучения также могут быть выведены на стороне сервера.

Поддержка Node.js в AutoML нигде должным образом не документирована. Этот пост поможет вам понять и использовать пакет tfjs-node с моделями кромок на основе AutoML.

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

TensorFlow.js и Node.js с AutoML

Чтобы использовать модели AutoML в Node.js, первым делом необходимо установить все необходимые пакеты.

Шаг 1. Установка пакетов

npm init
npm install @tensorflow/tfjs-node @tensorflow/tfjs-automl 

Шаг 2: Включение всех пакетов в начало файла:

const tf = require("@tensorflow/tfjs-node");
const automl = require("@tensorflow/tfjs-automl");
const fs = require("fs");
const path = require('path');

В модели TensorFlow.js, как мы видели в предыдущем сообщении блога, есть много файлов .bin, а также файл model.json.

Шаг 3. Загрузка модели и файла словаря

tf.js также требуется dictionary файл, в котором мы определили классы для модели классификации. Файл словаря доступен в формате экспортированной модели tf.js:

const loadDictionary = modelUrl => {
   const lastIndexOfSlash = modelUrl.lastIndexOf("/");
   const prefixUrl = lastIndexOfSlash >= 0 ? modelUrl.slice(0,
   lastIndexOfSlash + 1) : "";
   const dictUrl = `${prefixUrl}dict.txt`;
   const text = fs.readFileSync(dictUrl, { encoding: "utf-8" });
   return text.trim().split("\n");
 };

Мы будем использовать tf.loadGraphModel() из tensorflow/tfjs-node . Функция загрузит все файлы моделей или .bin файлы, используя model.json файлы.

Функция возвращает Promise<tf.GraphModel>, , который является направленным ациклическим графом, построенным на основе SavedModel GraphDef, и позволяет нам выполнять вывод:

const [model, dict] = await     Promise.all([tf.loadGraphModel(`file://${modelUrl}`),
loadDictionary(modelUrl)
]);

Как только цепочка Promise предоставит нам переменные model и dict, мы можем передать их функции AutoML ImageClassificationModel, как показано ниже:

const loadImageClassification = async modelUrl => {
  const [model, dict] = await Promise.all([
                       tf.loadGraphModel(`file://${modelUrl}`),
                       loadDictionary(modelUrl)
  ]);
  return new automl.ImageClassificationModel(model, dict);
};

Шаг 4: Выполнение вывода для входного изображения

Перед выполнением вывода нам нужно убедиться, что мы предоставляем правильный формат модели. В этом случае наша модель принимает трехмерный тензор Uint8Array. Вы можете использовать Netron, чтобы узнать формат ввода, поддерживаемый нашей моделью.

const decodeImage = imgPath => {
  const imgSrc = fs.readFileSync(imgPath);
  const arrByte = Uint8Array.from(Buffer.from(imgSrc));
  return tf.node.decodeImage(arrByte);
};
const main = async()=>{
  await loadImageClassification(modelURL);
  return await model.classify(decodedImage);
}

Наконец, мы напишем нашу main функцию, которая будет вызывать нашу loadModelClassification функцию. А затем мы запустим model.classify, который является методом вывода для декодированного изображения.

Теперь мы можем вызвать весь скрипт, как показано ниже:

let output = await main()
                   .then((val)=>{
                         return val
                    }).catch(console.log);
console.log(output);

Результатом будет объект JavaScript, содержащий метки из файла словаря с соответствующими вероятностями:

{"daisy": 0.12, "lotus": 99.88}

Заключение

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

Статья 3 и статья 4 [этот пост] этой серии снимают любые ограничения на использование формата TF.js на стороне клиента или на стороне сервера.

В следующих статьях этой серии мы узнаем о других форматах, поддерживаемых AutoML, и их соответствующих сценариях использования.

Если вам понравилась статья, пожалуйста, хлопните в ладоши. Совет. Ваши 50 хлопков сделают мой день лучше!

Хотите узнать больше обо мне? Пожалуйста, загляните на мой сайт. Если вы хотите получать обновления, подписывайтесь на меня в Twitter и Medium. Если что-то неясно или вы хотите что-то указать, оставьте комментарий ниже.

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

Являясь независимой редакцией, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее создавать лучшие модели машинного обучения.