Александр Подмосковный @Myskat_90
User
Information
- Rating
- 107-th
- Location
- Москва, Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity
Specialization
DevOps, Site Reliability Engineer (SRE)
Lead
Git
Linux
Kubernetes
CI/CD
High-loaded systems
OpenStack
DevOps
Ansible
Terraform
SRE
Да, я полностью согласен! В первую очередь нужно использовать tensor parallelism и стараться модель разместить полностью на 1 ноде. Но я не смог у себя исследовать tensor parallelism, потому что на момент написания статьи не было возможности организовать такую топологию даже из двух карт (Сейчас я ищу возможность потестировать tensor parallelism и думаю в одном из следующих материалов поделюсь результатами)
Поэтому я начал исследовать другую возможность сделать распределенный инференс через pipeline parallelism, чтобы понять на сколько эта схема жизнеспособна с учетом ограничения пропускной способности сети
Несколько причин))
первая - это банально не хватило слотов в одном сервере (rtx 3090 занимают 3 слота и перекрывают второй x16 PCIe)
вторая - меня в первую очередь терзали вопросы - что делать если модель не будет влазить в 8 GPU на хосте (как правило пром сервера имеют столько GPU)? можно ли ее дальше масштабировать и на сколько это эффективно? Какая сеть нужна для этого, когда мы начинаем в нее упираться и вообще до какого количества нод имеет смысл параллелить?)
Но сейчас присматриваю двуслотовые или однослотовые карты, чтобы потестировать tensor, а так же планирую исследовать новый тренд на встроенные в CPU ускорители (AI NPU) с unified LPDDR5X памятью (по аналогии как это сделано в Mac Studio) - например вот такой
Здравствуйте! Спасибо, отличный вопрос!
Не смотря на то что карты разные - LLM я запускаю на двух rtx 3090 (по одной GPU на каждой ноде) — стараюсь избегать гетерогенности, в противном случае узким местом становится наименее мощная карта (у меня это rtx 3060) и остальные карты работают не на полную.
Вручную heads не делил, в vLLM это делается автоматически на уровне tensor parallelism. В моей конфигурации (pipeline parallelism = 2, tensor parallelism = 1) все головы внимания идут на одну карту в рамках этапа, и доп. шаффлов между GPU не возникает. Если бы использовал tensor parallelism >1, тогда heads делились бы между GPU, и тут уже важно, чтобы их количество делилось без остатка. Но настроек для ручного закрепления heads за картой в vLLM сейчас нет (на сколько я знаю) — только автоматически, и посмотреть детали распределения внутри движка стандартно нельзя.
В планах пересобрать стенд на несколько gpu на одной ноде и попробовать распределение ipeline parallelism = 2, tensor parallelism = 2
Здравствуйте!
Вы правы, это настройки в serve.py, делал для совместимости с Open WebUI (в нем генерация картинок еще в экспериментальном режиме и там достаточно немного параметров)
SD запущена в отдельном ray кластере и и там отдельный serve.py, вот вызов:
Отдельной опции в UI для хранения seed пока что нет, поэтому дополнить не получается
При желании можно доработать serve.py и передавать seed в параметр generator
Спасибо за содержательный комментарий и вопросы!
Моя лаборатория — это скорее рабочий инструмент, а не демонстрация "железа". Она создавалась несколько лет специально для быстрого тестирования энтерпрайз-решений, которые потом идут в продовые сценарии. Это всегда был осознанный выбор в пользу экспериментов: всё собиралось по частям, часто — на вторичном рынке, и в ущерб другим хобби и тратам.
По сути, основные подходы из статьи — распределение моделей, запуск inference на нескольких машинах — одинаково хорошо работают и на более скромных конфигурациях.
Если есть 2–3 ПК с RTX 3060, их можно объединить в кластер через Ray/vLLM и повторить ключевые сценарии (различие будет только в производительности и максимальном размере модели). Один сервер с несколькими GPU — тоже вариант, тут архитектура аналогичная, разница будет в нюансах коммуникации между устройствами.
Для домашних или небольших сетей подойдут и сценарии с объединением мощных ПК через интернет (если позволяют сеть и задержки) — методика та же, ограничения будут только в скорости обмена.
Я обязательно включу примеры для минимальных конфигураций в следующих материалах.
Главное — чтобы каждый энтузиаст или команда могли использовать эти подходы на практике и адаптировать их под свои задачи, независимо от масштаба лаборатории или бюджета.
Буду рад, если статья окажется полезной, и открыт к дальнейшим вопросам!
Большое спасибо за статью! Реально заставляет переосмыслить взаимодействие с ИИ
Промпт произвел впечатление, представляю сколько времени и сил заняло его создание
К сожалению в результате использования промпта (изначально вопрос звучал так:"Сколько вторников в мае 2025 года?)" я довел им бедную Gemma 3 на домашнем кластере до состояния признания полной некомпетентности и мне стало жалко ее, но сам факт признания ошибки, отказа давать недостоверную информацию и понимание провокаций поразили меня
Это другой разговор - написал в ЛС более подробно)
Здравствуйте!
Да, провести возможно, но надо подумать как лучше объединить ваше оборудование в единый ray кластер с проброшенными GPU - на это может потребоваться много времени)
Плюс надо понимать, что при разнородной инфраструктуре, распределение будет ограничено по самой наименьшей по видеопамяти карте (особенности vLLM)
Мне кажется проще будет в вашем случае использовать решение Exo https://github.com/exo-explore/exo
Достаточно будет поставить docker и прокинуть в контейнер GPU и в этой среде поставить exo
Конечно, написал детали в ЛС)
Большое спасибо за отзыв! Для меня очень важна обратная связь.
Вопрос про бюджет провокационный конечно) Поэтому отвечу так - точно дешевле, чем одна Tesla H100 80Gb, если смотреть объявления на авито.
Нашел решение - ошибка была в том, что я использовал почти всю доступную видеопамять ("GPU_MEMORY_UTIL": "0.98") и при включении CUDA Graph ему не хватало места, а дальше приходил ООМ и всё убивал
Сменил показатель на "GPU_MEMORY_UTIL": "0.92" и всё заработало
Скорость увеличилась почти в 2 раза: межтокеновая задержка ≈0.067 с, а throughput — ≈19.5 т/с
На текущем сетапе конечно не получится запустить оригинальную Deepseek-R1, там в bf16 нужно порядка 1,2Тб памяти, которую надо где то взять)
Для демонстрации можно попробовать сгрузить часть весов на ОЗУ с помощью параметра CPU_OFFLOAD_GB, но в этом случае скорость инференса значительно упадет.
Либо полностью перейти на распределенный запуск на CPU, но это, боюсь, тоже будет медленно и потянет на тему для отдельного исследования)
Вот для примера запустил с CPU_OFFLOAD_GB=16 модель gemma-3-27b-it которая весит около 60Gb, она успешно работает, но скорость мала - порядка 0,2 t/s
Таким же способом можно запустить R1, но работать будет очень медленно.
Остается либо увеличивать количество видеокарт, либо ждать, ну или квантовать для уменьшения потребления ресурсов.