TensorFlow.js предоставляет мощные инструменты для
анализа производительности моделей и операций в браузере или Node.js.
Одним из ключевых механизмов является функция tf.profile,
позволяющая детально отслеживать потребление памяти, количество операций
и другие показатели во время выполнения кода.
tf.profile — это асинхронная функция, которая принимает
колбэк и возвращает объект с подробной статистикой. Основные показатели,
доступные через tf.profile:
Пример использования:
import * as tf from '@tensorflow/tfjs';
async function profileExample() {
const profile = await tf.profile(() => {
const a = tf.randomNormal([1000, 1000]);
const b = tf.randomNormal([1000, 1000]);
return a.matMul(b);
});
console.log('Количество новых тензоров:', profile.newTensors);
console.log('Выделено памяти (байт):', profile.newBytes);
console.log('Пиковое потребление памяти (байт):', profile.peakBytes);
console.log('Типы операций:', profile.kernels.map(k => k.name));
profile.result.dispose();
}
profileExample();
Одной из частых проблем при разработке на TensorFlow.js является
утечка памяти. tf.profile позволяет выявлять, какие тензоры
остаются в памяти после выполнения операций.
dispose().const profile = await tf.profile(() => {
const x = tf.ones([5000, 5000]);
const y = tf.ones([5000, 5000]);
const z = x.add(y);
return z;
});
console.log('Пиковая память:', profile.peakBytes);
profile.result.dispose();
Профилирование позволяет выявлять узкие места:
kernel) хранит название
операции, входные и выходные формы тензоров, а также
время выполнения.const profile = await tf.profile(() => {
const a = tf.randomNormal([2000, 2000]);
const b = tf.randomNormal([2000, 2000]);
const c = a.matMul(b);
const d = tf.relu(c);
return d;
});
profile.kernels.forEach(kernel => {
console.log(`Операция: ${kernel.name}, Время: ${kernel.kernelTimeMs} мс`);
});
profile.result.dispose();
TensorFlow.js поддерживает асинхронные операции, такие как
tf.data и вызовы к WebGL. tf.profile корректно
работает с промисами и асинхронными функциями, собирая данные после
завершения всех вычислений внутри колбэка.
const profile = await tf.profile(async () => {
const data = tf.randomUniform([1000, 1000]);
const result = await data.square().array();
return result;
});
console.log('Количество новых тензоров:', profile.newTensors);
dispose(), чтобы не создавать дополнительную нагрузку на
память.tf.engine() предоставляет низкоуровневую информацию о
состоянии тензоров. В сочетании с tf.profile можно
отслеживать:
Пример интеграции:
const profile = await tf.profile(() => {
const x = tf.ones([3000, 3000]);
const y = tf.ones([3000, 3000]);
return x.matMul(y);
});
console.log('Всего тензоров в движке:', tf.engine().memory().numTensors);
profile.result.dispose();
Использование tf.profile и
tf.engine().memory() в комбинации позволяет полностью
контролировать потребление ресурсов и оптимизировать вычисления под
любые условия, будь то браузер или серверная среда Node.js.