Keras.js предоставляет возможность запускать модели Keras
непосредственно в браузере на JavaScript с использованием WebGL или
WebAssembly. Работа с графическим процессором (GPU) и большим объемом
данных требует внимательного контроля использования памяти, особенно при
длительных вычислениях или обработке больших массивов данных. Основными
инструментами управления памятью являются функции dispose()
и tidy().
dispose()Метод dispose() предназначен для явного освобождения
ресурсов, занимаемых объектами типа Tensor. В отличие от
автоматического сборщика мусора JavaScript, который не всегда
освобождает память WebGL, dispose() позволяет удалить
данные из GPU, предотвращая накопление неиспользуемых тензоров.
Пример использования:
const tensor = KerasJS.Tensor.zeros([1000, 1000]);
// Выполнение вычислений с tensor
tensor.dispose(); // Освобождение памяти GPU
Ключевые моменты работы с
dispose():
Tensor или массиву
тензоров.dispose() объект становится недоступен для
дальнейших операций.Советы по использованию:
dispose() для всех сразу.predict() или forward() освобождать
промежуточные результаты, не требуемые для дальнейших шагов.tidy()Функция tidy() автоматизирует управление памятью. Она
выполняет вычисления внутри замыкания и автоматически освобождает все
промежуточные тензоры, кроме тех, что возвращаются из замыкания. Это
позволяет минимизировать ручное отслеживание ресурсов и предотвращает
утечки.
Синтаксис:
const result = KerasJS.Tensor.tidy(() => {
const a = KerasJS.Tensor.zeros([1000, 1000]);
const b = KerasJS.Tensor.ones([1000, 1000]);
const c = a.add(b);
return c; // возвращается только c, a и b будут автоматически освобождены
});
Особенности работы tidy():
tidy() друг в друга для управления
сложными вычислительными цепочками.Рекомендации по применению:
tidy() для всех операций с большим
количеством промежуточных тензоров.tidy(), иначе автоматическое освобождение не
сработает.dispose() и tidy()Комбинация этих инструментов позволяет гибко управлять памятью:
tidy() используется для автоматического удаления
временных данных.dispose() применяется к долгоживущим тензорам или
результатам, которые требуется удалить в конкретный момент.Пример комплексного подхода:
for (let i = 0; i < 100; i++) {
KerasJS.Tensor.tidy(() => {
const input = KerasJS.Tensor.randomNormal([512, 512]);
const output = model.predict(input);
output.dispose(); // если результат не нужен для дальнейших шагов
});
}
В данном примере tidy() гарантирует освобождение
временных тензоров внутри цикла, а dispose() очищает сам
результат, если он не используется дальше.
Для отслеживания потребления памяти в Keras.js можно использовать следующие подходы:
console.log(KerasJS.Tensor.memory());
Возвращает объект с количеством выделенных тензоров и объемом памяти в байтах.
Профилирование операций: для больших моделей рекомендуется периодически проверять состояние памяти, особенно при долгих сессиях или интерактивных приложениях.
Использование tidy() на верхнем уровне
приложения: оборачивание всех больших вычислительных блоков в
tidy() минимизирует риск накопления неосвобожденных
тензоров.
tidy() с dispose() в критичных
участках, где память может расти экспоненциально.tidy().Эффективное управление памятью в Keras.js напрямую влияет на производительность и стабильность приложений, особенно при работе с WebGL и сложными нейросетевыми моделями.