Глава 12. Тестирование, оптимизация и развертывание моделей
497 Таблица 12.3. Сравнение скорости выполнения вывода двух типов моделей (MLP и MobileNetV2)
с оптимизацией и без нее в виде преобразования GraphModel в различных средах развертывания
1
Название и топология модели Время выполнения predict() (мс; чем меньше, тем лучше) (Усредненное значение, по 30 вызовам predict(), с 20 предшествующими вызовами, «для прогрева») WebGL в браузере tfjs-node (только CPU) tfjs-node-gpu LayersModel GraphModel LayersModel GraphModel LayersModel GraphModel MLP
2
13
10 (1.3x)
18
10 (1.8x)
3
1.6 (1.9x)
MobileNetV2
(width = 1.0)
68
57 (1.2x)
187
111 (1.7x)
66
39 (1.7x)
Как преобразование GraphModel ускоряет выполнение вывода
на основе модели
Как преобразование
GraphModel
повышает скорость выполнения вывода моде
лей TensorFlow.js? Благодаря упреждающему анализу графа вычислений модели
TensorFlow (Python) на уровне мелких структурных единиц. После анализа графа
вычислений он модифицируется таким образом, чтобы снизить объем необходимых
вычислений с сохранением численной правильности выходных результатов графа.
Не пугайтесь терминов
«упреждающий анализ» (aheadoftime analysis) и
«на уровне мелких структурных единиц» (fine granularity). Дальше мы их немного поясним.
В качестве конкретного примера подобной модификации графа вычисле
ний рассмотрим функционирование слоя BatchNormalization в
tf.LayersModel
и
tf.GraphModel
. Напомним, что BatchNormalization — слой, улучшающий схо
димость и снижающий переобучение во время обучения. Он доступен в API
TensorFlow.js в виде метода
tf.layers.batchNormalization()
и используется во
многих популярных предобученных моделях, например в MobileNetV2. При ис
пользовании этого слоя в качестве части
tf.LayersModel
производимые вычисления
следуют математическому определению нормализации по батчам:
выходной_сигнал = (
x – mean) / (sqrt(var) + epsilon)
×
gamma + beta.
(12.3)
Для генерации выходного сигнала на основе входного (
x
) требуется вычислить
шесть операций приблизительно в следующем порядке.
1.
sqrt
, с
var
в качестве входного значения.
2.
add
с
epsilon
и результатом первого шага в качестве входных значений.
1
Код, с помощью которого были получены эти результаты, можно найти по адресу
https://github.com/tensorflow/tfjs/tree/master/tfjs/integration_tests/.
2
Этот многослойный перцептрон состоит из плотных слоев со следующим количеством
нейронов: 4000, 1000, 5000 и 1. У первых трех из этих слоев функция активации ReLU;
у последнего — линейная.