Diffusers documentation
Распределённый вывод
Начало работы
Вывод
Использование конвейеров диффузии
Адаптеры и персонализация
Оптимизация и масштабирование
Базовая производительность
Скорость и память
Распределённый вывод
ОбзорПараллелизм данныхШардирование моделей с помощью device_mapПараллелизм контекстаПараллелизм тензоров
Квантование
Ускорение для конкретного оборудования
Методы сообщества
Модульные Diffusers
Обучение и дообучение
Ресурсы
Внести вклад
API
Распределённый вывод
Распределённый вывод распределяет нагрузку между несколькими 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