CPU или GPU для локальной LLM: что выгоднее
Взять сервер с видеокартой «на всякий случай» — самая дорогая ошибка при развёртывании локальной LLM: карта простаивает, а счёт растёт в разы. Взять голый CPU и упереться в три токена в секунду на живом чате — вторая по частоте ошибка в обратную сторону. Выбор между CPU и GPU для локальной модели решает не интуиция, а физика памяти — и посчитать, что выгоднее именно для вашей задачи, можно заранее, без покупки железа наугад.
Содержание
- Почему GPU в принципе быстрее: дело в памяти, а не в ГГц
- CPU: сколько реально получаете и когда этого достаточно
- GPU: когда без него генерация не спасается никакими настройками
- Экономика: во сколько раз дороже GPU и когда переплата окупается
- Частые ошибки при выборе между CPU и GPU
- Как посчитать под свою задачу: пошаговый пример
- Какой сервер брать в MAATRIX: с CPU или сразу с GPU
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему GPU в принципе быстрее: дело в памяти, а не в ГГц
Генерация текста автопрогрессивна: чтобы выдать токен, модель проходит через все свои веса целиком — и так на каждый следующий токен заново. Задача не арифметическая, а транспортная: железо не столько считает, сколько ждёт, пока нужные гигабайты доедут из памяти до вычислительных блоков. Отсюда формула потолка скорости там, где узкое место — память:
потолок, ток/с ≈ пропускная способность памяти (ГБ/с) / размер весов (ГБ) × 0,7
Поправка 0,7 — не пессимизм, а честность: реальная пропускная способность всегда ниже паспортной, часть трафика уходит на KV-кэш и служебные буферы. Дальше решает числитель — сколько гигабайт в секунду умеет прокачать железо.
Здесь CPU и GPU расходятся не на проценты, а в разы. Двухканальная память сервера: DDR4-3200 даёт эффективные 30–38 ГБ/с на чтение, DDR5-4800 — 55–65 ГБ/с. Видеопамять устроена принципиально шире:
| Карта | VRAM | Пропускная способность (по спецификации) |
|---|---|---|
| RTX 3060 12 ГБ | 12 ГБ | 360 ГБ/с |
| RTX 4060 Ti 16 ГБ | 16 ГБ | 288 ГБ/с |
| L4 (дата-центр) | 24 ГБ | 300 ГБ/с |
| RTX 4090 | 24 ГБ | 1008 ГБ/с |
| A10 (дата-центр) | 24 ГБ | 600 ГБ/с |
| A100 80 ГБ | 80 ГБ | 2039 ГБ/с |
| H100 80 ГБ | 80 ГБ | ~3350 ГБ/с |
Даже младшая в списке L4 обгоняет DDR5 в 4,5–5,5 раза, а H100 — в 50–60 раз. Заметьте: RTX 4060 Ti новее RTX 3060, но по памяти медленнее — 128-битная шина против 192-битной. Поколение карты само по себе ничего не гарантирует.
Оговорка: правило про генерацию (decode). Обработка промпта (prefill) считает всю входную последовательность разом и упирается в вычисления, а не в память — здесь CPU выглядит куда приличнее.
CPU: сколько реально получаете и когда этого достаточно
У нас есть реальный стенд, а не оценка на глаз: AMD EPYC 9554, 16 vCPU (8 физических ядер плюс гипертреды), DDR5, Ollama 0.33.1, модели в Q4_K_M, контекст 4096. На qwen2.5:7b генерация выходит на полку уже на 4 потоках — 7,6 ток/с, на 8 и 16 то же самое в пределах погрешности. А на 32 потоках при тех же 16 vCPU скорость обваливается до 0,35 ток/с — в двадцать раз, а не «немного медленнее»: потоки вытесняют друг друга с ядер вместо параллельного чтения памяти. Полный разбор с htop, cgroup и NUMA — в статье про ядра CPU у Ollama; вывод один: лишние ядра генерацию не ускоряют начиная с четырёх-восьми штук.
Интереснее то, что происходит между разными моделями на одном и том же железе. Замер на 16 потоках, тот же стенд:
| Модель (Q4_K_M) | В памяти (RSS) | Генерация, ток/с |
|---|---|---|
qwen2.5:3b | 2,2 ГБ | 34,1 |
gemma2:9b | — | 8,8 |
mistral:7b | 5,0 ГБ | 12,1 |
qwen2.5:7b | 5,1 ГБ | 7,4 |
llama3.1:8b | 5,6 ГБ | 12,8 |
Прочерк — память под эту модель отдельно не переизмеряли. Две вещи бросаются в глаза. qwen2.5:3b обгоняет пропорцию весов: в 2,3 раза меньше qwen2.5:7b по памяти, а быстрее — почти в 4,6 раза; у младшей модели меньше слоёв, и накладные расходы на шаг генерации занимают меньшую долю времени. А gemma2:9b медленнее llama3.1:8b, хотя параметров в ней меньше, — у Gemma2 словарь около 256 тысяч токенов против ~128 тысяч у Llama 3.1, и слой предсказания следующего токена заметно шире. Формула по одной пропускной способности даёт порядок величины, а не точное число — остальное решает архитектура.
Практический вывод: 7–13 ток/с быстрее, чем читает большинство людей (комфортная скорость чтения — примерно 4–6 токенов в секунду). Для личного чата, помощника в терминале, ночной суммаризации и внутреннего RAG на одного-двух человек CPU честно хватает, GPU не нужен. Граница — там, где к диалогу подключаются сразу несколько человек: генерация одна на всех, и 7–8 ток/с делятся на число запросов.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть OllamaGPU: когда без него генерация не спасается никакими настройками
Три ситуации, где CPU не вытянуть ни num_thread, ни квантованием.
Несколько пользователей одновременно. На CPU параллельные запросы делят одну пропускную способность памяти: qwen2.5:7b даёт 7,4 ток/с одному диалогу, а на пять одновременных — в разы меньше на каждого, потому что каждый запрос заново читает все веса. На GPU запросы объединяются в один проход: умножение вектора на матрицу становится умножением матрицы на матрицу, веса читаются один раз на всю пачку — задача из упирающейся в память превращается в упирающуюся в вычисления, где у видеокарты преимущество ещё больше.
Модели крупнее 30 млрд параметров. Формула из первой секции жёстко режет CPU на больших весах: 32B в Q4_K_M — это порядка 20 ГБ, и на тех же 55–65 ГБ/с DDR5 расчётный потолок — 55×0,7/20 ≈ 1,9, максимум 65×0,7/20 ≈ 2,3 ток/с. Дочитать ответ в три абзаца можно успеть заварить чай. GPU с 24 ГБ VRAM и полосой в 600–1000 ГБ/с меняет этот потолок на порядок — но это расчёт по формуле, не измерение: GPU-бенчмарков у нас нет.
Обучение и дообучение. Инференс читает веса один раз на токен, а обучение хранит для каждого параметра ещё градиент и состояния оптимизатора. Полное дообучение 7B в смешанной точности с Adam — это примерно 16 байт на параметр (веса и градиенты в fp16, master-копия и два момента Adam в fp32), то есть около 112 ГБ VRAM только на состояние обучения, без активаций. Отсюда LoRA/QLoRA — способы не хранить всю эту массу; но даже они делаются на GPU, потому что обратный проход требовательнее к параллелизму, чем прямой. На CPU дообучение технически возможно, практически — его никто в здравом уме не делает: разница не в разы, а в порядки.
Экономика: во сколько раз дороже GPU и когда переплата окупается
Видеокарта — самый дорогой компонент сервера: это не жадность провайдера, а физика счёта за электричество и цена чипа. Топовая карта под нагрузкой ест 300–450 Вт, CPU-сервер для 7–9B моделей укладывается в 65–150 Вт целиком, плюс сама карта уровня A10 или A100 в закупке сопоставима с несколькими CPU-серверами сразу. В сумме GPU-сервер в месяц обходится в разы дороже CPU-сервера сравнимого класса — так устроено у любого провайдера, и спорить с физикой бессмысленно.
Вопрос не «что дешевле», а «что выгоднее для вашей задачи». Три честных ориентира.
- Модель до 9B, пользователь один или пара, ответ не обязан быть мгновенным. CPU-сервер отбивает разницу сразу: вы платите за память и ядра, а не за карту, которая простаивает девять часов из десяти.
- Нагрузка эпизодическая — раз в неделю дообучить LoRA, прогнать пакет изображений, протестировать модель покрупнее. Переплачивать за круглосуточный GPU-сервер невыгодно; честнее почасовая аренда на нужные часы, а не постоянная дорогая машина. Разбор, когда так выгоднее, — в статье про свою карту против аренды GPU.
- Нагрузка постоянная и параллельная — десятки пользователей, продукт с живым чатом, регулярное обучение. Здесь считать разницу в цене бессмысленно: CPU-сервер того же класса физически не тянет задачу, вопрос не «дешевле ли CPU», а «работает ли он вообще».
Переплата за GPU окупается не всегда напрямую деньгами — иногда она окупается тем, что задача становится вообще выполнимой в разумное время, а не когда-нибудь после третьей чашки чая.
Частые ошибки при выборе между CPU и GPU
Берут CPU-сервер с максимумом vCPU, ожидая пропорциональный прирост. Наш замер выше: 32 потока на 16 vCPU дают не «немного медленнее», а 0,35 ток/с вместо 7,6 — обвал в двадцать раз из-за конкуренции потоков за ядра. Для CPU-инференса важнее объём и скорость памяти, чем строчка с числом ядер в тарифе.
Берут GPU впритык по VRAM «попробовать». Если модель с контекстом и KV-кэшем не помещается в память карты целиком, движок либо откажет с ошибкой, либо начнёт выгружать часть слоёв в системную RAM — и скорость падает кратно, а не на проценты. При инференсе через vLLM или TGI это выглядит примерно так:
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 256.00 MiB.
GPU 0 has a total capacity of 23.64 GiB of which 98.31 MiB is free.
Разбор именно этой ошибки и как посчитать VRAM заранее — в статье про vLLM и нехватку памяти.
Сравнивают цифры разных квантований как одинаковые. Требование «нужна модель 7B» без уточнения кванта — не число: в fp16 это ~14 ГБ, в Q8_0 — ~7,5 ГБ, в Q4_K_M — ~4,7 ГБ. Спорить, нужен ли GPU «для 7B», без кванта — как спорить о температуре без термометра. Проверить занятость уже арендованной карты просто: nvidia-smi в обычный рабочий день покажет, простаивает она большую часть времени или действительно нагружена.
Как посчитать под свою задачу: пошаговый пример
Возьмём задачу: команде из пяти человек нужен внутренний ассистент на модели уровня 14B, качество должно быть выше, чем у 7B. Считаем оба варианта по одной логике.
- Определяем вес модели. 14B в Q4_K_M — около 9 ГБ, плюс KV-кэш под контекст 8k — ещё 1,5–2 ГБ.
- Считаем потолок на CPU. DDR5 даёт 55–65 ГБ/с эффективно; возьмём консервативные 35 ГБ/с, как на разделяемой памяти VPS: потолок одного запроса — 35×0,7/9 ≈ 2,7 ток/с. Пятерым одновременно делить особо нечего — очередь неизбежна.
- Считаем потолок на GPU. 9 ГБ весов свободно помещаются в карту от 12 ГБ с запасом на контекст. Даже младшая в списке L4 (300 ГБ/с) даёт расчётный потолок 300×0,7/9 ≈ 23 ток/с — не измерение, а тот же расчёт, просто с другим числителем. С батчингом пятеро пользователей не делят эти токены так же болезненно, как на CPU — эффект батчинга разобран в статье про ядра CPU выше.
- Сверяем с реальной нагрузкой. Если пятеро пишут ассистенту по паре сообщений в час — CPU-сервер справится, очередь никто не заметит. Если это живой чат с одновременными диалогами весь рабочий день — берите GPU, иначе интерфейс будет казаться сломанным, хотя технически всё работает.
Тот же порядок действий подставляйте под любую свою задачу: вес модели по таблице квантования, потолок по формуле, сверка с реальной, а не воображаемой параллельностью.
Какой сервер брать в MAATRIX: с CPU или сразу с GPU
Если по расчёту из предыдущей секции у вас получается CPU — начинайте с него, GPU всегда можно добавить позже, когда нагрузка это подтвердит, а не предскажет.
Минимум для CPU-инференса. 4 физических ядра с поддержкой AVX2, 16 ГБ RAM, 60 ГБ NVMe. Помещается модель на 7–8B в Q4_K_M с запасом под KV-кэш и систему, честные 7–8 ток/с на диалог — быстрее, чем читает человек. Для личного помощника, ночной суммаризации и внутреннего RAG на одного-двух пользователей это рабочая, а не урезанная конфигурация.
Комфортный вариант. 8 физических ядер, 32 ГБ RAM, 100+ ГБ NVMe. Свободно идёт 14B, помещаются сразу две модели (OLLAMA_MAX_LOADED_MODELS=2), есть запас под несколько параллельных запросов без ухода в своп. Это уровень, где CPU можно честно назвать комфортным, а не «пока терпимо».
Ollama устанавливается автоматически при заказе сервера из каталога apps.maatrix.io — на Ubuntu и Debian, без ручной установки, доступы появляются в личном кабинете сразу. Локация — Великобритания, Лондон: модель держит переписку и документы в европейском правовом периметре, что снимает вопросы у клиентов с GDPR, а пинг до ЕС держится в районе 10–25 мс.
И честная граница. Если по разделам выше у вас получилось «нужен GPU» — параллельные пользователи, модель крупнее 30B или обучение, — у MAATRIX есть выделенные серверы с GPU в тех же локациях, включая Великобританию: конфигурация подбирается под нужный объём VRAM, а не наоборот. Разбор конкретно под инференс — в статье про GPU-сервер в UK. Оплата в обоих случаях одинаковая — картой российского банка, по СБП, криптовалютой или токеном MAAT, зарубежная карта не нужна ни для CPU-, ни для GPU-сервера в Лондоне.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть OllamaОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Хватит ли CPU для комфортного локального чата, или это будет мучительно медленно?
Для одного-двух человек — да: на нашем стенде (EPYC 9554, Ollama 0.33.1) модели 7–9B в Q4_K_M дают 7–13 ток/с, быстрее, чем читает человек. Медленно становится с несколькими одновременными пользователями или моделью крупнее 30B.
Сколько VRAM нужно, чтобы не думать о CPU вообще?
Ориентир по весам в Q4: 7–8B — 5–6 ГБ, 14B — около 9–10 ГБ, 32B — 20–24 ГБ, 70B — от 40 ГБ. Берите карту с этим объёмом плюс запас под контекст и параллельные запросы — тогда узкое место снимается полностью.
Можно ли дообучать (fine-tuning) модель на CPU?
Технически да, практически — нет. Полное дообучение 7B с Adam требует около 112 ГБ памяти под градиенты и состояния оптимизатора — на CPU это будни в свопе, а не тренировка. Даже дообучение методом LoRA делают на GPU: обратный проход намного требовательнее к параллелизму, чем сама генерация.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.