CPU и GPU

В предыдущих уроках мы рассмотрели различные классы моделей и архитектуры нейросетей. Чтобы понять, как эффективно применять эти модели, важно также разобраться, на каких аппаратных платформах они работают.
GPU (графический процессор) и CPU (центральный процессор) — два ключевых компонента любого современного компьютера, но работают они по-разному. CPU обычно лучше справляется с последовательными вычислениями и подходит для задач, где важна многофункциональность (например, при предварительной обработке данных). В то время как GPU оптимизирован для параллельных вычислений, что делает его эффективным для тренировки нейронных сетей и больших моделей машинного обучения.
Представьте, что у вас есть модель нейронной сети, обучение которой на CPU занимает около десяти часов. При использовании GPU то же обучение может занять один-два часа. 
Эти цифры условны, и реальная разница зависит от специфики модели, объёма данных и характеристик оборудования, но общее соотношение показывает значительное преимущество GPU. Сокращение времени обучения позволяет быстрее проводить эксперименты и улучшать модели.
В этом уроке мы обсудим аппаратные платформы CPU и GPU. Понимание различий между ними и правильный выбор при проектировании AI-решений поможет значительно ускорить обучение моделей и снизить затраты на вычислительные ресурсы.

CPU

✏️ Центральный процессор, CPU (Central Processing Unit) — формально интегральная схема в аппаратной части ПК, предназначенная для исполнения последовательных машинных инструкций (кода).
CPU осуществляет выполнение вычислительных задач: обработку программного кода, арифметические и логические операции, управление потоками данных между различными подсистемами.
Архитектура CPU состоит из нескольких компонентов:
  • Арифметико-логическое устройство (ALU) — блок, отвечающий за выполнение арифметических и логических операций. Есть разные виды архитектуры процессоров, блоков ALU может быть несколько.
  • Контроллер — управляет выполнением инструкций и координирует работу других компонентов CPU.
  • Кеш-память — многоуровневая кеш-память для временного хранения данных и инструкций, к которым нужен быстрый доступ.
  • DRAM (dynamic RAM) — оперативная память.
Когда программа запускается, инструкции загружаются в память. CPU извлекает эти инструкции последовательно одну за другой, декодирует их и выполняет соответствующие операции. Например, при выполнении математической операции ALU обрабатывает числовые данные, а результаты сохраняются в регистре или передаются в оперативную память для дальнейшего использования. Ещё CPU управляет передачей данных между оперативной памятью и другими устройствами — так операции выполняются последовательно и синхронизированно.

GPU

✏️ Графический процессор (GPU, Graphics Processing Unit) — это тоже интегральная схема, но только с некоторым отличием по архитектуре от CPU и ориентирована на параллельные вычисления.
Изначально GPU был разработан для обработки графики и выполнения рендеринга. Но сегодня графический процессор активно используется в машинном обучении, особенно для задач, связанных с обучением моделей. Благодаря своей архитектуре, оптимизированной для параллельных вычислений, GPU позволяет эффективно обрабатывать большие объёмы данных и ускорять обучение моделей. Так тысячи однотипных операций выполняются параллельно.
Архитектура GPU выглядит следующим образом:
  • Потоковые мультипроцессоры (SM, Streaming Multiprocessors) — это физические компоненты, где каждый мультипроцессор содержит несколько ядер, которые могут обрабатывать множество однотипных задач и выполнять параллельные вычисления.
  • Кеш-память и память с произвольным доступом. GPU имеет несколько уровней кеш-памяти, включая L1 (Level 1) и L2 (Level 2). Они обеспечивают быстрый доступ к данным. Глобальная память служит для хранения данных, к которым часто обращаются, но она медленнее, чем кеш-память.
  • Блоки управления памятью (Memory Controllers) — это контроллеры, которые управляют доступом к различным уровням памяти и обеспечивают передачу данных между памятью и ядрами GPU.
  • Блоки текстур (TMU) используются в графических приложениях для обработки данных. А в задачах машинного обучения помогают ускорить обработку больших массивов данных.
GPU получает задачу, и она разбивается на множество параллельных потоков. Потоковые мультипроцессоры распределяют эти потоки между своими ядрами, и каждое ядро выполняет вычисления для своей части задачи.
Например, при обучении нейронной сети GPU может параллельно обрабатывать множества векторов весов и активаций для разных нейронов и слоёв. Кеш-память и блоки управления памятью обеспечивают быстрый доступ к данным без задержек. Параллельные операции и быстрая обработка большого объёма данных делает GPU идеальным решением для задач, требующих высокой вычислительной мощности вроде рендеринга графики и обучения моделей машинного обучения.

Как выбрать процессор?

Принципиальное отличие двух видов процессоров ― в способе обработки информации.
CPU выполняет операции последовательно или с использованием ограниченного параллелизма. Поэтому он эффективен для выполнения сложных логических операций, управления потоками, выполнения программного кода и других задач, требующих высокой производительности на каждом ядре. Например, для выполнения инструкций операционной системы, управления файлами, выполнения сложных алгоритмов, обработки небольших объёмов данных с высокой скоростью.
Когда целесообразно использовать CPU
  • Линейные модели, например линейная и логистическая регрессия. Эти модели относительно просты и не требуют большого объёма вычислений.
  • Деревья решений и ансамблевые методы, например Random Forest. Эти модели могут использоваться для задач классификации и регрессии, где объём данных не так велик и сами данные можно обрабатывать последовательно.
GPU выполняет операции параллельно, распределяя вычислительные задачи между тысячами ядер. Это делает его идеальным для обработки графики, выполнения сложных математических вычислений и параллельного обучения моделей машинного обучения. Например, в рендеринге, обработке видео, обучении моделей машинного обучения, обработке больших объёмов данных.
Когда целесообразно использовать GPU
  • Нейронные сети (Deep Neural Networks), например свёрточные нейронные сети (CNN), рекуррентные нейронные сети (RNN), трансформеры. Эти модели имеют множество параметров и требуют больших объёмов данных для обучения. Трансформеры, такие как GPT, требуют параллельной обработки текстовых данных для эффективного обучения.
  • Рекуррентные нейронные сети (RNN) и модели обработки последовательностей, например RNN для обработки временных рядов или текста. Обработка последовательностей требует параллельной работы с несколькими элементами данных, что эффективно выполняется на GPU.

Задание 1

Какие компоненты входят в архитектуру CPU? Выберите все правильные ответы.
Арифметико-логическое устройство (ALU) является важным компонентом CPU, отвечающим за выполнение арифметических и логических операций.
Мультипроцессоры с потоковыми ядрами относятся к архитектуре GPU, а не CPU. В CPU используются несколько ядер, но не в форме потоковых мультипроцессоров.
Кеш-память — это часть архитектуры CPU, которая хранит данные для быстрого доступа, чтобы ускорить выполнение инструкций.
Контроллер в CPU управляет выполнением инструкций и координирует работу других компонентов процессора.
Блоки текстур (TMU) встречаются в архитектуре GPU и используются для обработки графических данных, но они не являются частью CPU.
Блоки управления памятью также характерны для архитектуры GPU. В CPU управление памятью происходит через другие механизмы, такие как контроллеры и кеш.

Задание 2

Почему обучение моделей машинного обучения на GPU происходит быстрее, чем на CPU?
Главная сила GPU заключается в его параллельной архитектуре, которая позволяет одновременно выполнять тысячи однотипных операций. Это делает GPU гораздо более эффективным для задач машинного обучения, таких как обучение нейронных сетей, которые требуют большого количества вычислений.
Тактовая частота CPU обычно выше, чем у GPU, однако именно параллельная архитектура GPU, а не его частота, делает его быстрее для задач, связанных с обучением моделей машинного обучения.
CPU способен обрабатывать данные параллельно с использованием нескольких ядер, однако количество ядер в CPU значительно меньше, чем в GPU. Именно это ограничивает эффективность CPU при работе с задачами, требующими массового параллелизма.
Хотя GPU действительно использует кеш-память, это не является основным фактором, который делает его быстрее для задач машинного обучения. Основное преимущество GPU — в его способности к параллельной обработке данных с использованием большого количества ядер.

Задание 3

Ваша компания разрабатывает платформу для анализа больших данных, которые необходимо быстро обрабатывать параллельно для построения сложных статистических моделей. Какой процессор вы выберете?
Предпочтительно выбрать GPU, так как он лучше для параллельной обработки данных.

Задание 4

Вам нужно создать систему для выполнения автоматизированной обработки транзакций в реальном времени, где важна скорость выполнения логических операций и минимальные задержки. Какой процессор лучше выбрать?
CPU, так как он эффективнее для последовательных вычислений и логических операций.

Задание 5

В каких случаях использование CPU для обучения моделей машинного обучения предпочтительнее, чем использование GPU? Выберите все правильные ответы.
CPU хорошо подходит для небольших моделей, таких как линейная или логистическая регрессия, которые не требуют значительных вычислительных мощностей или параллельной обработки данных.
Глубокие нейронные сети, такие как свёрточные или рекуррентные нейронные сети, требуют интенсивных вычислений и больших объёмов данных, что делает использование GPU более эффективным благодаря его способности выполнять параллельные вычисления.
CPU часто используется для предварительной обработки данных (например, для очистки, трансформации и подготовки данных к обучению). Эти задачи обычно требуют последовательных вычислений и меньших объёмов данных.
Для задач, связанных с параллельной обработкой больших объёмов данных, GPU является более эффективным инструментом, так как он оптимизирован для выполнения тысяч однотипных операций одновременно.
Модели, которые не требуют параллельной обработки данных, такие как деревья решений или небольшие регрессионные модели, могут эффективно обучаться на CPU без необходимости задействования GPU.
CPU оптимален для сложных логических операций и управления потоками данных между различными подсистемами, что делает его лучшим выбором для этих задач по сравнению с GPU.

Что посмотреть о CPU и GPU?

Вычисления на GPU — зачем, когда и как. Плюс немного тестов
Как GPU-вычисления буквально спасли меня на работе. Пример на Python 
What Is a Virtual GPU? 
Mythbusters demo GPU versus CPU

К итогам

Выбор между CPU и GPU при проектировании машинного обучения зависит от нескольких ключевых факторов.
  • Следует учитывать объём и сложность вычислений: GPU лучше подходит для задач с большими объёмами данных и параллельными вычислениями, где требуется обработка большого числа операций одновременно.
  • Нужно ориентироваться на тип модели: для простых моделей, например линейной регрессии, CPU может быть более эффективен, в то время как для сложных нейронных сетей GPU обеспечивает значительное ускорение.
  • Потребность в обучении модели — тоже важный фактор: GPU позволяет сократить время обучения сложных моделей, что важно при использовании больших наборов данных.