Комментарии 28
Инференс больших моделей можно распределить (но, к сожалению, невозможно распараллелить) по локалке
Другими словами, суммируется только память, но не производительность участвующих компьютеров. А суммарная производительность получается как у самого медленного компьютера. Я верно понимаю?
Такая ситуация (можно распределить, но не распараллелить) - это ограничение opensource движков или самой, как бы это сказать... архитектуры нейросетей? Если второе, то как же оно запускается в датацентрах для множества людей?
Возможно я задаю глупые вопросы, просто я не очень понимаю, как оно работает "под капотом". Но хочу разобраться. Буду рад, если подскажете что почитать на эту тему.
Это ограничение архитектуры этого вида нейросетей (LLM/transformer decoder).
Производительность не совсем как у самого медленного компьютера, так как обработка каждого токена разделяется последовательно. Например, рассмотрим разделение на 3 компа, где первый, если бы модель помещалась в его память, работал бы со скоростью 10 токенов в секунду, а второй - 5 токенов в секунду, и третий - 2 токены в секунду. Если у них одинаковое количество памяти, и мы делим модель на три равные части, и скорость получится 10*(1/3)+5*(1/3)+2*(1/3)=5,667 токенов в секунду, то есть быстрее самого медленного, и даже быстрее среднего.
В датацентрах эта арифметика не работает, так как там инференс устроен немного по-другому: в примере выше, в каждый момент времени 2 из 3 компов - idle, но в датацентрах много инференсов параллельно, и они будут обрабатывать другие инференсы. Плюс, во время умножения матрицы на вектор, где в клиентском случае ALU будет ждать память, в datacenter будет обрабатываться несколько таких умножений параллельно, чтобы производительность ALU и пропускная способность памяти совпадали.
Но, к сожалению, веса самых продвинутых моделей, которые играют в одной лиге с лучшими онлайн моделями, занимают сотни гигабайт. Например, 8-битные веса Deepseek R1-671B занимают 700 гигабайт, квантованые q4 — 350 гигов.
https://ollama.com/library/qwen2.5-coder:32b
Занимает 20GB, один из лидеров чартов по генерации кода среди локальных LLM
https://aider.chat/docs/leaderboards/
Плюс есть библиотеки позволяющие запускать LLM на (в разы) меньшем объёме памяти, чем занимает сама модель
https://github.com/turboderp-org/exllamav2
Плюс есть отдельные нишевые библиотеки под разные языки, позволяющие интегрировать ваш проект в LLM (то есть на порядок повысить качество генерации)
https://github.com/ollama/ollama-js
То есть вышесказанное очень сильно зависит от конкретных задач.
В целом жизнь есть даже на 16 гигабайтах, и даже на 8 если очень постараться, а ещё отдельная тема для обсуждения - модели созданные для генерации на CPU/RAM
Про тот же Deepseek
Deepseek Coder, весом в 9 гигабайт - по отзывам показывает отличные результаты при генерации кода
https://ollama.com/library/deepseek-coder-v2:16b
Вот эта двухгигабайтная LLM, опять таки по отзывам отлично генерирует код
https://ollama.com/library/starcoder2:3b
https://huggingface.co/bigcode/starcoder2-3b
Это мы только копнули тему низкоресурсопотребляемой генерации кода при помощи LLM
Согласен с тем, что между крохотными и огромными моделями есть много полезных моделей среднего размера, сам постоянно пользуюсь.
ollama - отличная экосистема, но это всего лишь wrapper над llama.cpp, своего инференса там нет.
В exllamav2 нет магии, позволяющей запускать большие модели, если они не помещаются в память, она поддерживает некоторые особо агрессивные квантизации (сжатия), когда менее важные (влияющие на результат) матрицы весов модели квантуются в 1-2 бита. Плюс работает только на CUDA. Другие ранеры тоже постоянно добавляют поддержку новых видов сжатия.
Хммм, интересненько. Я пока копаю тему, так как мне достаточно будет, что бы нейросеть хорошо писала JS/Node.JS, остальное можно и ручками написать - в разы (на порядок) меньше бойлерплейта, ещё не пробовал запускать локально, но усиленно штудирую англоязычные форумы. Лично для себя уже понял (из отзывов энтузиастов), что по большому счёту даже 8 гигабайтов хватит на хорошей, правильно настроенной модели (мне кроме генерации кода ничего не нужно, а JS это это базовая задача, даже для древних моделей). Плюс сейчас уже практически все LLM хорошо с AMD картами работают, то есть ещё и бюджет необходимый снизился. Самое интересное, конечно, это как быстро CPU/RAM модели дорастут до уровня коммерческих, так-то на встройках более 90% народу сидит, то есть спрос есть.
"как быстро CPU/RAM модели дорастут до уровня коммерческих"
С одной стороны - никогда не догонят текущую топ коммерческую модель, но с другой стороны - уже догнали позапрошлогодние. Я не зря упомянул старые Xeon в статье - они дешевые на ebay, и там все хорошо с memory throughput, помедленнее GPU, но не намного, особенно MoЕ модели типа Микстралей быстро гоняет.
Если они догнали позапрошлогодние, то значит уже можно использовать. Чистый JS даже GPT 3.5 выдавал на феноменальном уровне, кстати многие это отмечают, если форумы покопать, насколько хорошо GPT 3.5 хорошо (уже тогда) с JS работал.
Я не зря упомянул старые Xeon в статье - они дешевые на ebay, и там все хорошо с memory throughput
Не потому ли имеется дефицит материнских плат для AMD Epyc, что на них тоже хорошо запускать LLM?
Занимает 20GB, один из лидеров чартов по генерации кода среди локальных LLM
По вашей же ссылке у лидера точность 82.7%, у Deepseek r1 64%, у qwen 2.5 25%. Такое себе.
Задался интересным вопросом - по сути для нейросети нужно быстро умножать матрицы друг с другом и вектора, то есть нужна числодробилка, и быстрый конвеер для подвоза чисел для дробления. Проблема в том, что текущая память адресная, а для сети адреса, по сути, не нужны - нам ведь известна последовательность операций и мы можем точно сказать, на каком шаге какие числа нам нужно достать для умножения. По сути - нужен многоуровневый конвеер на 64-битной шине (для float64) и много-много модулей вроде RS-триггеров, постепенно проталкивающих бинарные сигналы к числодробилке.
Или я не прав?
Да плохо все с псп паматью у старых ксеонов и эпиков, там в прыжке до 200 гб/с. Очень медленно работают. Смысл только кэше и много портов пси-е, чтоб можно было много видеокарта насовать.
Да, под 200 гб/сек, на средне-больших llm дает больше 2 токенов в секунду, уже можно кое-как дождаться результата.
xeon v4 с ram 2400 выдаёт ~70Гб/с и имеет 40 линий pcie v3.0.
следующее поколение xeon с ram 2666 вроде и с тем же pcie v3.0 но уже вроде где то 44-48.
примерно с 20 годов уже идут с pcie v4.0 у которых x2 скорость.
Производительность PCIe для этого ворклоада не важна. Если мне не изменяет память, Xeon-EP/Broadwell Haswell (10 лет назад) на stream показывал ~100Gb/sec, а Broadwell (9 лет назад) ~115Гб/сек на 2 сокетах. У Скайлейка уже 200. О, не изменяет, посмотрел на anandtech, они тогда примерно так и померяли.
Эх, печально. Вот прочитал заголовок и думаю, запущу я нейронку без ограничений на своем МакБук Эйр м2 с 8 гигами оперативки) везде обман)
Кхм, ну я под свою задачу запустил сайгу-мистраль урезанную локально на 8 гигах игрового HP Omen с Nvidia на борту. Да, я ей не код генерю, и не «вопрос жизни, смерти и вообще» решаю, я ей выполняю классификацию строго определённых типов текста. Но ведь работает, задачу решает, без всяких облаков. Никакого обмана :-)
Ну кое-какие CPU/RAM LLM может и запустятся и после качественной настройки может даже смогут что-то выдать. LLM опенсорс так быстро идёт вперёд, что, вполне возможно уже базовую генерацию кода даже на такой конфигурации запустить. Но с настройкой придётся где-то очень сильно повозиться и только под определённый язык это будет работать.
В качестве эксперимента запускал олламу на одноплатнике с 4 гигами RAM - ну, работает, хоть и медленно.
Верно ли, что можно взять 10 таких одноплатников - и это будет эквивалентно 40 гигам RAM? (практическую ценность пока не считаем)
Да, главный автор llama.cpp - Георгий <a href="https://x.com/ggerganov/status/1680588092569255940">делал так</a> с RapberriPi еще с предыдущим поколением распределенного инференса, через MPI.
Или как вариант распределенную открытую сеть организовать, как ранее была для поиска космических сигналов или взлома RC72 силами энтузиастов по всему миру: https://ru.wikipedia.org/wiki/Distributed.net
Если задача интересная можно собрать тысячи и миллионы человек которые поделятся ресурсами своих компьютеров, которые все равно пропадают в режиме простоя.
Понятно что тут сложнее распределить задачи, но может какие-то вычисления и можно распределить.
Реальные кейсы когда тот же deepseek r1 (полный) запускали в такой конфигурации есть? Я видел кейсы когда маки пытались соединять таким образом, и то не хватало пропусной способности ethernet-а, приходилось на thunderbolt переходить но и там всё ограничено было пропусной способностью. А вы тут утверждаете что обычной сетки хватит, что несколько проитворечит реальным попыткам.
Как запустить локально LLM, если ее веса не помещаются в [видео]память