Используйте TPU Coral Edge для запуска моделей TFlite в Node с помощью TensorFlow.js

1. Введение

54e81d02971f53e8.png

Последнее обновление: 11 апреля 2022 г.

В этой Codelab вы узнаете, как обучить модель классификации изображений с помощью Teachable Machine и запустить ее с аппаратным ускорением Coral с помощью TensorFlow.js , мощной и гибкой библиотеки машинного обучения для JavaScript. Вы создаете приложение Electron, которое отображает изображения с веб-камеры и классифицирует их с помощью TPU Coral Edge. Полностью рабочая версия этой Codelab доступна в репозитории sig-tfjs на GitHub .

Нужно ли мне устройство Coral?

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

Что ты построишь

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

  • Классифицирует изображения с веб-камеры по категориям, определенным в обученной вами модели.
  • Использует ускоритель Coral для повышения производительности, если он доступен.
  • Использует WebNN для повышения производительности, если он поддерживается вашей платформой.

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

  • Как установить и настроить пакет NPM tfjs-tflite-node для запуска моделей TFLite в Node.js.
  • Как установить библиотеку времени выполнения Edge TPU для запуска моделей на устройстве Coral.
  • Как ускорить вывод модели с помощью ТПУ Coral Edge.
  • Как ускорить вывод модели с помощью WebNN .

Эта лаборатория кода посвящена TFLite в Node.js. Нерелевантные концепции и кодовые блоки замалчиваются и предоставляются для простого копирования и вставки.

Что вам понадобится

Чтобы завершить эту Codelab, вам необходимо:

2. Настройте

Получить код

Мы поместили весь код, необходимый для этого проекта, в репозиторий Git. Для начала возьмите код и откройте его в любимой среде разработки. Для этой лаборатории мы рекомендуем использовать Raspberry Pi под управлением ОС Raspberry Pi (64-разрядной версии) с настольным компьютером . Это упрощает подключение ускорителя Coral.

Настоятельно рекомендуется: используйте Git для клонирования репозитория на Raspberry Pi.

Чтобы получить код, откройте новое окно терминала и клонируйте репо:

git clone https://github.com/tensorflow/sig-tfjs.git

Все файлы, которые вам нужно отредактировать для codelab, находятся в каталоге tfjs-tflite-node-codelab (внутри sig-tfjs ). В этом каталоге вы найдете подкаталоги с именами starter_code , cpu_inference_working , coral_inference_working и webnn_inference_working . Это контрольные точки для этапов этой лаборатории кода.

Среди других файлов в репозитории есть пакеты NPM, от которых зависит tfjs-tflite-node-codelab . Вам не нужно будет редактировать ни один из этих файлов, но вам нужно будет запустить некоторые из их тестов, чтобы убедиться, что ваша среда настроена правильно.

Установите библиотеку времени выполнения Edge TPU.

Перед использованием устройств Coral необходимо установить библиотеку времени выполнения Edge TPU. Установите его, следуя инструкциям для вашей платформы.

В Linux/Raspberry Pi

В Linux библиотека доступна из PPA Google в виде пакета Debian , libedgetpu1-std , для архитектур x86-64 и Armv8 (64-бит). Если ваш процессор использует другую архитектуру, вам нужно будет скомпилировать его из исходников .

Запустите эту команду, чтобы добавить Google Coral PPA и установить библиотеку времени выполнения Edge TPU.

# None of this is needed on Coral boards
# This repo is needed for almost all packages below
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
# This repo is needed for only python3-coral-cloudiot and python3-coral-enviro
echo "deb https://packages.cloud.google.com/apt coral-cloud-stable main" | sudo tee /etc/apt/sources.list.d/coral-cloud.list

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update
sudo apt-get install libedgetpu1-std

В Windows/других ОС

Предварительно скомпилированные двоичные файлы доступны для версий MacOS и Windows x86-64 и могут быть установлены путем запуска сценария install.sh или install.bat в загруженном архиве.

Перезагрузите ваше устройство

После установки Edge TPU Runtime перезагрузите устройство, чтобы активировать новое правило Coral Udev, добавленное установщиком.

Убедитесь, что ваше устройство Coral обнаружено

Чтобы убедиться, что ваше устройство Coral обнаружено и работает, запустите интеграционные тесты для пакета coral-tflite-delegate . Этот пакет находится в корневом каталоге репозитория. Чтобы запустить интеграционные тесты, подключите ускоритель Coral и выполните следующие команды в каталоге пакета:

npx yarn
npx yarn build-deps
npx yarn test-integration

Вы должны увидеть такой вывод:

yarn run v1.22.17
$ yarn build && yarn test-integration-dev
$ tsc
$ jasmine --config=jasmine-integration.json
Platform node has already been set. Overwriting the platform with node.
Randomized with seed 78904
Started

============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
WARNING: converting 'int32' to 'uint8'
.


1 spec, 0 failures
Finished in 2.777 seconds
Randomized with seed 78904 (jasmine --random=true --seed=78904)
Done in 6.36s.

Не беспокойтесь об установке @tensorflow/tfjs-node, как указано в журналах, поскольку вы будете запускать модель в TFLite.

Если вместо этого выходные данные содержат Encountered unresolved custom op: edgetpu-custom-op , то ваше устройство Coral не было обнаружено. Убедитесь, что вы установили библиотеку времени выполнения Edge TPU и подключили устройство Coral к компьютеру. Вы также можете воспользоваться руководством по началу работы Coral , чтобы протестировать версию привязок Coral для Python. Если версия Python работает, но эти тесты по-прежнему терпят неудачу, сообщите нам об этом , отправив отчет об ошибке .

Запустите стартовый код

Теперь вы готовы запустить стартовый код. Чтобы начать, выполните следующие действия.

  1. Перейдите в каталог starter_code в каталоге tfjs-tflite-node-codelab .
  2. запустите npm install , чтобы установить зависимости.
  3. Запустите npm start , чтобы запустить проект. Должно открыться приложение, показывающее видеопоток с веб-камеры вашего компьютера.

Какова наша отправная точка?

Нашей отправной точкой является базовое приложение камеры Electron , разработанное для этой лаборатории. Код был упрощен, чтобы показать концепции лаборатории кода, и в нем мало обработки ошибок. Если вы решите повторно использовать какой-либо код в рабочем приложении, убедитесь, что вы исправили все ошибки и полностью протестировали весь код.

A basic electron app with a live feed of the device's camera.

Изучите стартовый код

В этом стартовом коде много файлов, но единственный, который вам нужно редактировать, — это renderer.js . Он контролирует то, что отображается на странице, включая видеоканал и элементы HTML, и именно здесь вы добавляете в приложение свою модель машинного обучения. Среди других файлов есть файл index.html , но он всего лишь загружает файл renderer.js . Также имеется файл main.js , который является точкой входа для Electron . Он контролирует жизненный цикл приложения, включая то, что показывать при его открытии и что делать при закрытии, но вам не нужно будет вносить в него какие-либо изменения.

Откройте отладчик

Возможно, вам придется отладить свое приложение, следуя этой лаборатории кода. Поскольку это приложение основано на Electron , в него встроен отладчик Chrome. На большинстве платформ его можно открыть с помощью Ctrl + Shift + i . Перейдите на вкладку «Консоль» , чтобы просмотреть журналы и сообщения об ошибках приложения.

Здесь больше нечего исследовать, так что давайте сразу приступим к обучению классификатора изображений!

3. Обучите классификатор изображений

В этом разделе вы обучаете версии пользовательской модели классификации изображений TFLite и Coral.

Обучение классификатора

Классификатор изображений принимает входные изображения и присваивает им метки. В этой лаборатории кода вы используете Teachable Machine для обучения модели в браузере. Чтобы ускорить обучение этому разделу, вы можете использовать настольный компьютер или ноутбук вместо Raspberry Pi, но вам придется скопировать полученные файлы на Pi.

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

  1. Откройте страницу обучения Teachable Machine в новой вкладке.
  2. Выберите «Проект изображения» , а затем «Стандартная модель изображения» .
  3. Добавьте образцы изображений для каждого класса. Самый простой способ сделать это — использовать вход с веб-камеры. Вы также можете переименовать классы.
  4. Когда вы собрали достаточно данных для каждого класса (обычно достаточно 50 образцов), нажмите Train Model .

Когда модель завершит обучение, вы должны увидеть предварительный просмотр результатов модели.

A model is trained on images from two classes,

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

  1. Если вы удовлетворены точностью модели, нажмите « Экспортировать модель» . Вам нужно будет загрузить две отдельные версии модели.
  2. Экспортируйте свою модель как модель с плавающей запятой Tensorflow Lite. При этом будет загружен файл converted_tflite.zip . который работает на процессоре.
  3. Экспортируйте свою модель как модель Tensorflow Lite EdgeTPU. При этом загружается файл converted_edgetpu.zip , который работает на Coral Edge TPU.

4. Запустите модель ЦП в своем приложении.

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

Добавьте файл модели в приложение

Разархивируйте файл модели Convert_tflite.zip , который вы скачали при обучении классификатора. В архиве два файла. model_uquant.tflite — это сохраненная модель TFLite, включая график модели и веса. labels.txt содержит удобочитаемые метки для классов, прогнозируемых моделью. Поместите оба файла в каталог модели .

Установить зависимости

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

  • tfjs-tflite-node : пакет TensorFlow.js для запуска моделей TFLite в Node.js.
  • @tensorflow/tfjs : основной пакет TensorFlow.js.

@tensorflow/tfjs уже установлен, но вам нужно установить tfjs-tflite-node с помощью этой команды:

npm install --save tfjs-tflite-node

После установки добавьте его в приложение в верхней части renderer.js :

CODELAB, часть 1: Импортируйте tfjs-tflite-node.

const {loadTFLiteModel} = require('tfjs-tflite-node');

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

Теперь вы готовы загрузить модель. tfjs-tflite-node предоставляет для этого функцию loadTFLiteModel . Он может загружать модели из пути к файлу, ArrayBuffer или URL-адреса TFHub. Чтобы загрузить вашу модель и ее вес, добавьте это в main функцию:

CODELAB, часть 1: Загрузите модель здесь.

const modelPath = './model/model_unquant.tflite';
const model = await loadTFLiteModel(modelPath);
const labels = fs.readFileSync('./model/labels.txt', 'utf8')
      .split('\n');

Запустите модель

Запуск вашей модели занимает три шага. Сначала вы извлекаете и предварительно обрабатываете входной кадр с веб-камеры. Затем вы запускаете модель на этом кадре и получаете прогноз. После этого вы отображаете прогноз на странице.

Предварительная обработка ввода с веб-камеры

На данный момент веб-камера — это просто элемент HTML, и отображаемые ею кадры недоступны для файла JavaScript renderer.js. Для получения кадров с веб-камеры TensorFlow.js предоставляет tf.data.webcam , который предоставляет простой в использовании метод capture() для захвата кадров с камеры.

Чтобы использовать его, добавьте этот код настройки в main() :

CODELAB, часть 1. Настройте tf.data.webcam здесь.

const tensorCam = await tf.data.webcam(webcam);

Затем, чтобы захватывать изображение каждый кадр, добавьте в run() следующее:

CODELAB, часть 1: захват кадров с веб-камеры здесь.

const image = await tensorCam.capture();

Вам также необходимо предварительно обработать каждый кадр, чтобы он был совместим с моделью. Модель, которую использует эта кодовая лаборатория, имеет входную форму [1, 224, 224, 3], поэтому она ожидает RGB-изображение размером 224 на 224 пикселя. tensorCam.capture() дает форму [224, 224, 3], поэтому вам нужно добавить дополнительное измерение в передней части тензора с помощью tf.expandDims . Кроме того, модель ЦП ожидает ввода Float32 между -1 и 1 , но веб-камера фиксирует значения от 0 до 255. Вы можете разделить входной тензор на 127, чтобы изменить его диапазон с [0, 255] на [0, ~2] а затем вычтите 1, чтобы получить желаемый диапазон [-1, ~1]. Добавьте эти строки в tf.tidy() в функции run() , чтобы сделать это:

CODELAB, часть 1: Предварительная обработка кадров веб-камеры здесь.

const expanded = tf.expandDims(image, 0);
const divided = tf.div(expanded, tf.scalar(127));
const normalized = tf.sub(divided, tf.scalar(1));

Важно избавиться от тензоров после их использования. tf.tidy() делает это автоматически для кода, содержащегося в его обратном вызове, но не поддерживает асинхронные функции. Вам нужно будет вручную избавиться от созданного ранее тензора изображения, вызвав его метод dispose() .

CODELAB, часть 1. Разместите здесь кадры веб-камеры.

image.dispose();

Запустите модель и отобразите результаты

Чтобы запустить модель на предварительно обработанных входных данных, вызовите model.predict() для нормализованного тензора. Это возвращает одномерный тензор, содержащий прогнозируемую вероятность каждой метки. Умножьте эту вероятность на 100, чтобы получить процентную вероятность каждой метки, и используйте функцию showPrediction , включенную в стартовый код, чтобы отобразить прогноз модели на экране.

Этот код также использует stats.js для определения времени прогнозирования, помещая вызовы stats.begin и stats.end вокруг model.predict .

CODELAB, часть 1: Запустите модель и отобразите здесь результаты.

stats.begin();
const prediction = model.predict(normalized);
stats.end();
const percentage = tf.mul(prediction, tf.scalar(100));
showPrediction(percentage.dataSync(), labels);

Запустите приложение еще раз с помощью yarn start , и вы должны увидеть классификации вашей модели.

The TFLite CPU model runs in the Electron app. It classifies images from the webcam and displays confidence values for each class below.

Производительность

В текущей настройке модель работает на процессоре. Это подходит для настольных компьютеров и большинства ноутбуков, но может быть нежелательно, если вы запускаете его на Raspberry Pi или другом устройстве с низким энергопотреблением. На Raspberry Pi 4 вы, вероятно, увидите около 10 кадров в секунду, что может быть недостаточно для некоторых приложений. Чтобы повысить производительность без использования более быстрого компьютера, вы можете использовать кремний для конкретного приложения в виде Coral Edge TPU.

5. Запустите модель Coral в своем приложении.

Если у вас нет устройства Coral, вы можете пропустить этот раздел.

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

Шаги для запуска модели Coral почти идентичны шагам для запуска модели CPU. Основное отличие – формат модели. Поскольку Coral поддерживает только тензоры uint8, модель квантована. Это влияет на входные тензоры, передаваемые в модель, и выходные тензоры, которые она возвращает. Еще одно отличие состоит в том, что модели необходимо скомпилировать с помощью компилятора Edge TPU для работы на Coral TPU. TeachableMachine уже проделал этот шаг, но вы можете узнать, как сделать это для других моделей, посетив документацию Coral .

Добавьте файл модели Coral в приложение.

Разархивируйте файл модели Convert_edgetpu.zip , который вы скачали при обучении классификатора. В архиве два файла. model_edgetpu.tflite — это сохраненная модель TFLite, включая график модели и веса. labels.txt содержит удобочитаемые метки для классов, прогнозируемых моделью. Поместите файл модели в каталог coral_model .

Установить зависимости

Для запуска моделей Coral требуется библиотека времени выполнения Edge TPU . Прежде чем продолжить, убедитесь, что вы установили его, следуя инструкциям по установке.

Доступ к устройствам Coral осуществляется как делегаты TFLite . Чтобы получить к ним доступ из JavaScript, установите пакет coral-tflite-delegate :

npm install --save coral-tflite-delegate

Затем импортируйте делегат, добавив эту строку в начало файла renderer.js :

CODELAB, часть 2. Импортируйте делегат сюда.

const {CoralDelegate} = require('coral-tflite-delegate');

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

Теперь вы готовы загрузить модель Coral. Вы делаете это так же, как и для модели ЦП, за исключением того, что теперь вы передаете параметры функции loadTFLiteModel для загрузки делегата Coral.

CODELAB, часть 2: Загрузите здесь модель делегата.

const coralModelPath = './coral_model/model_edgetpu.tflite';
const options = {delegates: [new CoralDelegate()]};
const coralModel = await loadTFLiteModel(coralModelPath, options);

Вам не нужно загружать метки, поскольку они такие же, как и для модели ЦП.

Добавьте кнопку для переключения между процессором и Coral.

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

Добавьте кнопку с этим кодом:

CODELAB, часть 2. Создайте здесь кнопку делегата.

let useCoralDelegate = false;
const toggleCoralButton = document.createElement('button');
function toggleCoral() {
  useCoralDelegate = !useCoralDelegate;
  toggleCoralButton.innerText = useCoralDelegate
      ? 'Using Coral. Press to switch to CPU.'
      : 'Using CPU. Press to switch to Coral.';
}
toggleCoralButton.addEventListener('click', toggleCoral);
toggleCoral();
document.body.appendChild(toggleCoralButton);

Давайте подключим это условие к функции run() . Если useCoralDelegate имеет значение false, он должен запускать версию ЦП. В противном случае будет запущена версия Coral (но на данный момент она просто ничего не делает). Оберните код запуска модели ЦП в оператор if . Обратите внимание, что expanded тензор исключен из оператора if, поскольку он используется в модели Coral.

CODELAB, часть 2: здесь проверьте, следует ли использовать делегат.

// NOTE: Don't just copy-paste this code into the app.
// You'll need to edit the code from the CPU section.
const expanded = tf.expandDims(image, 0);
if (useCoralDelegate) {
  // CODELAB part 2: Run Coral prediction here.
} else {
  const divided = tf.div(expanded, tf.scalar(127));
  const normalized = tf.sub(divided, tf.scalar(1));
  stats.begin();
  const prediction = model.predict(normalized);
  stats.end();
  const percentage = tf.mul(prediction, tf.scalar(100));
  showPrediction(percentage.dataSync(), labels);
}

Запустите модель

Версия модели Coral ожидает тензоры uint8 от 0 до 255, поэтому ее входные данные не нуждаются в нормализации. Однако выходные данные также представляют собой тензор uint8 в диапазоне от 0 до 255. Перед отображением его необходимо преобразовать в число с плавающей запятой от 0 до 100.

CODELAB, часть 2: Запустите прогноз Coral здесь. (Это часть фрагмента кода выше)

stats.begin();
const prediction = coralModel.predict(expanded);
stats.end();
const percentage = tf.div(tf.mul(prediction, tf.scalar(100)), tf.scalar(255));
showPrediction(percentage.dataSync(), labels);

Запустите приложение еще раз с помощью yarn start , и оно должно отобразить классификации из ускорителя Coral.

The CPU and Coral models run in the app one at a time, and a button switches between them. The CPU model gets around 20 FPS and the Coral model gets around 45.

Вы можете переключаться между выводами Coral и CPU, нажимая кнопку. Вы могли заметить, что рейтинги достоверности модели Coral менее точны, чем у модели CPU, и обычно заканчиваются четным десятичным знаком. Эта потеря точности является компромиссом при использовании квантовой модели на Coral. На практике это обычно не имеет значения, но об этом следует помнить.

Примечание о производительности

Частота кадров, которую вы видите, включает предварительную и постобработку, поэтому она не отражает того, на что способно оборудование Coral. Вы можете получить лучшее представление о производительности, нажимая на индикатор FPS, пока он не покажет задержку (в миллисекундах), которая измеряет только вызов model.predict . Однако это все равно включает время, необходимое для перемещения тензоров в собственные привязки C TFLite, а затем на устройство Coral, поэтому это не идеальное измерение. Более точные тесты производительности, написанные на C++, см. на странице тестов EdgeTPU .

Также следует отметить, что видео было записано на ноутбуке, а не на Raspberry Pi, поэтому вы можете увидеть другой FPS.

Ускорение предварительной обработки Coral

В некоторых случаях вы можете ускорить предварительную обработку, переключив бэкэнд TFJS. Серверной частью по умолчанию является WebGL, который хорош для больших распараллеливаемых операций, но это приложение не делает большую часть этого на этапе предварительной обработки (единственная операция, которую оно использует, — expandDims , которая не является параллельной). Вы можете переключиться на серверную часть ЦП, чтобы избежать дополнительной задержки при перемещении тензоров в графический процессор и обратно, добавив эту строку после импорта в верхней части файла.

tf.setBackend(‘cpu');

Это также влияет на предварительную обработку модели ЦП TFLite, которая распараллелена , поэтому с этим изменением модель работает намного медленнее.

6. Ускорьте модель ЦП с помощью WebNN

Если у вас нет ускорителя Coral или вы просто хотите опробовать другой способ ускорения модели, вы можете использовать делегат WebNN TFLite . Этот делегат использует аппаратное обеспечение машинного обучения, встроенное в процессоры Intel, для ускорения вывода моделей с помощью набора инструментов OpenVINO . Следовательно, у него есть дополнительные требования, которые не были рассмотрены в разделе настройки этой лаборатории кода, и вам потребуется установить набор инструментов OpenVINO. Прежде чем продолжить, обязательно проверьте свою настройку на поддерживаемых целевых системных платформах , но учтите, что делегат WebNN еще не поддерживает macOS.

Установите набор инструментов OpenVINO

Набор инструментов OpenVINO использует аппаратное обеспечение машинного обучения, встроенное в процессоры Intel, для ускорения моделей. Вы можете загрузить предварительно скомпилированную версию с сайта Intel или собрать ее из исходного кода . Существует несколько способов установки OpenVINO, но для целей данного Codelab мы рекомендуем использовать сценарий установки для Windows или Linux . Обязательно установите версию среды выполнения 2021.4.2 LTS, поскольку другие версии могут быть несовместимы . После запуска установщика обязательно настройте переменные среды вашей оболочки, как описано в инструкциях по установке для Linux или Windows ( постоянное решение ), или запустив команду setupvars.sh (Linux) или setupvars.bat (Windows), расположенную в каталоге webnn-tflite-delegate .

Убедитесь, что делегат WebNN работает.

Чтобы убедиться, что делегат WebNN работает правильно, запустите интеграционные тесты для пакета webnn-tflite-delegate который находится в корневом каталоге репозитория. Чтобы запустить интеграционные тесты, выполните следующие команды в каталоге пакета:

# In webnn-tflite-delegate/
npx yarn
npx yarn test-integration

Вы должны увидеть такой вывод:

WebNN delegate: WebNN device set to 0.
INFO: Created TensorFlow Lite WebNN delegate for device Default and power Default.

============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
label: wine bottle
score:  0.934505045413971
.


1 spec, 0 failures
Finished in 0.446 seconds
Randomized with seed 58441 (jasmine --random=true --seed=58441)
Done in 8.07s.

Если вы видите такой вывод, это указывает на ошибку конфигурации:

Platform node has already been set. Overwriting the platform with node.
Randomized with seed 05938
Started
error Command failed with exit code 3221225477.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Этот вывод, скорее всего, означает, что вы не установили переменные среды OpenVINO. На данный момент вы можете установить их, запустив команду setupvars.sh (Linux) или setupvars.bat (Windows), но вы можете захотеть установить их навсегда, следуя инструкциям Linux или Windows ( постоянное решение ). Если вы используете Windows ,

setupvars.bat

Команда не поддерживает Git bash , поэтому убедитесь, что вы запускаете ее и другие команды из этой лаборатории кода из командной строки Windows.

Установите делегат WebNN

Установив OpenVINO, вы готовы ускорить модель ЦП с помощью WebNN. В этом разделе лаборатории кода используется код, который вы написали в разделе «Запуск модели ЦП в вашем приложении». Вы можете использовать код, который вы написали на этом этапе, но если вы уже завершили раздел Coral, используйте вместо этого контрольную точку cpu_inference_working , чтобы начать с чистого листа.

Часть делегата WebNN Node.js распространяется на npmjs. Чтобы установить его, выполните следующую команду:

npm install --save webnn-tflite-delegate

Затем импортируйте делегат, добавив эту строку в начало файла renderer.js :

CODELAB, часть 2. Импортируйте делегат сюда.

const {WebNNDelegate, WebNNDevice} = require('webnn-tflite-delegate');

Делегат WebNN поддерживает работу на процессоре или графическом процессоре; WebNNDevice позволяет вам выбирать, что использовать.

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

Теперь вы готовы загрузить модель с включенным делегатом WebNN. Для Coral вам пришлось загрузить другой файл модели, но WebNN поддерживает тот же формат модели, что и TFLite. Добавьте WebNNDelegate в список делегатов, переданных модели, чтобы включить его:

CODELAB, часть 2: Загрузите здесь модель делегата.

let webnnModel = await loadTFLiteModel(modelPath, {
  delegates: [new WebNNDelegate({webnnDevice: WebNNDevice.DEFAULT})],
});

Вам не нужно загружать этикетки повторно, поскольку это та же модель.

Добавьте кнопку для переключения между процессором TfLite и WebNN.

Теперь, когда версия модели WebNN готова, добавьте кнопку для переключения между выводами ЦП WebNN и TfLite. При одновременном запуске обоих приложений трудно увидеть разницу в производительности.

Добавьте кнопку с этим кодом (обратите внимание, что она пока не переключает модели):

CODELAB, часть 2. Создайте здесь кнопку делегата.

let useWebNNDelegate = false;
const divElem = document.createElement('div');
const toggleWebNNButton = document.createElement('button');
function toggleWebNN() {
  useWebNNDelegate = !useWebNNDelegate;
  toggleWebNNButton.innerHTML = useWebNNDelegate
      ? 'Using WebNN. Press to switch to TFLite CPU.'
      : 'Using TFLite CPU. Press to switch to WebNN.';
  divElem.hidden = useWebNNDelegate ? false : true;
}

toggleWebNNButton.addEventListener('click', toggleWebNN);
toggleWebNN();
document.body.appendChild(toggleWebNNButton);
document.body.appendChild(divElem);

Этот код также добавляет элемент div , который вы используете для настройки параметров WebNN в следующем разделе.

Добавьте раскрывающийся список для переключения между устройствами WebNN.

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

// Create elements for WebNN device selection
divElem.innerHTML = '<br/>WebNN Device: ';
const selectElem = document.createElement('select');
divElem.appendChild(selectElem);

const webnnDevices = ['Default', 'GPU', 'CPU'];
// append the options
for (let i = 0; i < webnnDevices.length; i++) {
  var optionElem = document.createElement('option');
  optionElem.value = i;
  optionElem.text = webnnDevices[i];
  selectElem.appendChild(optionElem);
}

Теперь, если вы запустите приложение, вы увидите раскрывающийся список «По умолчанию», «ГП» и «ЦП». Выбор одного из них сейчас ничего не даст, поскольку раскрывающийся список еще не подключен. The app shows a dropdown where the WebNN device can be selected from Default, GPU, or CPU.

Сделать раскрывающийся список изменить устройство

Чтобы подключить раскрывающийся список и изменить используемое устройство WebNN, добавьте прослушиватель к событию изменения элемента селектора раскрывающегося списка. Когда выбранное значение изменится, воссоздайте модель WebNN с соответствующим устройством WebNN, выбранным в параметрах делегирования.

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

selectElem.addEventListener('change', async () => {
  let webnnDevice;
  switch(selectElem.value) {
    case '1':
      webnnDevice = WebNNDevice.GPU;
      break;
    case '2':
      webnnDevice = WebNNDevice.CPU;
      break;
    default:
      webnnDevice = WebNNDevice.DEFAULT;
      break;
  }
  webnnModel = await loadTFLiteModel(modelPath, {
    delegates: [new WebNNDelegate({webnnDevice})],
  });
});

Благодаря этому изменению раскрывающийся список создает новую модель с правильными настройками каждый раз при ее изменении. Теперь пришло время подключить модель WebNN и использовать ее для вывода.

Запустите модель WebNN

Модель WebNN готова к использованию, но кнопка переключения между WebNN и ЦП TfLite еще не переключает модель. Чтобы переключить модель, сначала необходимо переименовать переменную model , созданную при загрузке модели ЦП TfLite в первом разделе лаборатории кода.

Измените следующую строку...

const model = await loadTFLiteModel(modelPath);

...чтобы оно соответствовало этой строке.

const cpuModel = await loadTFLiteModel(modelPath);

Переименовав переменную model в cpuModel , добавьте ее в функцию run , чтобы выбрать правильную модель в зависимости от состояния кнопки:

CODELAB, часть 2: здесь проверьте, следует ли использовать делегат.

let model;
if (useWebNNDelegate) {
  model = webnnModel;
} else {
  model = cpuModel;
}

Теперь, когда вы запускаете приложение, кнопка переключается между TfLite CPU и WebNN. The TFLite CPU model and the WebNN CPU and GPU models run in the app. When one of the WebNN models is active, a dropdown menu switches between them. The CPU model gets approximately 15 FPS and the WebNN CPU model gets approximately 40.

Вы также можете переключаться между выводом ЦП и графического процессора WebNN, если у вас есть встроенный графический процессор Intel.

Примечание о производительности

Частота кадров, которую вы видите, включает предварительную и постобработку, поэтому она не отражает того, на что способен WebNN. Вы можете получить лучшее представление о производительности, нажимая на индикатор FPS, пока он не покажет задержку (в миллисекундах), которая измеряет только вызов model.predict . Однако это все еще включает в себя время, необходимое для перемещения тензоров в собственные привязки C TFLite, поэтому это не идеальное измерение.

7. Поздравления

Поздравляем! Вы только что завершили свой первый проект Coral/WebNN, используя tfjs-tflite-node в Electron.

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

Резюме

В этой лаборатории вы узнали:

  • Как установить и настроить npm-пакет tfjs-tflite-node для запуска моделей TFLite в Node.js.
  • Как установить библиотеку времени выполнения Edge TPU для запуска моделей на устройстве Coral.
  • Как ускорить вывод модели с помощью ТПУ Coral Edge.
  • Как ускорить вывод модели с помощью WebNN.

Что дальше?

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

Чтобы пойти дальше и узнать больше о том, как TeachableMachine обучил используемую вами модель, ознакомьтесь с нашей кодовой лабораторией Transfer Learning . Если вы ищете другие модели, работающие с Coral, например распознавание речи и оценку позы, загляните на сайт coral.ai/models . Вы также можете найти версии ЦП этих и многих других моделей на TensorFlow Hub .

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

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

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

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