Обработка ошибок при загрузке и инференсе

Keras.js — это библиотека для запуска предобученных моделей Keras в среде браузера на JavaScript. При работе с этой библиотекой важно учитывать специфику ошибок, которые могут возникать как при загрузке модели, так и во время выполнения инференса. Надёжная обработка ошибок обеспечивает стабильность работы приложений и предотвращает некорректное поведение при нестандартных условиях.


Ошибки при загрузке модели

1. Некорректный путь к файлу модели

При загрузке модели через KerasJS.Model указанный путь к файлу JSON или бинарным весам должен быть корректным. В случае ошибки пути или отсутствия файла возникает исключение:

const model = new KerasJS.Model({ filepaths: { model: 'model.json' } });
model.ready()
  .then(() => console.log('Модель загружена'))
  .catch(err => console.error('Ошибка загрузки модели:', err));

Особенности обработки:

  • Проверять существование файлов перед инициализацией.
  • Использовать .catch() для перехвата ошибок загрузки.
  • Логировать детали ошибки, включая путь и тип исключения.

2. Несовместимые версии модели и весов

Keras.js строго проверяет соответствие JSON-модели и бинарных весов. Несоответствие может вызвать TypeError или RuntimeError. Это особенно актуально при переносе моделей из Python Keras в браузер:

  • Проверять версию Keras при сохранении модели (model.save('model.json')).
  • Использовать Keras.js-конвертеры, если весовая структура отличается.

3. Ошибки формата модели

JSON-модель должна содержать корректные слои и конфигурацию. Любые пропущенные или некорректные поля приведут к ошибке парсинга:

  • SyntaxError возникает при некорректной структуре JSON.
  • ReferenceError при отсутствии нужных функций активации или слоёв.

Рекомендации:

  • Проверять JSON на валидность через JSON.parse.
  • Убедиться, что все пользовательские слои и функции совместимы с Keras.js.

Ошибки инференса

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

1. Некорректный формат входных данных

Keras.js ожидает вход в виде объектов типа Float32Array или ndarray с точной размерностью, соответствующей конфигурации модели. Несоответствие размерности приводит к Error: input shape mismatch.

Пример правильной передачи данных:

const inputData = new Float32Array([0.1, 0.2, 0.3, 0.4]);
model.predict({ input: inputData })
  .then(outputData => console.log(outputData))
  .catch(err => console.error('Ошибка инференса:', err));

Ключевые моменты:

  • Проверять размерность и тип данных перед вызовом predict.
  • Приводить массивы к Float32Array, избегать обычных массивов JavaScript.

2. Ошибки из-за отсутствия GPU или WebGL

Keras.js поддерживает WebGL для ускорения инференса. Если контекст WebGL недоступен, библиотека может выбросить исключение при создании тензоров на GPU. В таких случаях возможны два варианта:

  • Переключение на CPU-бэкенд.
  • Информирование пользователя о невозможности использования GPU.
const model = new KerasJS.Model({ filepaths: { model: 'model.json' }, gpu: true });
model.ready()
  .then(() => model.predict({ input: inputData }))
  .catch(err => {
    if (err.message.includes('WebGL')) {
      console.warn('WebGL недоступен, переключение на CPU');
      model.gpu = false;
      return model.predict({ input: inputData });
    }
  });

3. Ошибки вычислений внутри модели

Во время инференса могут возникать исключения из-за:

  • Деления на ноль в слоях типа BatchNormalization.
  • Некорректных значений активаций (например, NaN при экспоненциальных функциях).
  • Переполнения памяти при слишком больших входах.

Практические меры:

  • Добавление валидации входных данных (проверка диапазона и отсутствия NaN).
  • Разделение больших батчей на несколько мелких.
  • Использование try/catch вокруг predict для перехвата непредвиденных ошибок.

Логирование и диагностика

Для отладки и мониторинга ошибок полезно внедрять централизованное логирование:

  • Сохранять сообщения ошибок с указанием модели, слоя и шага инференса.
  • Использовать уровни логов (info, warn, error) для различения типов событий.
  • В браузерных приложениях можно отображать уведомления при критических ошибках или отправлять их на сервер для анализа.

Итоговые рекомендации по обработке ошибок

  • Любая асинхронная операция (ready, predict) должна иметь .catch() для надёжного перехвата ошибок.
  • Проверка формата и размерности данных до инференса снижает риск сбоев.
  • Использование try/catch для синхронных операций помогает локализовать ошибки вычислений.
  • Централизованное логирование упрощает диагностику и улучшает поддерживаемость приложений.

Обеспечение стабильной работы Keras.js требует внимательной обработки всех уровней ошибок — от загрузки файлов до выполнения вычислений на GPU или CPU. Правильная архитектура обработки исключений повышает надёжность веб-приложений и предотвращает неожиданные сбои.