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 иллюстрирует рабочий процесс.
Рисунок 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.
Используйте новую функцию create_inference_graph, чтобы применить оптимизацию TensorRT к замороженным графикам. Затем TensorRT принимает в качестве входных данных замороженный граф TensorFlow и возвращает оптимизированный граф с узлами TensorRT. См. фрагмент кода примера ниже:
Посмотрим на параметры функции:
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 заменяют части модели за счет оптимизации.
Рис. 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.
Рисунок 3. Операции обработки матриц на Tensor Cores
TensorRT автоматически использует тензорные ядра в графических процессорах Volta для вывода при использовании арифметики половинной точности. Пиковая производительность тензорных ядер на NVIDIA Tesla V100 примерно в 10 раз выше, чем у алгоритмов с двойной точностью (FP64), и в 4 раза выше, чем у процессоров с одинарной точностью (FP32). Половинную точность можно включить, просто используя «FP16» в качестве значения параметра precision_mode в функции create_inference_graph, как показано ниже.
На рис. 4 показан разрыв между использованием тензорных ядер NVIDIA Volta и интеграцией TensorFlow-TensorRT с использованием только TensorFlow, при этом ResNet-50 работает в 8 раз быстрее при задержке 7 мс.
Рис. 4. Производительность пропускной способности ResNet-50 для логических выводов
Оптимизация производительности логического вывода INT8
Вывод с точностью INT8 может еще больше увеличить скорость вычислений и снизить требования к пропускной способности. Уменьшенный динамический диапазон усложняет представление весов и активаций в нейронных сетях. Таблица 1 иллюстрирует влияние динамического диапазона.
Таблица 1. Динамический диапазон FP32, FP16 и INT8.
TensorRT предоставляет модели, обученные одинарной точности (FP32) и половинной точности (FP16), и преобразует их для развертывания для квантования INT8 с минимальной потерей точности. Чтобы модель можно было развернуть с помощью INT8, обученную модель FP32 необходимо откалибровать перед применением оптимизации TensorRT. В остальном рабочий процесс остается прежним. На рис. 5 показан обновленный рабочий процесс.
Рисунок 5. Обновленный рабочий процесс TensorFlow, включая калибровку INT8 перед оптимизацией TensorRT.
Сначала откалибруйте модель, используя функцию create_inference_graph с параметром precision_mode, установленным на «INT8». Результатом этой функции является замороженный график TensorFlow, который можно использовать для калибровки.
Затем используйте данные калибровки для построения графика калибровки. TensorRT количественно определяет веса узлов на основе распределения данных узла. Калибровочные данные важны, поскольку они точно отражают распределение проблемного набора данных в рабочей среде. Мы рекомендуем использовать шаблон калибровки INT8 в первый раз, чтобы проверить накопление ошибок во время логического вывода.
После выполнения графика на данных калибровки используйте функцию calib_graph_to_infer_graph, чтобы применить оптимизации TensorRT к калибровочному графику. Также можно заменить подграфы TensorFlow узлами TensorRT, оптимизированными для INT8. Результатом функции является замороженный график TensorFlow, который можно использовать для логического вывода, как обычно.
Эти две команды обеспечивают вывод точности INT8 для моделей TensorFlow. Чтобы запустить все эти образцы кода, нажмитездесь.
Наличие интеграции с TensorRT
Мы продолжим тесно сотрудничать с командой TensorFlow, чтобы повысить удобство использования интеграции TensorRT. Мы ожидаем, что новое решение сохранит простоту использования и гибкость TensorFlow, обеспечивая при этом высочайшую производительность на графических процессорах NVIDIA. А поскольку TensorRT поддерживает работу с несколькими сетями, разработчикам не нужно вносить какие-либо изменения в существующий код, пользуясь только автоматическими обновлениями.
Используйте стандартный процесс установки pip, чтобы получить новое решение для интеграции, как только TensorFlow 1.7 станет доступен:
Подробное описание установки, пожалуйстанажмите. Также доступно в TensorFlowNVIDIA GPU Cloud(NGC) для интеграции. Для получения дополнительной информации о TensorRT см.Страница TensorRT.
Эта статья спонсирована Beiyou@люблю какао-люблю жизньУчитель рекомендовал,Сообщество Alibaba Cloud YunqiОрганизация переводов.
Оригинальное название статьи «Интеграция с TensorRT ускоряет вывод TensorFlow | Блог разработчиков NVIDIA»
автор:Sami Kama,Julie Bernauer,Siddharth Sharma
Переводчик: Альтман, корректор: Юань Ху.
Статья является упрощенным переводом, для более подробной информации, пожалуйста, проверьтеоригинальный