Как стать автором
Обновить

Сравниваем скорость генерации LLM локально и по API

Время на прочтение4 мин
Количество просмотров3.6K

По ощущениям, на Хабре одна группа пользуется LLM локально, а другая - через внешние API.

А третья еще не определилась, и у неё периодически возникают следующие вопросы:

  • Что будет, если запускать LLM на CPU вместо GPU? Сильно упадет скорость?

  • А как это от размера модели зависит?

  • А DeepSeek оригинальный очень большой - а можно его с диска подкачивать, если он в RAM не влезает?

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

TLDR: Я сделал небольшое HTML-приложение, которое наглядно дает ощущение скорости генерации в разных инсталляциях. Если непонятно, что там к чему - то лучше прочитать статью.

Локальный запуск LLM

Обычно локально всякие LLM-сети запускают с помощью программ типа Ollama или LM Studio - они как скачивают нужную сеть из интернета, так и запускают её у вас.

Обычно у них есть три варианта запуска:

  • Модель полностью помещается в памяти GPU (обычно Nvidia) - и это самый быстрый вариант

  • Модель полностью помещается в RAM - это приемлемый вариант

  • Модель периодически загружается с SSD через swap (это работает адски медленно, можете потом в примерах посмотреть - имхо неюзабельно)

Модели бывают разных размеров - Llama 7B, 70B, Mistral Nemo 12B и пр. Нас интересует цифирка рядом с B - это, грубо говоря, число весов модели. Будем называть его SIZEB.

При этом надо понимать следующее: оригинальные веса модели хранятся в float32 (4 байта) - и, таким образом, если вы хотите запустить оригинальную модель, вам понадобится приблизительно SIZEB x 4 Гб памяти. Т.е. 28 Гб даже для не очень серьезной по качеству 7B-модели.

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

Подобные квантизированные веса сейчас чаще всего распространяются в формате gguf (вы можете его увидеть, если будете качать с сайта). Условно считается, что:

  • Квантизация q8 (8 бит на вес) почти не влияет на качество модели. Модель при этом занимает в памяти около SIZEB Гб

  • Квантизация q4 (4 бита на вес) прилично влияет на качество модели, но в целом она по-прежнему используема. (Модель занимает в памяти SIZEB/2 Гб)

Есть и другие варианты (6 бит, 2 бита, 1 бит, разные квантизации для разных слоев) - но про них как-нибудь в другой раз.

В любом случае, при работе вам всегда имеет смысл качать максимальную модель по числу битов на вес (но не более q8, т.е. 8 бит на вес), которая помещается в памяти вашего устройства - VRAM или RAM.

Например:

  • 13B в q4 это 13/2 = 6.5 Гб - помещается на видеокарту с 8Гб VRAM. Но в q8 она уже занимает 13 Гб - и на ту же видеокарту она уже не поместится, только в RAM.

  • 70B в q4 это 35 Гб - она уже не помещается ни в одну бытовую видеокарту - но, возможно, поместится в RAM, если её у вас много.

Скорости генерации

Теперь, собственно, самое интересное - с какой скоростью будут работать сети в той или иной инсталляции?

Вот приблизительные цифры (полученные по результатам собственных экспериментов какое-то время назад):

  • Локальные модели (помещаются на GPU / VRAM)

    • 7-13B: 20 токенов/секунду

    • 14-40B: 15 токенов/секунду

    • 70-700B: 10 токенов/секунду

  • Локальные модели (на CPU / RAM)

    • 7B: 8 токенов/секунду

    • 14B: 5 токенов/секунду

    • 20-40B: 3 токена/секунду

    • 70-700B: 1.5 токена/секунду

  • Удаленные модели по API

    • 7B-13B: 50 токенов/секунду

    • 14B-40B: 35 токенов/секунду

    • 70B: 25 токенов/секунду

    • 200-700B: 18 токенов/секунду

  • Другие варианты

    • API FAST моделей: 200 токенов/секунду

    • Локальная от 32B, подгрузка с SSD: 0.2 токена/секунду

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

Интерактивный вариант

Чтобы не просто смотреть на цифры, а почувствовать, как это работает, я сделал небольшое HTML-приложение:

Пользовательские ощущения

Чисто интуитивно у меня выработалось следующее представление о скоростях с точки зрения пользователя:

  • 50 токенов в секунду - ощущается как быстрое

  • 10 токенов в секунду и выше - ощущается нормально

  • 5 токенов в секунду - минимально приемлемый вариант с ожиданием, но еще не мучительным

Из этого следует, что, по моим ощущениям:

  • Если модель помещается в VRAM - можно пользоваться, ощущения нормальные

  • Если помещается в RAM, то нормальные ощущения от пользования моделями до 7B, условно можно пользоваться моделями до 13B; выше - ужасно медленно.

  • Подгрузка с диска дает около 0.2 т/с - можете попробовать прям в приложении это ощущение, чтобы не пробовать вживую :)

По API, конечно, пользоваться можно с гораздо большим удовольствием:

  • Большинство моделей выдают от 20 токенов в секунду

  • Легкие модели - OpenAI gpt-4o-mini, Google Flash 2.0 - выдают 50-100 токенов в секунду, что ощущается как очень быстрый ответ.

  • Изредка можно найти провайдеров, которые хостят модели с удивительной скоростью - например, я нашел DeepSeek 0324 со скоростью 200 токенов в секунду. Ощущение - как будто все летает, конечно. (Правда, за это приходится платить свою цену - при этом варианте контекст ограничен 8 000 токенами в противовес 128 000 в обыкновенном DeepSeek)

В общем, если:

  • Нужная вам модель не предлагается никем

  • Или у вас жесткие требования к приватности обработки данных

...используйте локальные модели. В противном случае, по моему мнению, гораздо лучше использовать удаленное API.

PS: Еще раз ссылка на приложение, в котором можно потыкать и ощутить разницу в скорости.

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 5: ↑5 и ↓0+7
Комментарии25

Публикации

Ближайшие события