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