Diffusers documentation

Распределённый вывод

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.43.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Распределённый вывод

Распределённый вывод распределяет нагрузку между несколькими GPU. Это полезно для размещения более крупных моделей в памяти и для обработки большего количества запросов одновременно.

Diffusers поддерживает четыре стратегии. У каждой из них есть собственное руководство, а эта страница поможет вам выбрать нужную.

Выбор стратегии

Каждая стратегия решает свою задачу, поэтому выбирайте ту, которая соответствует вашему ограничивающему ресурсу.

СтратегияРазделенияУменьшаетЗадержка для одного запросаЛучше всего
Параллелизм данныхprompts между репликаминичего, так как на каждом GPU хранится полная копиябез изменениймодель уже помещается в память, а у вас много промптов
device_mapкомпоненты на разных устройствахпамять весовчуть хужемодель не помещается в память, а межпроцессорное соединение медленное
Параллелизм контекставходная последовательностьпамять активацийнижепоследовательности длинные, например, изображения высокого разрешения или видео
Параллелизм тензоровматрицы весовпамять весовнижевеса одного компонента не помещаются, а межсоединение быстрое

Некоторые практические рекомендации:

  • Если модель уже помещается в память, а промптов много, используйте параллелизм данных. Он масштабирует пропускную способность в зависимости от количества GPU, не затрагивая модель, и не влияет на задержку для одиночного промпта. Настройте его с помощью Accelerate или PyTorch Distributed.
  • Если веса одного компонента не помещаются в память, сначала попробуйте тензорное параллелизм, так как он снижает как потребление памяти, так и задержку. Тензорное параллелизм требует обмена данными на каждой границе блока, поэтому для него необходим быстрый интерфейс, например NVLink. На PCIe трафик на каждый слой может превысить вычислительную выгоду, и в этом случае device_map становится лучшим выбором. device_map также решает проблему, когда компоненты по отдельности помещаются, но их совокупный размер слишком велик.
  • Если проблема в активациях, а не в весах, используйте контекстный параллелизм. Это помогает при работе с длинными последовательностями, например, с крупными изображениями и видео, содержащими много кадров. Выберите бэкенд на основе бенчмарков из руководства Context parallelism.
  • Если и веса, и последовательность слишком велики, Diffusers не может применить тензорный и контекстный параллелизм к одной и той же модели. ParallelConfig вызывает ошибку, если передать оба конфигурации, а enable_parallelism нельзя вызвать второй раз для модели, которая уже распараллелена.

Интеграции сообщества xDiT и ParaAttention предлагают собственные реализации контекстного параллелизма.

Update on GitHub