Ускорьте вывод TensorFlow с интеграцией TensorRT

TensorFlow Python

NVIDIA объявила, что инструмент оптимизации логических выводов TensorRT будет интегрирован с TensorFlow. Интеграция с TensorRT будет доступна для выпуска TensorFlow 1.7. TensorFlow остается самой популярной платформой глубокого обучения на сегодняшний день, а NVIDIA TensorRT ускоряет получение выводов глубокого обучения за счет оптимизации и повышения производительности для платформ с графическим процессором. Мы надеемся, что использование TensorRT предоставит пользователям TensorFlow максимально возможную производительность логического вывода и почти прозрачный рабочий процесс. Новая интеграция предоставляет простой API, позволяющий оптимизировать FP16 и INT8 с помощью TensorRT в TensorFlow. Для выполнения теста ResNet-50 с малой задержкой TensorRT ускоряет вывод TensorFlow в 8 раз.

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

Оптимизация подграфов в TensorFlow

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

Теперь давайте пройдемся по рабочему процессу шаг за шагом. После замораживания графа TensorFlow для логического вывода используйте TensorRT для оптимизации подграфа TensorFlow. Затем TensorRT заменяет каждый поддерживаемый подграф узлом, оптимизированным для TensorRT, создавая замороженный граф, который запускается в TensorFlow для вывода. Рисунок 1 иллюстрирует рабочий процесс.

TensorRT4_Graphics-modified-workflow-1-7 

Рисунок 1: Схема рабочего процесса при использовании TensorRT во время логического вывода

TensorFlow выполняет графы во всех поддерживаемых доменах и вызывает TensorRT для выполнения узлов, оптимизированных для TensorRT. Например, предположим, что граф имеет три сегмента: A, B и C, а сегмент B оптимизирован с помощью TensorRT и заменен узлом. Затем в процессе вывода TensorFlow выполняет A, затем вызывает TensorRT для выполнения B, а затем продолжает TensorFlow для выполнения C. С точки зрения пользователя процесс такой же, как и до использования TensorFlow для выполнения графов. Теперь давайте посмотрим на пример применения этого рабочего процесса.

Новый API TensorFlow

Давайте посмотрим, как применить оптимизации TensorRT к графикам TensorFlow с помощью нового API TensorFlow. Начните с добавления нескольких строк кода в существующий код графического процессора TensorFlow:

1. Укажите часть памяти графического процессора, доступную для TensorFlow, и TensorRT сможет использовать оставшуюся память.

2. Пусть TensorRT проанализирует граф TensorFlow, применит оптимизацию и заменит подграфы узлами TensorRT.

Используйте новый параметр per_process_gpu_memory_fraction в функции GPUOptions, чтобы указать долю GPU, которую может использовать TensorRT. Этот параметр необходимо установить при первом запуске TensorFlow-TensorRT. Например, 0,67 означает, что 67% памяти графического процессора будет выделено для TensorFlow, а оставшиеся 33% будут использоваться для механизма TensorRT.

4b63304f2f2b3a8c98089d15c9380a18273beac9 

Используйте новую функцию create_inference_graph, чтобы применить оптимизацию TensorRT к замороженным графикам. Затем TensorRT принимает в качестве входных данных замороженный граф TensorFlow и возвращает оптимизированный граф с узлами TensorRT. См. фрагмент кода примера ниже:

b2f9e7776678a6687139c299a487e26590fa7c9d 

Посмотрим на параметры функции:

Frozen_graph_def: замороженный график TensorFlow.

put_node_name: список строк с именами выходных узлов, например.

max_batch_size: целое число, размер входного пакета, например 16.

max_workspace_size_bytes: целое число, максимальная память графического процессора, доступная для TensorRT.

precision_mode: Строка, допустимые значения: «FP32», «FP16» или «INT8».

Наилучшей производительности можно добиться, установив параметры per_process_gpu_memory_fraction и max_workspace_size_bytes. Например, установите для параметра per_process_gpu_memory_fraction значение (12 - 4)/12 = 0,67, а для параметра max_workspace_size_bytes значение 4000000000 для графического процессора объемом 12 ГБ, чтобы выделить 4 ГБ для механизма TensorRT.

Визуализируйте оптимизированный график в TensorBoard

Оптимизации TensorRT сначала применяются в TensorBoard, а затем визуализируются изменения графа узлов ResNet-50. Как показано на рисунке 2, TensorRT оптимизирует почти весь граф и заменяет его узлом «my_trt_po0» (выделено красным). В зависимости от слоев и операций в модели узлы TensorRT заменяют части модели за счет оптимизации.

optimization_result_fig2-625x484.png 

Рис. 2. Слева: график ResNet-50 в TensorBoard. Справа: после оптимизации TensorRT и замены подграфов узлами TensorRT.

Обратите внимание на узел с именем «conv1» под узлом TensorRT. На самом деле это не сверточный слой, а операция транспонирования из NHWC в NCHW, показанная как conv1. Это связано с тем, что TensorBoard по умолчанию отображает только имя верхнего узла в иерархии, а не одну операцию.

Автоматическое использование ядер TensorBoard.

По сравнению с FP32 и FP64, использование алгоритмов половинной точности (то есть FP16) может уменьшить использование памяти нейронными сетями, а также требуется меньше времени для развертывания более крупных сетей. Каждое Tensor Core содержит массив обработки матриц 4x4x4 для выполнения операции D=AxB+C, где A, B, C и D — матрицы 4x4, как показано на рисунке 3. Входными данными A и B для умножения матриц являются матрицы FP16, а матрицы сложения C и D могут быть матрицами FP16 или матрицами FP32.

fig3_matrix_ops.png 

Рисунок 3. Операции обработки матриц на Tensor Cores

TensorRT автоматически использует тензорные ядра в графических процессорах Volta для вывода при использовании арифметики половинной точности. Пиковая производительность тензорных ядер на NVIDIA Tesla V100 примерно в 10 раз выше, чем у алгоритмов с двойной точностью (FP64), и в 4 раза выше, чем у процессоров с одинарной точностью (FP32). Половинную точность можно включить, просто используя «FP16» в качестве значения параметра precision_mode в функции create_inference_graph, как показано ниже.

ad9c1045545275748a85075339de9a29847eebf2 

На рис. 4 показан разрыв между использованием тензорных ядер NVIDIA Volta и интеграцией TensorFlow-TensorRT с использованием только TensorFlow, при этом ResNet-50 работает в 8 раз быстрее при задержке 7 мс.

fig4_resnet50_results-625x435.png

Рис. 4. Производительность пропускной способности ResNet-50 для логических выводов

Оптимизация производительности логического вывода INT8

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

3df33b29f7b1e41c7f06deb3556fd4c8e62f4bff 

Таблица 1. Динамический диапазон FP32, FP16 и INT8.

TensorRT предоставляет модели, обученные одинарной точности (FP32) и половинной точности (FP16), и преобразует их для развертывания для квантования INT8 с минимальной потерей точности. Чтобы модель можно было развернуть с помощью INT8, обученную модель FP32 необходимо откалибровать перед применением оптимизации TensorRT. В остальном рабочий процесс остается прежним. На рис. 5 показан обновленный рабочий процесс.

calibrate_flow-768x302.png 

Рисунок 5. Обновленный рабочий процесс TensorFlow, включая калибровку INT8 перед оптимизацией TensorRT.

Сначала откалибруйте модель, используя функцию create_inference_graph с параметром precision_mode, установленным на «INT8». Результатом этой функции является замороженный график TensorFlow, который можно использовать для калибровки.

ec4d62951bf91d13390022161dde5d2c0b3a3fdc 

Затем используйте данные калибровки для построения графика калибровки. TensorRT количественно определяет веса узлов на основе распределения данных узла. Калибровочные данные важны, поскольку они точно отражают распределение проблемного набора данных в рабочей среде. Мы рекомендуем использовать шаблон калибровки INT8 в первый раз, чтобы проверить накопление ошибок во время логического вывода.

После выполнения графика на данных калибровки используйте функцию calib_graph_to_infer_graph, чтобы применить оптимизации TensorRT к калибровочному графику. Также можно заменить подграфы TensorFlow узлами TensorRT, оптимизированными для INT8. Результатом функции является замороженный график TensorFlow, который можно использовать для логического вывода, как обычно.

529ee2b2b8209d4b62e7de89ba45555a6e3d5dc6 

Эти две команды обеспечивают вывод точности INT8 для моделей TensorFlow. Чтобы запустить все эти образцы кода, нажмитездесь.

Наличие интеграции с TensorRT

Мы продолжим тесно сотрудничать с командой TensorFlow, чтобы повысить удобство использования интеграции TensorRT. Мы ожидаем, что новое решение сохранит простоту использования и гибкость TensorFlow, обеспечивая при этом высочайшую производительность на графических процессорах NVIDIA. А поскольку TensorRT поддерживает работу с несколькими сетями, разработчикам не нужно вносить какие-либо изменения в существующий код, пользуясь только автоматическими обновлениями.

Используйте стандартный процесс установки pip, чтобы получить новое решение для интеграции, как только TensorFlow 1.7 станет доступен:

c730ef53e67a851cea549403c6efb3fbdc681afb 

Подробное описание установки, пожалуйстанажмите. Также доступно в TensorFlowNVIDIA GPU Cloud(NGC) для интеграции. Для получения дополнительной информации о TensorRT см.Страница TensorRT.

Эта статья спонсирована Beiyou@люблю какао-люблю жизньУчитель рекомендовал,Сообщество Alibaba Cloud YunqiОрганизация переводов.

Оригинальное название статьи «Интеграция с TensorRT ускоряет вывод TensorFlow | Блог разработчиков NVIDIA»

автор:Sami Kama,Julie Bernauer,Siddharth Sharma

Переводчик: Альтман, корректор: Юань Ху.

Статья является упрощенным переводом, для более подробной информации, пожалуйста, проверьтеоригинальный