Разбираемся в типах процессоров: CPU, GPU, TPU, NPU, DPU, QPU. Узнайте, какой использовать для ваших задач и как избежать узких мест. Практические советы внутри!
Откройте характеристики ноутбука — вы найдете CPU, GPU, а если ноутбук современный, то и NPU. В облаке вам предложат GPU, TPU и сетевую карту, которая на самом деле целый компьютер. А где-то в лаборатории работает QPU. Все они заканчиваются на PU и все «вычисляют». Возникает вопрос: почему бы не сделать один универсальный процессор? Ответ: «вычисления» — это не одно действие. Разберемся, чем они отличаются и как выбрать правильный.
Центральный процессор (CPU) — это универсал. Он запускает операционную систему, обрабатывает API-запросы, выполняет условные операторы, работает с базами данных и даже с клиентом Slack, который потребляет 4 ГБ ОЗУ без причины. CPU создан для непредсказуемых задач: разветвленного кода, где следующая инструкция зависит от предыдущей, длинных цепочек зависимостей, которые нельзя распараллелить.
Чтобы справляться с этим, современные ядра CPU оснащены сложными механизмами: предсказанием ветвлений, внеочередным выполнением, многоуровневым кэшем. Это требует транзисторов и энергии, поэтому в CPU обычно несколько мощных ядер, а не тысячи простых.
Но когда задача становится однотипной — например, нужно выполнить одну операцию над миллионами значений, — CPU справляется плохо. Вы платите за аппаратуру, которая предсказывает ветвления, которых нет.
GPU (графический процессор) появился из рендеринга, где нужно обрабатывать миллионы пикселей одинаковыми операциями. Поэтому GPU сделали противоположный выбор: убрали сложную логику из ядер, добавили больше арифметических блоков и запускают тысячи потоков синхронно. Модель называется SIMT (одна инструкция, множество потоков).
Оказалось, что нейросети имеют ту же форму: прямой проход через трансформер — это огромные матричные умножения, миллионы независимых операций умножения и сложения. Это родной язык GPU. Так графические карты случайно стали основой всей индустрии ИИ — возможно, самая прибыльная случайность в истории железа.
Когда матричные умножения стали главной статьей расходов, следующим шагом стала разработка TPU (тензорного процессора) от Google. TPU сужает задачу: чип создан специально для тензорных и матричных операций, а передача данных оптимизирована под эти потоки. В первой статье о TPU прямо сказано: чип не умный, это большой систолический массив блоков умножения с накоплением без сложной логики управления. Он выигрывает в производительности на ватт именно потому, что отказывается от гибкости.
Это вся суть специализированного железа: чем уже предположение, тем больше выигрыш, когда оно выполняется, и тем больше провал, когда нет. Попробуйте скормить TPU ваш JSON-парсер — ничего хорошего не выйдет.
Ваш телефон разблокируется по лицу, размывает фон на звонках, транскрибирует голосовые заметки. Это не должно требовать обращения к облаку — было бы медленно и затратно по батарее. NPU (нейропроцессор) — это небольшой ускоритель ИИ, встроенный в чип устройства. Apple называет его Neural Engine, Qualcomm и Intel тоже производят свои NPU. Каждый стикер «AI PC» на ноутбуке — это про NPU.
Разница между TPU и NPU не в математике, а в окружении: TPU работает в дата-центре, оптимизирован на пропускную способность на стойку; NPU — в вашем кармане, оптимизирован на операции на ватт и на то, чтобы не поджечь джинсы. Одни и те же уравнения, но разные ограничения — поэтому нужны разные чипы.
Представьте облачный сервер, на котором работают десятки виртуальных машин. До выполнения вашего кода машина должна обработать сетевые пакеты, виртуальный коммутатор, группы безопасности, шифрование, виртуальные диски и все прерывания ввода-вывода. Раньше этим занимался CPU хоста, поэтому вы покупали 64-ядерный сервер, но значительная часть ядер не касалась пользовательских нагрузок. Индустрия называет это «налогом дата-центра».
DPU (процессор обработки данных) берет этот налог на себя. Это карта со своими ядрами CPU, сетевыми интерфейсами и аппаратными движками для сети, хранения и криптографии. Например, AWS Nitro — известный пример, позволяющий выдавать «голые» инстансы почти со всеми ядрами хоста. DPU не находится дальше по шкале универсальности, он на другой оси: его работа — перемещать данные, а не вычислять.
Все предыдущие процессоры — классические. QPU (квантовый процессор) использует кубиты, которые могут находиться в суперпозиции и запутываться. Квантовые алгоритмы исследуют пространство задач способами, недоступными классическим компьютерам. Важно понимать: QPU — не быстрый CPU, это другая модель вычислений. Большинство задач не получают квантового преимущества. Реальные области применения узкие: моделирование квантовых систем, некоторые задачи оптимизации и криптография (алгоритм Шора). IBM Quantum позволяет запускать схемы бесплатно, но сегодняшние машины шумные и маленькие, и исправление ошибок — главная проблема.
Не начинайте с аббревиатур. Начните с формы работы. Задайте вопросы:
Эти чипы — коллеги, а не конкуренты. Один запрос от вашего телефона к ИИ-функции может затронуть четыре из них: NPU решает, обработать локально; если нет, CPU формирует запрос, DPU в дата-центре завершает соединение, CPU сервера запускает логику приложения, а GPU или TPU выполняет инференс.
Ускоритель помогает только той части работы, которую он реально выполняет. Закон Амдала гласит: если 20% времени не ускоряется, то бесконечное ускорение остальных 80% даст максимум 5x. На практике неускоренные 20% — это загрузка данных, предобработка и копирование тензоров через шину PCIe. Поэтому многие истории «мы купили GPU и получили ускорение 1.3x» — GPU был в порядке, он голодал.
import time, torch
x = torch.randn(8192, 8192)
# CPU
t = time.perf_counter()
x @ x
print(f"cpu: {time.perf_counter() - t:.3f} s")
# GPU (данные уже на устройстве)
g = x.cuda()
torch.cuda.synchronize()
t = time.perf_counter()
g @ g
torch.cuda.synchronize() # ядра асинхронны, измеряем честно
print(f"gpu (resident): {time.perf_counter() - t:.3f} s")
# GPU с копированием каждый раз (так часто пишут)
t = time.perf_counter()
(x.cuda() @ x.cuda()).cpu()
torch.cuda.synchronize()
print(f"gpu (+copies): {time.perf_counter() - t:.3f} s")Среднее число — из маркетинговых материалов. Нижнее — то, что вы получите, если перемещаете данные через шину при каждом вызове. На большом матричном умножении передача может стоить дороже вычислений. Решение всегда одно: держите данные на устройстве и группируйте операции, чтобы поездка окупалась. Тот же урок на NPU: быстрейший путь — когда тензор не покидает общую память ускорителя. На DPU: смысл в том, чтобы пакеты не прыгали через память хоста.
Проверьте, какое железо есть у вас:
lscpu | grep -E 'Model name|^CPU\(s\)|Flags' | cut -c1-120 # ядра + поддержка SIMD
nvidia-smi --query-gpu=name,memory.total --format=csv # дискретный GPU
ls /dev/accel* /dev/dri/render* 2>/dev/null # ускорители + рендер-узлыНа современном ноутбуке последняя строка часто показывает больше кремния, чем вы ожидали. Итак, запомните главный вопрос: «Какова форма этой работы?» Вместо заучивания аббревиатур. Это поможет выбрать правильный инструмент и избежать узких мест.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →