All streams
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
Does not participate
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