Эта статья подготовлена на основе доклада Андрея Чередарчука и Александра Судакова на Root Linux Conference 2017 — ежегодной конференции embedded- и Linux-разработчиков.
Андрей Чередарчук — ИТ-инструктор и администратор. Сертифицированный инструктор учебных программ HP, IBM, VMware, ранее также и Cisco. Разрабатывает авторские учебные курсы. Занимается поддержкой HPC-инфраструктуры в НАН Украины.
Александр Судаков — глава лаборатории параллельных вычислений, доцент КНУ им. Тараса Шевченко. Одно из основных направлений его научной деятельности — высокопродуктивные вычислительные компьютерные системы. Александр является разработчиком и руководителем вычислительного кластера информационно-вычислительного центра КНУ им. Тараса Шевченко. Принимал участие в создании первых в Украине сайтов Grid-систем.
Графические адаптеры прошли длинный эволюционный путь от примитивного устройства, способного отображать 256 символов одним цветом, до практически независимого устройства со своим процессором, оперативной памятью, интерфейсами ввода/вывода информации. Усилиями массмедиа графический адаптер прочно связан с термином «майнинг». Но это далеко не единственное использование акселераторов. Распознавание образов, аэродинамическое моделирование, использование во встроенных системах — это неполный перечень технологий, где активно используются графические акселераторы. В этой публикации мы хотим рассказать об использовании графических акселераторов, или GPU, в промышленных высокопроизводительных системах.
Использование графического адаптера как вспомогательного вычислительного устройства началось довольно давно. Быстрая память, большое количество блоков, производящих математические операции, параллельная обработка данных — все эти свойства качественно изменили графический адаптер. Так был создан графический акселератор. Некоторые акселераторы пошли еще дальше и больше не являются «видеокартой» в общепринятом смысле слова, поскольку не содержат ни одного видеовыхода.
Задача данной статьи — рассмотреть основные характеристики современных акселераторов, а также привести примеры совместного использования центрального процессора (CPU) и графического акселератора (GPU). В дальнейшем будем рассматривать графический акселератор Nvidia. Он самый популярный для промышленных вычислений, хотя и не единственный.
Наиболее известный продукт для мощных вычислений — Nvidia Tesla. Строго говоря, Tesla — это название первого поколения вычислительных акселераторов. Именно тогда были заложены основные направления их развития. Каждое следующее поколение получило свое наименование в честь известных ученых — Tesla, Fermi, Kepler, Maxwell, Pascal, Volta. Каждое имя обозначает новые технологии, новые возможности. В этом году на рынок вышли изделия последнего поколения — Nvidia Volta.
Параметры выбора
Итак, мы выбираем графический акселератор для параллельных вычислений или машинного обучения. На что нужно обратить внимание? Параметр № 1 — computing capability или же SM version. Это набор функционала, который вы можете потом на этом акселераторе использовать. Информация о значении параметра для каждого адаптера указана на основномсайте компании Nvidia. Подробное описание возможностей можно найти на сайте Nvidia для разработчиков. Независимо от того, планируете ли вы использовать готовое решение или же разрабатывать свои программы с использованием стандартных библиотек — определите минимальное значение параметра и доступный класс устройств.
Параметр № 2 — не менее важный — это увеличение скорости работы и производительности в расчете на потребляемый ватт энергии. Стоимость электроэнергии — это один из самых важных пунктов затрат современного центра обработки данных. Все, что умеет компьютерное оборудование, — это потреблять электроэнергию и превращать ее в энергию тепловую, нагревая помещение дата-центра. Все остальное — только небольшой побочный эффект :)
CUDA
Давайте рассмотрим основные возможности адаптеров. Каждый акселератор поддерживает набор решений Nvidia CUDA. CUDA — набор инструментов для работы с акселератором, который позволяет писать программы, выполнять либо высокоуровневые, либо низкоуровневые запросы и обеспечивает API для работы с различными языками программирования. Программные CUDA от Nvidia поддерживают C/C++. Некоторые коммерческие компиляторы других производителей поддерживают Fortran. Существуют разработки инструментов для высокоуровневых языков, таких как Python. Также доступны средства для отладки и оптимизации. CUDA тоже меняется: в новых версиях больше функционала и возможностей, исправлены старые ошибки.
Streaming multiprocessor
Если мы посмотрим на общую схему графического акселератора, то увидим, что акселератор состоит из большого количества одинаковых блоков. Эти блоки называются streaming multiprocessor в более старой версии SM. В более новой версии — SMX, т. е. расширенный вариант. Они позволяют нам обрабатывать числа с одинарной или двойной точностью, использовать общую память, планировать выполнение инструкций во времени и распределять их между счетными блоками, а также передавать всю информацию наружу. Количество блоков зависит от модели графического акселератора и варьируется от сотни до нескольких тысяч: чем больше, тем лучше.
Точность
Каждый SMX-модуль содержит счетные блоки с разным уровнем точности: Floating point 16, FP 32, FP 64. В каждом акселераторе разное количество таких элементов. Что лучше? На самом деле тут нет единого ответа. Если вам не нужна максимальная точность, используйте точность поменьше. Почему? Это будет гораздо быстрее. Если вам нужно считать быстро, но не очень точно, самый правильный вариант — это использовать точность поменьше. Используйте максимальную точность вычислений только тогда, когда она вам действительно необходима. Для Tesla K40 производительность между FP 32 и FP 64 отличается почти в три раза.
Использовать все возможности графического акселератора довольно трудно. Для разработчика адаптер больше всего похож на отдельный сервер: он копирует данные и инструкции из оперативной памяти компьютера, производит указанные операции и возвращает результат обратно в оперативную память. При этом центральный процессор компьютера практически не используется и может взять на себя часть задач.
Dynamic parallelism
Какие методы оптимизации доступны? Например, dynamic parallelism. Чтобы GPU работал более эффективно, необходимо дать ему больше свободы. GPU будет сам определять конкретные ядра для выполнения задач. Получаем более быстрое параллельное выполнение инструкций.
Nvidia Unified Virtual Memory
Следующий метод — Nvidia Unified Virtual Memory. Нам очень бы хотелось быстро и удобно обмениваться данными с нашим GPU. Как это сделать? Единый блок памяти, который одновременно доступен и центральному процессору, и нашему графическому акселератору. Метод используется не только для синхронизации данных между памятью акселератора и основной оперативной памятью, но также и для обмена данными между двумя акселераторами в одном сервере.
Оперативная память
Объем оперативной памяти — одно из узких мест графического акселератора. Небольшой объем платы, проблемы с отводом тепла не позволяют использовать десятки или сотни гигабайт памяти, как на обычном сервере. Но новый стандарт позволит увеличить объем ресурсов. Использование более плотной упаковки элементов памяти, не только на плоскости, но и в объеме, позволит увеличить и общий размер памяти, и скорость доступа, особенно при конкурентном доступе. Сегодня развиваются два стандарта — HBM и HMC, которые имеют один принцип работы, но несовместимую аппаратную реализацию. Nvidia Volta использует память стандарта HBM2.
Для более эффективного использования возможностей GPU применяется параллельный запуск нескольких задач. Параллельные задачи полезны не только для вычислений, но и для виртуализации. Когда мы передаем полное управление нашим GPU виртуальным машинам, то мы можем запускать на каждом из процессоров до 32 задач одновременно.
Tensor Core
Использование нейронных сетей для обработки данных снова в тренде. И новое поколение акселераторов Nvidia Volta использует новый аппаратный подход — Tensor Core, позволяющий на уровне железа выполнять задачи TensorFlow, Caffe2, MXNet. При этом обеспечивается как высокая скорость вычислений, так и низкое потребление энергии.
Современные чипсеты поддерживают больше одного GPU. Совместное использование шины PCI Express позволяет подключить до 10 адаптеров в одном сервере. Нужно учитывать, что пропускная способность шины гораздо меньше, чем нескольких адаптеров, поэтому задачи должны быть спроектированы так, чтобы минимизировать поток данных по каналах CPU-GPU и GPU-GPU.
NVLink
Технология NVLink увеличивает общую пропускную способность шины и поддерживает до 8 акселераторов на одну плату. Количество соединений NVLink позволяет создавать схему Full-Mesh или partial Mesh c минимальным количеством хопов между устройствами.
Какой выбрать
Мы рассмотрели основные возможности акселераторов. Но остался вопрос: что же приобрести для работы?
Вам нужно проверить работоспособность программы? Тогда достаточно обычной видеокарты с нужным значением computing capability. Нужно быстро классифицировать ближайшие объекты автомобильным компьютером? Тогда вполне устроит SoC-плата, например, NVidia Jetson TK1 (192 ядра CUDA, полная совместимость, довольно много памяти, гигабит Ethernet и даже PCI express порт) или TX1, где и ядер побольше и вычислительная мощность — один терафлопс.
Нужно считать очень много? Промышленное решение Nvidia Quadro — быстрое, компактное, дешевое, энергоэффективное. Ведущие серверные бренды предлагают готовые сервера с Quadro на борту.
А может у вас серьезный проект по deep learning с хорошим бюджетом? Nvidia предлагает уникальное решение: DGX-1. До 8 акселераторов, производительность одного DGX-1 для задач машинного обучения превышает производительность 48 узлов с двумя Intel Xeon.
Таким образом, можно подобрать графический акселератор, соответствующий любым вашим практическим задачам. Если у вас есть позитивный или негативный опыт работы с описанными решениями — давайте обсудим это в комментариях.