Не так давно RTX 2080 Ti был лучшим графическим процессором потребительского уровня для глубокого обучения (DL) на рынке. Однако это изменилось, когда недавно вышел Titan RTX с лучшей производительностью, гораздо большим объемом видеопамяти (24 ГБ) и внушительной ценой в 2500 долларов.

В этой статье мы рассмотрим новую архитектуру графического процессора Turing, в частности Titan RTX, и узнаем, насколько она хороша для рабочих нагрузок с глубоким обучением (DL).

Полная и половинная точность

Многие улучшения в картах Тьюринга связаны с экспериментированием с числовой точностью моделей глубокого обучения. Давайте углубимся в это и посмотрим, как это работает, а когда нет.

Точность относится к тому, как каждое число представлено в памяти. С полной точностью каждое число занимает 32 бита в памяти. Таким образом, он также известен как FP32. Для чисел с плавающей запятой это означает использование 8 бит для экспоненты и 23 бита для дроби с 1 битом, оставшимся для знака.

Когда числа с плавающей запятой хранятся с половинной точностью, они занимают в памяти 16 бит: 5 бит для экспоненты и 10 для дроби.

Также существует двойная точность (FP64), но она не используется в глубоком обучении, хотя какое-то время является стандартом для научных вычислений. Это привело к тому, что это функция для графических процессоров, предназначенных для центров обработки данных (например, Tesla).

Какую точность использовать?

Исторически графические процессоры использовались для игр (шокер), где вычисления с полной точностью были наиболее полезны. В конце концов, когда графические процессоры начали использоваться для вычислений общего назначения, это соглашение было принято. Исследования в области глубокого обучения и большинства фреймворков высокого уровня (Caffe, Tensorflow, Theano) приняли стандарт полной точности (FP32).

Тот факт, что вычисления FP16 были ограничены в графических процессорах потребительского уровня, определенно не помог.

Все эти изменения произошли с Turing, архитектурой графического процессора последнего поколения, поскольку Nvidia наконец-то позволила нам получить полную скорость FP16, и о боже, это здорово:

  • FP16 позволяет обучать либо вдвое большие модели, либо вдвое большие партии.
  • Обучение в FP16 обычно в 1,5–2 раза быстрее, чем в FP32.
  • FP16 во много раз быстрее (рекламируется как 8x) с выделенными тензорными ядрами для поддерживаемых операций («умножение и накопление матриц», то есть свертка). Однако здесь есть важная оговорка:

Чтобы использовать тензорные ядра, нам нужно, чтобы размеры входного и выходного каналов были кратны восьми.

В противном случае расчет возвращается к обычным ядрам CUDA. (Источник: Nvidia, см. раздел Несколько простых правил). Похоже, что изначально у некоторых людей были проблемы с использованием тензорных ядер. Однако NVIDIA предоставила примеры того, как это сделать для популярных фреймворков DL. В частности, библиотека Apex Amp для PyTorch должна помочь большинству людей использовать тензорные ядра с помощью всего двух строк кода.

Тренировка с половинной точностью (FP16)

К сожалению, это не так просто, как просто вызвать model.half (), чтобы преобразовать вашу сеть в FP16. При половинной точности минимальная разница между двумя числами составляет 2 ^ -11. Это приводит к нескольким предостережениям, которые необходимо учитывать:

  • Градиенты в FP16 могут переполняться - это означает, что градиенты, которые слишком близки к 0, станут нулевыми. Это повредит или замедлит обучение модели.
  • Градиенты часто близки к нулю и затем умножаются на скорость обучения (также меньше 0) для расчета обновлений веса. Результат может стать нулевым при представлении в FP16, в результате чего веса не будут обновлены.
  • Активации могут переполниться, если их станет больше 65 504. Из-за переполнения активаций наша сеть будет учиться неправильно, что серьезно снизит производительность.

Все это потому, что градиенты в моделях DL намного ближе к 0, чем удобно представлять FP16. См. Этот проницательный ответ Quora для получения дополнительной информации по этим вопросам.

К счастью, исследователи Nvidia придумали способ решения этих проблем, который получил название Обучение смешанной точности. Он работает, комбинируя быстрые вычисления FP16 для прямого и обратного распространения и сохраняя как значения FP32, где требуется большая точность (например, обновления веса). Смешанная точность обеспечивает точность, сопоставимую с точностью обучения с полной точностью, как сообщает Nvidia.

Одним из особенно полезных методов является смещение градиентов в представимый диапазон FP16 с использованием масштабирования динамических потерь. Это сводится к умножению потерь на шкалу, которая также масштабирует все веса во время обратного распространения ошибки. Динамическая часть означает увеличение коэффициента масштабирования до тех пор, пока мы не начнем сталкиваться с градиентными переполнениями.

Кроме того, Nvidia выпустила пакет Apex, который включает ранее упомянутые методы PyTorch всего в нескольких строках кода.

Архитектура Тьюринга

Достойное упоминание: Еще несколько месяцев назад GeForce 1080 Ti была моей рекомендацией для начинающих практиков глубокого обучения. Использую сам. Это одна из лучших видеокарт на основе архитектуры графического процессора Pascal с 11 ГБ видеопамяти и отличной производительностью по своей цене. Однако у него был один серьезный недостаток: ужасающая производительность FP16 (1/64 производительности FP32). Это ограничило размер модели и размер партии, которую вы можете использовать.

Несколько месяцев назад были выпущены RTX 2070, RTX 2080 и RTX 2080 Ti, которые быстро зарекомендовали себя как лучшие графические процессоры для глубокого обучения на рынке.

Основан на новейшей архитектуре графического процессора Turing, с 8–11 ГБ ОЗУ, выделенными тензорными ядрами и… барабанной дробью… полной поддержкой FP16.

Как мы уже говорили, FP16 обязательно изменит правила игры для DL, как только мы научимся с ним тренироваться. Тензорные ядра - хорошее дополнение, если можно подогнать свои модели под требования (см. Выше). По сути, карты Turing намного лучше, чем графические процессоры Pascal предыдущего поколения для DL.

Titan RTX против RTX 2080 Ti

Titan RTX получил много критики за свою цену по сравнению с другими картами Тьюринга. Итак, если говорить о слоне в комнате, по сравнению с 2080 Ti, Titan RTX - ужасная ценность ДЛЯ ИГРОКОВ. Или процитируем Nvidia: «Тем не менее, для высококлассных энтузиастов-геймеров мы бы порекомендовали GeForce RTX 2080 Ti, которая предлагает исключительные игры в разрешении 4K по гораздо более доступной цене».

Однако исследователи и практики глубокого обучения, которым нужна дополнительная VRAM и повышение производительности, могут найти в Titan хорошую цену.

Поскольку Titan RTX в 3–4 раза дороже других графических процессоров на основе Тьюринга, давайте посмотрим, откуда берется такая внушительная цена:

  • Намного больше ОЗУ - 24 ГБ ОЗУ с поддержкой FP16 означает, что вы можете разместить на карте огромные модели. Здесь подходят медицинские модели визуализации и GAN, поскольку они работают с большими входными данными.
  • Полноскоростное обучение со смешанной точностью (FP16 с накоплением FP32) - несколько параграфов назад было объяснено обучение смешанной точности. Когда модель использует ядра Tensor, она очень быстро выполняет операцию умножения-накопления матриц. Второй шаг в этой операции (накопление) должен быть выполнен на FP32, чтобы сохранить точность, а затем преобразован в FP16. Операция накопления выполняется с половинной скоростью на RTX 2080 и RTX 2080 Ti, но на полной скорости на Titan RTX. На практике это заставляет Titan RTX работать на 10-20% быстрее при использовании тензорных ядер.
  • Если вы подумываете о приобретении двух RTX 2080 Ti против Titan RTX, есть важное предостережение: Тим Деттмерс сообщает, что использование нескольких карт RTX рядом друг с другом с дизайном с двумя вентиляторами (стандартная конструкция) может привести к перегреву. . Так что либо купите RTX 2080 Ti с дизайном в стиле вентилятора, либо выберите RTX.

Контрольные точки

Поскольку Nvidia было так любезно предоставлено мне для обзора Titan RTX, можно сделать несколько тестов.

Настройка теста:

Программное обеспечение: тесты были выполнены с использованием последних образов Nvidia Docker для Tensorflow.

  • Драйверы: 415.27
  • CUDA 10.0
  • Tensorflow 1.12
  • CuDNN 7.4.2

Оборудование:

  • Процессор: Intel i5 7500
  • ОЗУ: 32 ГБ ОЗУ (слишком мало, но я убедился, что это не было узким местом)
  • Твердотельный накопитель NVMe 480 ГБ
  • Материнская плата: Asus TUF Z270
  • Блок питания Deepcool 750 Вт Gold

Я убедился, что графический процессор был полностью загружен и что ввод не ограничивал производительность.

Сверточные нейронные сети

Процедура тестирования: было выполнено 500 шагов обучения, и скорость обработки (изображений в секунду) была усреднена. Resnet 50, 101 и 152 были обучены на Imagenet со смешанной точностью с точностью FP16 (с динамическим масштабированием потерь) и с точностью FP32. Размеры пакетов 64, 96, 128, 192 и 256 рассматривались в зависимости от модели, точности и доступной видеопамяти.

Некоторые интересные результаты: переход от полной к половинной точности дает улучшение на 90%. Однако увеличение размера пакета не приводит к значительному увеличению скорости обработки. Насколько я понимаю, это связано с тем, что свертки ограничены вычислительной скоростью графического процессора. Но запасная видеопамять позволяет нам тренировать более крупные модели, и мы поработали Resnet 101 и 152:

Рекуррентные нейронные сети

Тестируемая модель представляла собой нейронный машинный перевод Google через OpenSeq2Seq от Nvidia. Опять же, 500 обучающих итераций были выполнены с полной и половинной точностью, причем размер пакета был настолько велик, насколько он уместился в памяти.

Улучшение перехода от FP32 к FP16 при использовании тензорных ядер может достигать 2,5x при использовании того же размера пакета.

С помощью RNN увеличение размера пакета позволяет обрабатывать больше объектов за раз, что приводит к линейному увеличению скорости обработки. Но, конечно, при условии, что на карту можно будет постоянно подавать данные (загрузка GPU во время тестов была на уровне 98–99%).

Вывод

Я не совсем знаком с тонкостями обслуживания моделей машинного обучения, но у Nvidia есть образ докера TensorRT, оптимизированный для логических выводов, и я подумал, что отпущу его. Тесты проводятся на модели Resnet 50 с размером партии 128 с использованием синтетических данных.

Совершенно неожиданно наблюдается впечатляющий 4-кратный скачок производительности при переходе от FP32 к FP16. Вызван ли этот эффект тем, что выделенные тензорные ядра делают то, что у них лучше всего? Я так полагаю.

Кроме того, если вы квантуете свою модель до Int8 (используя 8 бит для представления целых чисел), вы получите еще один большой выигрыш в производительности. В то время как целочисленное обучение - очень многообещающая тема для исследований, целочисленный вывод, похоже, никуда не денется.

В заключение

Стоит ли того блестящего Titan RTX? Да, если вы знаете, для чего будете использовать 24 ГБ видеопамяти.

Если вы используете графический процессор предыдущего поколения, помните, что с FP16 вы сможете разместить на графическом процессоре вдвое больше моделей / партий. Таким образом, эти 24 ГБ будут фактически 48 ГБ. Если вы не чувствуете себя ограниченным видеопамятью, GTX 2080 или 2080 Ti обеспечат вам лучшую производительность за ваши деньги.

Но если вы столкнулись с ограничениями VRAM, ясно видите потребность в дополнительной видеопамяти и можете себе это позволить, Titan RTX - прекрасная технология, которая позволит вывести ваши модели DL на новый уровень.

Отказ от ответственности: Nvidia предоставила Titan RTX для тестирования.

Если вам понравилась эта статья, помогите другим найти ее, удерживая некоторое время значок хлопка. Спасибо!