[Перевод] Что покупать для глубокого обучения: личный опыт и советы использования GPU

Перевод статьи Тима Деттмерса, кандидата наук из Вашингтонского университета, специалиста по глубокому обучению и обработке естественного языка

Глубокое обучение (ГО) — область с повышенными запросами к вычислительным мощностям, поэтому ваш выбор GPU фундаментально определит ваш опыт в этой области. Но какие свойства важно учесть, если вы покупаете новый GPU? Память, ядра, тензорные ядра? Как сделать лучший выбор по соотношению цены и качества? В данной статье я подробно разберу все эти вопросы, распространённые заблуждения, дам вам интуитивное представление о GPU, а также несколько советов, которые помогут вам сделать правильный выбор.

Статья написана так, чтобы дать вам несколько разных уровней понимания GPU, в т.ч. новой серии Ampere от NVIDIA. У вас есть выбор:

  1. Если вам не интересны детали работы GPU, что именно делает GPU быстрым, чего уникального есть в новых GPU серии NVIDIA RTX 30 Ampere — можете пропустить начало статьи, вплоть до графиков по быстродействию и быстродействию на $1 стоимости, а также раздела рекомендаций. Это ядро данной статьи и наиболее ценное содержимое.
  2. Если вас интересуют конкретные вопросы, то наиболее частые из них я осветил в последней части статьи.
  3. Если вам нужно глубокое понимание того, как работают GPU и тензорные ядра, лучше всего будет прочесть статью от начала и до конца. В зависимости от ваших знаний по конкретным предметам вы можете пропустить главу-другую.


Каждая секция предваряется небольшим резюме, которое поможет вам решить, читать её целиком или нет.

Содержание


Обзор
Как работают GPU?
Самые важные характеристики GPU, влияющие на скорость обработки
Тензорные ядра
Перемножение матриц без тензорных ядер
Перемножение матриц с тензорными ядрами
Пропускная способность памяти
Общая память / Кэш L1 / Регистры
Оценка эффективности Ampere в ГО
Теоретические оценки скорости Ampere
Практические оценки скорости Ampere
Возможные неточности оценок
Что ещё следует учесть в случае с Ampere / RTX 30
Разреженное обучение
Вычисления с низкой точностью
Новый дизайн вентилятора и проблемы с теплоотводом
Трёхслотовые карты и проблемы питания
Эффективность GPU при глубоком обучении
Скорость глубокого обучения GPU в пересчёте на стоимость
Рекомендации по выбору GPU
Когда мне понадобится более 11 ГБ памяти?
Когда можно обойтись памятью менее 11 ГБ?
Общие рекомендации
Рекомендации для GPU-кластеров
Какие GPU лучше не покупать
Когда лучше не покупать новых GPU?
Ответы на вопросы и заблуждения
Нужна ли мне PCIe 4.0?
Нужны ли мне линии PCIe 8x/16x?
Как впихнуть четыре RTX 3090, если каждая из них занимает по 3 слота PCIe?
Как охлаждать 4 RTX 3090 или 4 RTX 3080?
Можно ли использовать GPU нескольких разных типов?
Что такое NVLink, и нужно ли оно мне?
У меня нет денег даже на самые дешёвые ваши рекомендации. Что делать?
Что нужно для параллелизации проекта между двумя машинами?
Подходят ли алгоритмы перемножения разреженных матриц для любых разреженных матриц?
Нужен ли мне процессор от Intel для работы с несколькими GPU?
Имеет ли значение для охлаждения форма корпуса?
Догонят ли AMD GPU + ROCm когда-нибудь NVIDIA GPU + CUDA?
Когда лучше использовать облачные сервисы, а когда — специальный компьютер с GPU?
Советы для тех, кому лень читать

Обзор


Данная статья структурирована следующим образом. Сначала я объясняю, что делает GPU быстрым. Я опишу разницу между процессорами и GPU, тензорные ядра, пропускную способность памяти, иерархию памяти GPU, и как это всё связано с быстродействием в задачах ГО. Эти объяснения, возможно, помогут вам лучше понять, какие параметры GPU вам нужны. Потом я дам теоретические оценки быстродействия GPU и их соответствие с некоторыми тестами на скорость от NVIDIA, чтобы получить надёжные данные по быстродействию без предвзятости. Я опишу уникальные особенности GPU серии NVIDIA RTX 30 Ampere, которые стоит рассмотреть при покупке. Затем я дам рекомендации по GPU для вариантов с 1–2 чипами, 4, 8, и GPU-кластеров. Потом пойдёт раздел ответов на частые вопросы, которые мне задавали в твиттере. Там же будут развеяны распространённые заблуждения и освещены разные проблемы типа облаков против настольных компьютеров, охлаждения, AMD против NVIDIA, и др.

Как работают GPU?


Если вы часто пользуетесь GPU, полезно понимать, как они работают. Это знание пригодится вам, чтобы разобраться, почему в некоторых случаях GPU оказываются медленнее, а в других — быстрее. И тогда вы, возможно, поймёте, нужен ли вам вообще GPU, и какие варианты железа смогут соревноваться с ним в будущем. Вы можете пропустить этот раздел, если просто хотите получить полезную информацию по быстродействию и аргументы в пользу выбора определённого GPU. Лучше всего на общем уровне я объяснил принципы работы GPU в ответе на сайте Quora.

Это общее объяснение, хорошо раскрывающее вопрос о том, почему для ГО GPU подходят лучше, чем процессоры. Если мы изучим детали, мы сможем понять, чем GPU отличаются друг от друга.

Самые важные характеристики GPU, влияющие на скорость обработки


Этот раздел поможет вам более интуитивно мыслить на тему быстродействия в области ГО. Это понимание поможет вам оценивать будущие GPU самостоятельно.

Тензорные ядра


Резюме:

  • Тензорные ядра уменьшают количество тактов, необходимых для подсчёта умножений и сложений в 16 раз — в моём примере для матрицы 32×32 с 128 до 8 тактов.
  • Тензорные ядра уменьшают зависимость от повторяющегося доступа в общую память, экономя такты доступа в память.
  • Тензорные ядра работают так быстро, что вычисления перестают быть узким местом. Единственным узким местом остаётся передача им данных.


Сегодня существует настолько много недорогих GPU, что почти каждый может позволить себе GPU с тензорными ядрами. Поэтому я всегда рекомендую GPU с тензорными ядрами. Полезно разобраться в принципах их работы, чтобы оценить важность этих вычислительных модулей, специализирующихся на перемножении матриц. На простом примере перемножения матриц A*B=C, где размер всех матриц равен 32×32, я покажу вам, как выглядит перемножение с тензорными ядрами и без них.

Чтобы разобраться в этом, сначала вам нужно понять концепцию тактов. Если процессор работает с частотой 1 ГГц, он проделывает 109 тактов в секунду. Каждый такт — это возможность для вычислений. Но по большей части операции идут дольше, чем один такт. Получается конвейер — чтобы начать выполнение одной операции, нужно сначала подождать столько тактов, сколько требуется на выполнение предыдущей операции. Это также называется задержкой операции.

Вот некоторые важные длительности, или задержки операции в тактах:

  • Доступ к глобальной памяти до 48 Гб: ~200 тактов.
  • Доступ к общей памяти (до 164 КБ на потоковый мультипроцессор): ~20 тактов.
  • Совмещённое умножение-сложение (СУС): 4 такта.
  • Перемножение матриц в тензорных ядрах: 1 такт.


Также вам нужно знать, что самая малая единица нитей в GPU — пакет из 32 нитей — называется варп [warp]. Варпы обычно работают синхронно — всем нитям внутри варпа нужно дождаться друг друга. Все операции в памяти GPU оптимизированы под варпы. К примеру, загрузка из глобальной памяти идёт по 32×4 байта — по 32 числа с плавающей запятой, по одному такому числу на каждую нить в варпе. В потоковом мультипроцессоре (эквивалент ядра процессора для GPU) может быть до 32 варпов = 1024 нити. Ресурсы мультипроцессора делятся между всеми активными варпами. Поэтому иногда нам нужно, чтобы работало меньше варпов, чтобы на один варп приходилось больше регистров, общей памяти и ресурсов тензорных ядер.

В обоих примерах предположим, что у нас есть одинаковые вычислительные ресурсы. В этом небольшом примере перемножения матриц 32×32 мы используем 8 мультипроцессоров (~10% от RTX 3090) и по 8 варпов на мультипроцессоре.

Перемножение матриц без тензорных ядер


Если нам нужно перемножить матрицы A*B=C, каждая из которых имеет размер 32×32, тогда нам нужно загрузить данные из памяти, к которой мы постоянно обращаемся, в общую память, поскольку задержки доступа к ней примерно в 10 раз меньше (не 200 тактов, а 20 тактов). Блок памяти в общей памяти часто называют плиткой памяти [memory tile], или просто плиткой. Загрузку двух 32×32 чисел с плавающей запятой в плитку общей памяти можно провести параллельно, используя 2×32 варпа. У нас есть 8 мультипроцессоров по 8 варпов каждый, поэтому благодаря параллелизации нам нужно провести одну последовательную загрузку из глобальной в общую память, на что уйдёт 200 тактов.

Для перемножения матриц нам нужно загрузить вектор из 32 чисел из общей памяти А и общей памяти В, и провести СУС, а потом сохранить выход в регистрах С. Мы разделяем эту работу так, чтобы каждый мультипроцессор занимался 8-ю скалярными произведениями (32×32) для вычисления 8 выходных данных для С. Почему их ровно 8 (в старых алгоритмах — 4), это уже чисто техническая особенность. Чтобы разобраться с этим, рекомендую прочесть статью Скотта Грэя. Это означает, что у нас пройдёт 8 доступов к общей памяти стоимостью в 20 тактов каждый, и 8 операций СУС (32 параллельных), стоимостью 4 такта каждая. В сумме стоимость получится:

200 тактов (глобальная память) + 8×20 тактов (общая память) + 8×4 такта (СУС) = 392 такта

Теперь посмотрим на эту стоимость для тензорных ядер.

Перемножение матриц с тензорными ядрами


При помощи тензорных ядер можно перемножить матрицы 4×4 за один цикл. Для этого нам нужно скопировать память в тензорные ядра. Как и выше, нам нужно прочесть данные из глобальной памяти (200 тактов) и сохранить их в общей. Для перемножения матриц 32×32 нам нужно произвести 8×8=64 операций в тензорных ядрах. В одном мультипроцессоре находится 8 тензорных ядер. С 8 мультипроцессорами у нас будет 64 тензорных ядра — как раз столько, сколько надо! Мы можем передать данные из общей памяти в тензорные ядра за 1 передачу (20 тактов), а потом провести все эти 64 операции параллельно (1 такт). Это значит, что общая стоимость перемножения матриц в тензорных ядрах будет:

200 тактов (глобальная память) + 20 тактов (общая память) + 1 такт (тензорные ядра) = 221 такт

Таким образом, используя тензорные ядра, мы значительно уменьшаем стоимость перемножения матриц, с 392 до 221 такта. В нашем упрощённом примере тензорные ядра уменьшили стоимость как доступа к общей памяти, так и операций СУС.

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

Однако, как мне кажется, из этого примера становится понятно, почему следующий атрибут, пропускная способность памяти, так важна для GPU с тензорными ядрами. Поскольку глобальная память — наиболее затратная вещь при перемножении матриц с тензорными ядрами, наши GPU были бы гораздо быстрее, если бы удалось уменьшить задержки доступа к глобальной памяти. Это можно сделать, либо увеличив тактовую частоту памяти (больше тактов в секунду, но больше тепла и энергопотребления), либо увеличив количество элементов, которые можно передавать за раз (ширину шины).

Пропускная способность памяти


В предыдущем разделе мы увидели, насколько быстры тензорные ядра. Настолько быстры, что большую часть времени они простаивают, ожидая, пока к ним поступят данные из глобальной памяти. К примеру, во время обучения по проекту BERT Large, где использовались очень большие матрицы — чем больше, тем для тензорных ядер лучше — утилизация тензорных ядер в TFLOPS составила порядка 30%, что означает, что 70% времени тензорные ядра простаивали.

Это означает, что при сравнении двух GPU с тензорными ядрами одним из лучших индикаторов быстродействия каждого из них будет служить пропускная способность памяти. К примеру, у A100 GPU пропускная способность составляет 1,555 ГБ/с, а у V100 — 900 ГБ/с. Простейший подсчёт говорит, что A100 будет быстрее V100 в 1555/900 = 1,73 раза.

Общая память / Кэш L1 / Регистры


Поскольку ограничивающим быстродействие фактором является передача данных в память тензорных ядер, мы должны обратиться к другим свойствам GPU, позволяющим ускорить передачу к ним данных. С этим связаны общая память, кэш L1 и количество регистров. Чтобы понять, как иерархия памяти ускоряет передачу данных, полезно понять, как в GPU происходит перемножение матриц.

Для перемножения матриц мы пользуемся иерархией памяти, идущей от медленной глобальной памяти к быстрой локальной общей памяти, и затем к сверхбыстрым регистрам. Однако чем быстрее память, тем она меньше. Поэтому нам нужно делить матрицы на меньшие, а потом выполнять перемножение этих меньших плиток в местной общей памяти. Тогда оно будет происходить быстро и ближе к потоковому мультипроцессору (ПМ) — эквиваленту ядра процессора. Тензорные ядра позволяют нам сделать ещё один шаг: мы берём все плитки и грузим их часть в тензорные ядра. Общая память обрабатывает матричные плитки в 10–50 раз быстрее, чем глобальная память GPU, а регистры тензорных ядер обрабатывают её в 200 раз быстрее, чем глобальная память GPU.

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

Размеры плитки определяются объёмами памяти на каждый из ПМ — эквивалент ядра процессора на GPU. В зависимости от архитектур эти объёмы составляют:

  • Volta: 96 кБ общей памяти / 32 кБ L1
  • Turing: 64 кБ общей памяти / 32 кБ L1
  • Ampere: 164 кБ общей памяти / 32 кБ L1


Видно, что у Ampere обща память гораздо больше, что позволяет использовать плитки большего размера, что уменьшает количество обращений к глобальной памяти. Поэтому Ampere эффективнее пользуется пропускной способностью памяти GPU. Это увеличивает быстродействие на 2–5%. Особенно увеличение заметно на огромных матрицах.

У тензорных ядер Ampere есть ещё одно преимущество — объём общих для нескольких нитей данных у них больше. Это уменьшает количество обращений к регистрам. Объём регистров ограничен 64 к на ПМ или 255 на нить. Если сравнить с Volta, тензорные ядра Ampere используют в 3 раза меньше регистров, благодаря чему на каждую плитку в общей памяти имеется больше активных тензорных ядер. Иначе говоря, мы можем загрузить в 3 раза больше тензорных ядер тем же количеством регистров. Однако поскольку пропускная способность остаётся узким местом, увеличение TFLOPS на практике будет мизерным, по сравнению с теоретическим. Новые тензорные ядра улучшили быстродействие примерно на 1–3%.

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

Оценка эффективности Ampere в ГО


Резюме:

  • Теоретические оценки на основе пропускной способности памяти и улучшенной иерархии памяти у Ampere GPU предсказывают ускорение в 1,78 — 1,87 раз.
  • NVIDIA опубликовала данные по измерениям скорости для Tesla A100 и V100 GPU. Они больше маркетинговые, но на их основе можно построить непредвзятую модель.
  • Непредвзятая модель говорит о том, что по сравнению с V100 на Tesla A100 в 1,7 раз быстрее работает обработка естественного языка и в 1,45 раз быстрее компьютерное зрение.


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

Теоретические оценки скорости Ampere


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

Пропускная способность Tesla A100 GPU по сравнению с Tesla V100 увеличивается в 1555/900 = 1,73 раз. Также разумно ожидать увеличения скорости на 2–5% из-за большей общей памяти, и на 1–3% из-за улучшения тензорных ядер. Получается, что ускорение должно составить от 1,78 до 1,87 раза.

Практические оценки скорости Ampere


Допустим, у нас есть оценка одного GPU для такой архитектуры, как Ampere, Turing или Volta. Легко экстраполировать эти результаты на другие GPU такой же архитектуры или серии. К счастью, NVIDIA уже провела тесты сравнения A100 и V100 на разных задачах, связанных с компьютерным зрением и пониманием естественного языка. К несчастью, NVIDIA сделала всё возможное, чтобы эти числа нельзя было сравнивать напрямую — в тестах использовали различные размеры пакетов данных и разное количество GPU, чтобы A100 не могла выиграть. Так что, в каком-то смысле, полученные показатели быстродействия частично честные, частично рекламные. В целом можно утверждать, что увеличение размера пакетов данных обосновано, поскольку у A100 больше памяти — однако, для сравнения GPU-архитектур нам нужно сравнивать непредвзятые данные по быстродействию на задачах с одинаковым размером пакета данных.

Чтобы получить непредвзятые оценки, можно масштабировать результаты измерений V100 и A100 двумя способами: учитывать разницу в размере пакета данных, или учитывать разницу в количестве GPU — 1 против 8. Нам повезло, и мы можем найти подобные оценки для обоих случаев в представленных NVIDIA данных.

Удвоение размера пакета увеличивает пропускную способность на 13,6% в изображениях в секунду (для свёрточных нейросетей, СНС). Я измерил скорость той же задачи с архитектурой Transformer на моём RTX Titan, и, как ни удивительно, получил такой же результат — 13,5%. Судя по всему, это надёжная оценка.

Увеличивая параллелизацию сетей, увеличивая количество GPU, мы теряем в быстродействии из-за накладных расходов, связанных с сетями. Но система A100 8x GPU лучше работает с сетями (NVLink 3.0) по сравнению с V100 8x GPU (NVLink 2.0) — и это ещё один запутывающий фактор. Если посмотреть на данные от NVIDIA, можно увидеть, что для обработки СНС у системы с 8-ю A100 накладные расходы на 5% ниже, чем у системы с 8-ю V10000. Это значит, что если переход от 1-го A10000 к 8-и A10000 даёт вам ускорение, допустим, в 7,0 раз, то переход от 1-го V10000 к 8-и V10000 даёт вам ускорение только в 6,67 раз. Для трансформеров эта цифра составляет 7%.

Используя эту информацию, мы можем оценить ускорение некоторых определённых архитектур ГО непосредственно на основе предоставленных NVIDIA данных. Tesla A100 имеет следующие преимущества в скорости по сравнению с Tesla V100:

  • SE-ResNeXt101: 1,43 раз.
  • Masked-R-CNN: 1,47 раз.
  • Transformer (12 слоёв, машинный перевод, WMT14 en-de): 1,70 раз.


Поэтому для компьютерного зрения числа получаются ниже теоретической оценки. Это может происходить из-за меньших измерений тензора, накладных расходов операций, которые требуются для подготовки перемножения матриц типа img2col или быстрое преобразование Фурье, или операций, не способных насытить GPU (конечные слои часто оказываются относительно маленькими). Также это может оказаться артефактами определённых архитектур (сгруппированная свёртка).

Практическая оценка скорости работы трансформера очень близка к теоретической. Вероятно, потому, что алгоритмы работы с большими матрицами весьма прямолинейны. Для подсчёта эффективности затрат на GPU я буду использовать практические оценки.

Возможные неточности оценок


Выше даны сравнительные оценки A100 и V100. В прошлом NVIDIA тайком ухудшила работу «игровых» RTX GPU: уменьшила утилизацию тензорных ядер, добавила игровые вентиляторы для охлаждения, запретила передачу данных между GPU. Возможно, что в серии RT 30 также внесли неизвестные ухудшения по сравнению с Ampere A100.

Что ещё следует учесть в случае с Ampere / RTX 30


Резюме:

  • Ampere позволяет проводить обучение сетей на основе разреженных матриц, что ускоряет процесс обучения максимум в два раза.
  • Разреженное обучение сетей до сих пор редко используется, однако благодаря ему Ampere не скоро устареет.
  • У Ampere есть новые типы данных с малой точностью, благодаря чему использовать малую точность гораздо проще, однако это не обязательно даст прирост в скорости по сравнению с предыдущими GPU.
  • Новый дизайн вентиляторов хорош, если между GPU у вас есть свободное место — однако непонятно, эффективно ли будут охлаждаться GPU, стоящие вплотную.
  • 3-слотовый дизайн RTX 3090 будет проблемой для сборок по 4 GPU. Возможные решения — использовать 2-слотовые варианты или расширители для PCIe.
  • Четырём RTX 3090 потребуется больше питания, чем может предложить любой стандартный БП на рынке.


У новых NVIDIA Ampere RTX 30 есть дополнительные преимущества перед NVIDIA Turing RTX 20 — разреженное обучение и улучшенная обработка данных нейросетью. Остальные свойства, типа новых типов данных, можно считать простым повышением удобства — они ускоряют работу так же, как и серия Turing, не требуя при этом дополнительного программирования.

Разреженное обучение


Ampere позволяет с большой скоростью и автоматически перемножать разреженные матрицы. Это работает так — вы берёте матрицу, режете её на кусочки по 4 элемента, и поддерживающее разреженные матрицы тензорное ядро разрешает двум элементам из этих четырёх быть нулевыми. Это приводит к ускорению работы в 2 раза, поскольку требования к пропускной способности во время перемножения матриц в два раза уменьшаются.

В своих исследованиях я работал с разреженным обучением сетей. Работу критиковали, в частности, за то, что я «уменьшаю необходимые для сети FLOPS, но не увеличиваю из-за этого скорость, потому что GPU не умеют быстро перемножать разреженные матрицы». Ну что ж — поддержка перемножения разреженных матриц появилась в тензорных ядрах, и мой алгоритм, или любой другой алгоритм (ссылка, ссылка, ссылка, ссылка), работающий с разреженным матрицами, теперь реально может работать во время обучения в два раза быстрее.

Хотя эта свойство пока считается экспериментальным, а обучение разреженных сетей не применяется повсеместно, если у вашего GPU есть поддержка этой технологии, то вы готовы к будущему разреженного обучения.

Вычисления с низкой точностью


Я уже демонстрировал, как новые типы данных могут улучшать стабильность обратного распространения с низкой точностью в моей работе. Пока что проблемой стабильного обратного распространения с 16-битными числами с плавающей запятой является то, что обычные типы данных поддерживают только промежуток [-65,504, 65,504]. Если ваш градиент выйдет за этот промежуток, то взорвётся, выдав значения NaN. Для предотвращения этого мы обычно масштабируем значения, умножая их на небольшое число перед обратным распространением, чтобы избежать взрыва градиента.

Формат Brain Float 16 (BF16) использует больше битов для экспоненты, благодаря чему промежуток возможных значений получается таким же, как у FP32: [-3×10^38, 3×10^38]. У BF16 меньше точность, т.е. меньше значащих разрядов, но точность градиента при обучении сетей не так уж и важна. Поэтому BF16 гарантирует, что вам уже не нужно будет заниматься масштабированием или волноваться о взрыве градиента. С этим форматом мы должны увидеть увеличение стабильности обучения за счёт небольшой потери точности.

Что это значит для вас: с точностью BF16 обучение может быть более стабильным, чем с точностью FP16, а скорость у них одинаковая. С точностью TF32 вы получите стабильность почти как у FP32, а ускорение — почти как у FP16. Плюс в том, что при использовании этих типов данных можно менять FP32 на TF32, а FP16 на BF16, ничего не меняя в коде!

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

Новый дизайн вентилятора и проблемы с теплоотводом


По новой схеме вентиляторов для серии RTX 30 есть выдувающий воздух вентилятор и втягивающий воздух вентилятор. Сам дизайн продуман гениально, и будет очень эффективно работать при наличии свободного пространства между GPU. Однако непонятно, как поведут себя GPU, если их понаставить один к другому. Выдувающий вентилятор сможет выдувать воздух прочь от других GPU, но невозможно сказать, как это будет работать, поскольку его форма отличается от той, что была раньше. Если вы планируете поставить 1 или 2 GPU туда, где есть 4 слота, тогда у вас не должно быть проблем. Но если вы захотите использовать 3–4 RTX 30 GPU рядышком, я бы сначала подождал отчётов о температурном режиме, а потом уже решил, понадобятся ли ещё вентиляторы, расширители PCIe или другие решения.

В любом случае, решить проблему с теплоотводом может помочь водяное охлаждение. Многие производители предлагают такие решения для карточек RTX 3080/RTX 3090, и тогда они не будут греться, даже если их будет 4. Однако не покупайте готовых решений для GPU, если вы захотите собрать компьютер с 4 GPU, поскольку в большинстве корпусов будет очень трудно распределить радиаторы.

Ещё одно решение проблемы охлаждения — купить расширители PCIe и распределить карты внутри корпуса. Это очень эффективно — я и другие аспиранты из Ванингтонского университета с большим успехом используем этот вариант. Выглядит не очень аккуратно, зато GPU не греются! Также этот вариант поможет в случае, если вам не хватает пространства для размещения GPU. Если в вашем корпусе есть место, можно, допустим, купить стандартные RTX 3090 на три слота, и распределить их при помощи расширителей по всему корпусу. Таким образом можно решить одновременно проблему с местом и охлаждением 4-х RTX 3090.

48742628a10084933fddd6c5c3637088.jpg
Рис. 1: 4 GPU с расширителями PCIe

Трёхслотовые карты и проблемы питания


RTX 3090 занимает 3 слота, поэтому их невозможно использовать по 4 штуки с вентиляторами от NVIDIA по умолчанию. И это не удивительно, поскольку она требует 350 Вт TDP. RTX 3080 лишь немногим уступает ей, требуя 320 Вт TDP, и охлаждать систему с четырьмя RTX 3080 будет очень сложно.

Также сложно питать систему из 4-х карт по 350 Вт = 1400 Вт. Блоки питания (БП) на 1600 Вт бывают, однако 200 Вт на процессор и материнку может не хватить. Максимальное энергопотребление происходит только при полной загрузке, и во время ГО процессор обычно слабо нагружен. Поэтому БП на 1600 Вт может подойти для 4-х RTX 3080, но для 4-х RTX 3090 лучше поискать БП на 1700 Вт и более. На сегодня на рынке таких БП не наблюдается. Могут подойти серверные БП или специальные блоки для криптомайнеров, но у них может оказаться необычный форм-фактор.

Эффективность GPU при глубоком обучении


В следующий тест вошли не только сравнения Tesla A100 и Tesla V100 — я построил модель, укладывающуюся в эти данные и четыре различных теста, где испытывали Titan V, Titan RTX, RTX 2080 Ti и RTX 2080 (ссылка, ссылка, ссылка, ссылка).

Кроме того я масштабировал результаты тестов таких карт среднего уровня, как RTX 2070, RTX 2060 или Quadro RTX, путём интерполяции точек данных тестов. Обычно в архитектуре GPU такие данные масштабируются линейно по отношению к перемножению матриц и пропускной способности памяти.

Я собирал только данные тестов по обучению FP16 со смешанной точностью, поскольку не вижу причин, по которым нужно было бы использовать обучение с числами FP32.

a400f92dd789082ad1b780d4bff615e8.svg
Рис. 2: Быстродействие, нормализованное по результатам RTX 2080 Ti

По сравнению с RTX 2080 Ti, RTX 3090 работает со свёрточными сетями в 1,57 раз быстрее, а с трансформерами — в 1,5 раз быстрее, при этом стоит на 15% дороже. Получается, что Ampere RTX 30 демонстрирует значительное улучшение со времён серии Turing RTX 20.

Скорость глубокого обучения GPU в пересчёте на стоимость


Какой GPU будет наиболее выгодным вложением денег? Всё зависит от общей стоимости системы. Если она дорогая, имеет смысл вложиться в более дорогие GPU.

Ниже привожу данные по трём сборкам на PCIe 3.0, которые я использую в качестве базовых ориентиров стоимости систем из 2 или 4 GPU. Я беру эту базовую стоимость и добавляю к ней стоимость GPU. Последнюю я высчитываю как среднюю цену между предложениями с Amazon и eBay. Для новых Ampere я использую только одну цену. В совокупности с приведёнными выше данными по быстродействию это даёт значения быстродействия в пересчёте на доллар. Для системы из 8 GPU за основу я беру Supermicro barebone — промышленный стандарт для RTX-серверов. Приводимые графики не учитывают требования к памяти. Вам сначала нужно задуматься о том, какая вам требуется память, а потом поискать наилучшие варианты на графиках. Примерные советы по памяти:

  • Использование предварительно обученных трансформеров, или обучение небольшого трансформера с нуля >= 11 ГБ.
  • Обучение большого трансформера или свёрточной сети в исследовании или продакшене: >= 24 ГБ.
  • Прототипирование нейросетей (трансформера или свёрточной сети) >= 10 ГБ.
  • Участие в конкурсах Kaggle >= 8 ГБ.
  • Компьютерное зрение >= 10 ГБ.


56ff9e703fc76a87a83a936fd11c9270.png
Рис. 3: нормализованное быстродействие в пересчёте на доллары по отношению к RTX 3080.

992afb3a170697b8bae819704ece572c.png
Рис. 4: нормализованное быстродействие в пересчёте на доллары по отношению к RTX 3080.

31fde5e7e4957f3f71d30cd733a86f00.png
Рис. 5: нормализованное быстродействие в пересчёте на доллары по отношению к RTX 3080.

Рекомендации по выбору GPU


Ещё раз хочется подчеркнуть: при выборе GPU сначала убедитесь, что у него хватает памяти для ваших задач. Шаги при выборе GPU должны быть следующие:

  • Понять, чего я хочу достичь при помощи GPU: участие в соревнованиях Kaggle, обучения ГО, исследование мелких проектов, исследования в области компьютерного зрения или обработки естественного языка, в каких-то других областях знаний.
  • Определить, сколько памяти нужно для моих целей.
  • При помощи приведённых выше графиков по соотношению быстродействия к доллару выбрать подходящий под требования GPU, имеющий нужный объём памяти.
  • Есть ли у выбранного GPU какие-то подвохи? К примеру, если это RTX 3090, влезет ли он в мой компьютер? Хватит ли у моего БП мощности для поддержки этого GPU? Будет ли проблемой теплоотвод, или я смогу эффективно охлаждать GPU?


Некоторые из шагов требуют задуматься о том, чего вы хотите, и провести небольшое исследование на тему того, какие объёмы памяти используют другие люди, занимающиеся тем же самым. Я могу дать несколько советов, но не могу полностью ответить на все вопросы в данной области.

Когда мне понадобится более 11 ГБ памяти?


Я уже упоминал, что при работе с трансформерами вам потребуется не менее 11 ГБ, а при проведении исследований в этой области — не менее 24 ГБ. У большинства предыдущих предварительно обученных моделей очень большие требования к памяти, и их обучали на GPU классом не ниже RTX 2080 Ti с объёмом памяти не менее 11 ГБ. Поэтому, если у вас меньше 11 ГБ памяти, запуск некоторых моделей может стать трудным или вовсе невозможным делом.

Другие области, требующие больших объёмов памяти — обработка медицинских снимков, передовые модели компьютерного зрения, и всё с изображениями большого размера.

В целом, если вы стремитесь разработать модели, способные опередить конкурентов — будь то исследования, промышленное применение или соревнования Kaggle — дополнительная память, возможно, даст вам конкурентное преимущество.

Когда можно обойтись памятью менее 11 ГБ?


Карты RTX 3070 и RTX 3080 — мощные, но памяти им не хватает. Однако для многих задач такого количества памяти может и не потребоваться.

RTX 3070 идеально подходит для обучения ГО. Базовые навыки обучения сетей большинства архитектур можно приобрести, уменьшая масштаб сетей или используя изображения меньшего размера. Если бы мне пришлось учиться ГО, я бы выбрал себе RTX 3070, или даже несколько штук, если бы мог себе их позволить.

RTX 3080 на сегодня — наиболее эффективная карта по отношению цены к быстродействию, и поэтому идеально подходит для прототипирования. Для прототипирования нужны большие объёмы памяти, а память стоит недорого. Под прототипированием я понимаю прототипирование в любой области — исследования, соревнования Kaggle, проба идей для стартапа, эксперименты с исследовательским кодом. Для всех подобных применений RTX 3080 подойдёт лучше всего.

Если бы я, допустим, руководил исследовательской лабораторией или стартапом, 66–80% всего бюджета я пустил бы на машины RTX 3080, и 20–33% — на RTX 3090 с надёжным водяным охлаждением. RTX 3080 более эффективна в пересчёте на стоимость, и доступ к ней можно организовать через Slurm. Поскольку прототипированием надо заниматься в эджайл-режиме, его нужно вести с моделями и наборами данных меньшего размера. И RTX 3080 идеально для этого подходит. Когда ученики/коллеги создадут отличную модель-прототип, они смогут выкатывать её на RTX 3090, масштабируя до более крупных моделей.

Общие рекомендации


В целом модели серии RTX 30 очень мощные, и я определённо их рекомендую. Учтите требования к памяти, как указано ранее, а также требования к питанию и ох

© Habrahabr.ru