Search
Write a publication
Pull to refresh
21
0
Александр Подмосковный @Myskat_90

User

Send message

Да, я полностью согласен! В первую очередь нужно использовать 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, вот вызов:

# Если используем автокаст для FP16/bfloat16 на GPU
            autocast_enabled = (torch.cuda.is_available() and self.torch_dtype in [torch.float16, torch.bfloat16])
            with torch.autocast("cuda", enabled=autocast_enabled):
                for _ in range(body.n):
                    out = self.pipe(
                        prompt="",
                        prompt_3=body.prompt,
                        negative_prompt=body.negative_prompt,
                        num_inference_steps=body.steps,
                        guidance_scale=body.guidance_scale,
                        width=width,
                        height=height
                    )
                    # В данном примере возвращается только первый элемент из out.images,
                    # так как обычно SD генерирует 1 картинку за вызов.
                    # Если нужно возвращать batch, можно извлечь все элементы.
                    images.append(out.images[0])
            return images

Отдельной опции в 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, если смотреть объявления на авито.

  • CUDA Graph для Gemma-3-12B пришлось отключить (ENABLE_ENFORCE_EAGER=true), иначе модель падала. На Dolphin3.0 с графом производительность была ≈ 40 t/s.

Нашел решение - ошибка была в том, что я использовал почти всю доступную видеопамять ("GPU_MEMORY_UTIL": "0.98") и при включении CUDA Graph ему не хватало места, а дальше приходил ООМ и всё убивал

Сменил показатель на "GPU_MEMORY_UTIL": "0.92" и всё заработало

Провели ряд тестов производительности с помощью LLMPerf. Средняя межтокеновая задержка составила ≈0,116 с, а throughput — ≈10 т/с, что наглядно подтверждает стабильность и корректность работы инференса. Не так быстро, как хотелось бы, но я продолжаю исследовать возможности улучшить результат.

Скорость увеличилась почти в 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, но работать будет очень медленно.

Остается либо увеличивать количество видеокарт, либо ждать, ну или квантовать для уменьшения потребления ресурсов.

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