Diffusers documentation
Утилиты
Утилиты
Вспомогательные и служебные функции для работы с 🤗 Diffusers.
numpy_to_pil
Преобразование изображения numpy или пакета изображений в изображение PIL.
pt_to_pil
Преобразование изображения torch в изображение PIL.
load_image
diffusers.utils.load_image
< source >( image: str | PIL.Image.Imageconvert_method: typing.Optional[typing.Callable[[PIL.Image.Image], PIL.Image.Image]] = None ) → PIL.Image.Image
Параметры
- image (
strилиPIL.Image.Image) — Изображение, которое нужно преобразовать в формат PIL Image. - convert_method (Callable[[PIL.Image.Image], PIL.Image.Image], optional) —
Метод преобразования, применяемый к изображению после его загрузки. Если установлено значение
None, изображение будет преобразовано в «RGB».
Возвращает
PIL.Image.Image
Изображение PIL.
Загружает image в изображение PIL.
load_video
diffusers.utils.load_video
< source >( video: strconvert_method: typing.Optional[typing.Callable[[list[PIL.Image.Image]], list[PIL.Image.Image]]] = Nonereturn_fps: bool = False ) → list[PIL.Image.Image] or tuple[list[PIL.Image.Image], float]
Параметры
- video (
str) — URL или путь к видео для преобразования в список изображений в формате PIL Image. - convert_method (Callable[[list[PIL.Image.Image]], list[PIL.Image.Image]], optional) —
Метод преобразования, применяемый к видео после его загрузки. Если установлено значение
None, изображения будут преобразованы в формат «RGB». - return_fps (
bool, необязательный, по умолчаниюFalse) — Следует ли также возвращать частоту кадров, с которой было закодировано видео. Требуется для конвейеров, которые пересэмплируют входные данные до частоты кадров, с которой работает их модель, поскольку список кадров не содержит этой информации.
Возвращает
list[PIL.Image.Image] или tuple[list[PIL.Image.Image], float]
Видео в виде списка изображений PIL, а также частота кадров, если задан параметр return_fps.
Загружает video в список изображений PIL.
export_to_gif
diffusers.utils.export_to_gif
< source >( image: list[PIL.Image.Image]output_gif_path: str = Nonefps: int = 10 )
export_to_video
diffusers.utils.export_to_video
< source >( video_frames: list[np.ndarray] | list[PIL.Image.Image]output_video_path: str = Nonefps: int = 10quality: float = 5.0bitrate: int | None = Nonemacro_block_size: int | None = 16 )
quality:
Качество видеовыхода. По умолчанию 5. Используется переменная битрейт. Максимальное качество — 10, минимальное — 0. Установите None, чтобы не передавать флаги переменной битрейт в FFMPEG, что позволит указать их вручную с помощью output_params.
Указание фиксированного битрейта с помощью bitrate отключает этот параметр.
bitrate:
Устанавливает постоянную скорость кодирования видео. По умолчанию значение None, в этом случае используется параметр quality.
Использование параметра переменной скорости quality позволяет получить видео лучшего качества при меньшем размере файла, чем при задании фиксированной скорости с помощью этого параметра.
macro_block_size: Ограничение размера для видео. Ширина и высота должны делиться на это число. Если они не делятся на это число, imageio укажет ffmpeg масштабировать изображение до ближайшего размера, делящегося на это число. Большинство кодеков совместимы с размером макроблока 16 (по умолчанию), некоторые поддерживают меньшие значения (4, 8). Чтобы отключить эту автоматическую функцию, установите значение None или 1, однако имейте в виду, что многие плееры не могут декодировать видео с нечётным размером, а некоторые кодеки могут выдавать низкое качество или не работать. См. https://en.wikipedia.org/wiki/Macroblock.
encode_video
diffusers.utils.encode_video
< source >( video: list[PIL.Image.Image] | np.ndarray | 'torch.Tensor' | Iterator['torch.Tensor']fps: intoutput_path: straudio: 'torch.Tensor' | None = Noneaudio_sample_rate: int | None = Nonevideo_chunks_number: int = 1 )
Параметры
- video (
List[PIL.Image.Image]илиnp.ndarrayилиtorch.Tensor) — Тензор видео с формой [frames, height, width, channels] и целочисленными значениями пикселей в диапазоне [0, 255]. Если входные данные представлены в видеnp.ndarray, ожидается, что это будет массив с плавающей точкой со значениями в диапазоне [0, 1] (именно такой формат обычно возвращают пайплайны приoutput_type="np"). - fps (
int) — Количество кадров в секунду (FPS) закодированного видео. - output_path (
str) — Путь для сохранения закодированного видео. - audio (
torch.Tensor, необязательный) — Аудиосигнал с формой [audio_channels, samples]. - audio_sample_rate — (
int, необязательный): Частота дискретизации аудиосигнала. - video_chunks_number (
int, необязательный, по умолчанию1) — Количество фрагментов, на которые видео делится для кодирования. Каждый фрагмент кодируется отдельно. Количество используемых фрагментов часто зависит от конфигурации тайлинга для видео-VAE.
Кодирует видео с необязательным аудио с использованием библиотеки PyAV. Основано на коде из оригинального репозитория LTX-2: https://github.com/Lightricks/LTX-2/blob/4f410820b198e05074a1e92de793e3b59e9ab5a0/packages/ltx-pipelines/src/ltx_pipelines/utils/media_io.py#L182
make_image_grid
Готовит единую сетку изображений. Полезно для целей визуализации.
randn_tensor
diffusers.utils.torch_utils.randn_tensor
< source >( shape: tuple | listgenerator: list['torch.Generator'] | 'torch.Generator' | None = Nonedevice: str | 'torch.device' | None = Nonedtype: 'torch.dtype' | None = Nonelayout: 'torch.layout' | None = None )
Вспомогательная функция для создания случайных тензоров на нужном device с нужным dtype. При передаче списка генераторов можно задать отдельный seed для каждого размера батча. Если переданы генераторы для CPU, тензор всегда создаётся на CPU.
TorchDeviceBackend
класс diffusers.utils.torch_utils.TorchDeviceBackend
< source >( device: str | torch.device | None = None )
Прокси для пространства имён torch.<backend> (torch.cuda, torch.xpu, torch.mps, …) одного устройства. Атрибуты, которые класс не определяет, принадлежат самому модулю (synchronize, device_count, Stream, current_stream, …); методы, определённые здесь, переопределяют операции, доступность которых различается между бэкендами и для которых требуется запасной вариант: очистка кэша, установка seed и запросы о памяти. Если device не указан, ускоритель хоста определяется через torch.accelerator. Если у torch нет модуля для данного бэкенда, возникает исключение, а не происходит тихого переключения на torch.cuda.
Пиковый объём памяти, выделенной на устройстве в байтах с момента последнего сброса; 0, если бэкенд не ведёт статистику.
Свободная и общая память устройства в байтах.
apply_layerwise_casting
diffusers.hooks.apply_layerwise_casting
< source >( module: Modulestorage_dtype: dtypecompute_dtype: dtypeskip_modules_pattern: str | tuple[str, ...] = 'auto'skip_modules_classes: tuple[typing.Type[torch.nn.Module], ...] | None = Nonenon_blocking: bool = False )
Параметры
- module (
torch.nn.Module) — Модуль, дочерние модули которого будут приведены к типу данных высокой точности для вычислений и к типу данных низкой точности для хранения. - storage_dtype (
torch.dtype) — dtype, к которому модуль приводится до/после прямого прохода для хранения. - compute_dtype (
torch.dtype) — Тип данных (dtype), к которому приводится модуль во время прямого прохода для вычислений. - skip_modules_pattern (
tuple[str, ...], по умолчанию"auto") — Список шаблонов для сопоставления с именами модулей, которые нужно пропустить в процессе послойного приведения типов. Если установлено значение"auto", используются шаблоны по умолчанию. Если установлено значениеNone, модули не пропускаются. Если установлено значениеNoneвместе сskip_modules_classes, равнымNone, послойное приведение типов применяется непосредственно к модулю, а не к его внутренним подмодулям. - skip_modules_classes (
tuple[Type[torch.nn.Module], ...], по умолчаниюNone) — Список классов модулей, которые нужно пропустить при послойном приведении типов. - non_blocking (
bool, по умолчаниюFalse) — ЕслиTrue, операции приведения типов весов выполняются без блокировки.
Применяет послойное приведение типов к заданному модулю. Ожидаемым модулем здесь является Diffusers ModelMixin, но это может быть любой nn.Module, использующий слои diffusers или примитивы pytorch.
Пример:
>>> import torch
>>> from diffusers import CogVideoXTransformer3DModel
>>> transformer = CogVideoXTransformer3DModel.from_pretrained(
... model_id, subfolder="transformer", torch_dtype=torch.bfloat16
... )
>>> apply_layerwise_casting(
... transformer,
... storage_dtype=torch.float8_e4m3fn,
... compute_dtype=torch.bfloat16,
... skip_modules_pattern=["patch_embed", "norm", "proj_out"],
... non_blocking=True,
... )apply_group_offloading
diffusers.hooks.apply_group_offloading
< source >( module: Moduleonload_device: typing.Union[str, torch.device]offload_device: typing.Union[str, torch.device] = torch.device()offload_type: str | diffusers.hooks.group_offloading.GroupOffloadingType = 'block_level'num_blocks_per_group: int | None = Nonenon_blocking: bool = Falseuse_stream: bool = Falserecord_stream: bool = Falselow_cpu_mem_usage: bool = Falseoffload_to_disk_path: str | None = Noneblock_modules: list[str] | None = Noneexclude_kwargs: list[str] | None = None )
Параметры
- module (
torch.nn.Module) — Модуль, к которому применяется групповая разгрузка. - onload_device (
torch.device) — Устройство, на которое загружается группа модулей. - offload_device (
torch.device, по умолчаниюtorch.device("cpu")) — Устройство, на которое выгружается группа модулей. Обычно это CPU. По умолчанию — CPU. - offload_type (
strилиGroupOffloadingType, по умолчанию “block_level”) — Тип применяемого offloading. Может быть “block_level” или “leaf_level”. По умолчанию — “block_level”. - offload_to_disk_path (
str, необязательный, по умолчаниюNone) — Путь к каталогу, в который будут выгружаться параметры. Установка этого параметра может быть полезна в условиях ограниченной оперативной памяти, когда требуется разумный компромисс между скоростью и потреблением памяти. - num_blocks_per_group (
int, необязательный) — Количество блоков в группе при использовании offload_type=“block_level”. Это значение обязательно при использовании offload_type=“block_level”. - non_blocking (
bool, по умолчаниюFalse) — Если True, выгрузка и загрузка данных выполняются с неблокирующей передачей. - use_stream (
bool, по умолчаниюFalse) — Если True, выгрузка и загрузка данных выполняются асинхронно с использованием CUDA-потока. Это может быть полезно для перекрытия вычислений и передачи данных. - record_stream (
bool, по умолчаниюFalse) — при включении вместе сuse_streamпомечает текущий тензор как использованный этим потоком. Работает быстрее, но требует немного больше памяти. Подробности см. в официальной документации PyTorch. - low_cpu_mem_usage (
bool, по умолчаниюFalse) — Если True, использование памяти CPU минимизируется за счёт закрепления тензоров на лету, а не их предварительного закрепления. Этот параметр имеет значение только при использовании потоковой разгрузки на CPU (т. е.use_stream=True). Это может быть полезно, когда память CPU является узким местом, но может нивелировать преимущества использования потоков. - block_modules (
list[str], необязательный) — Список имён модулей, которые следует рассматривать как блоки для offloading. Если указан, для offloading на уровне блоков будут учитываться только эти модули. Если не указан, будет использоваться логика обнаружения блоков по умолчанию. - exclude_kwargs (
list[str], необязательный) — Список ключей аргументов keyword, которые не должны обрабатываться send_to_device. Это полезно для изменяемого состояния, такого как списки кэша, которые должны сохранять идентичность объектов между проходами forward. Если не указано, значение будет выведено из атрибута_skip_keysмодуля, если он существует.
Применяет групповую разгрузку (group offloading) для внутренних слоёв модуля torch.nn.Module. Чтобы понять, что такое групповая разгрузка и в каких случаях она полезна, сначала нужно дать некоторый контекст о том, как работают другие поддерживаемые методы разгрузки.
Как правило, выгрузка выполняется на двух уровнях:
- На уровне модуля: в Diffusers это можно включить с помощью метода
ModelMixin::enable_model_cpu_offload(). Он работает за счёт выгрузки каждого компонента пайплайна на CPU для хранения и загрузки на устройство ускорителя по мере необходимости для вычислений. Этот метод более эффективен с точки зрения памяти, чем хранение всех компонентов на ускорителе, однако требования к памяти всё ещё остаются довольно высокими. Для работы этого метода необходимо иметь объём памяти, эквивалентный размеру модели в рабочем типе данных (runtime dtype) + размеру крупнейших промежуточных тензоров активаций, чтобы завершить прямой проход (forward pass). - Уровень листьев: в Diffusers это можно включить с помощью метода
ModelMixin::enable_sequential_cpu_offload(). Он работает за счёт выгрузки параметров нижнего уровня (листьев) вычислительного графа на CPU для хранения и загрузки только этих листьев на устройство ускорителя для вычислений. Этот вариант использует минимальное количество памяти ускорителя, но может работать медленнее из-за избыточного числа синхронизаций устройств.
Групповое выгружение представляет собой промежуточный вариант между двумя методами. Оно работает путём выгрузки групп внутренних слоёв (либо torch.nn.ModuleList, либо torch.nn.Sequential). Этот метод потребляет меньше памяти, чем выгружение на уровне модулей. Он также быстрее, чем выгружение на уровне листьев/последовательное выгружение, поскольку количество синхронизаций устройств снижается.
Ещё одна поддерживаемая функция (для CUDA-устройств с поддержкой потоков асинхронной передачи данных) — возможность перекрывать передачу данных и вычисления, чтобы сократить общее время выполнения по сравнению с последовательным offloading. Это реализуется с помощью предварительной загрузки слоёв (layer prefetching) с использованием потоков: следующий к выполнению слой начинает onloading на ускорительное устройство, пока выполняется текущий слой, — это немного увеличивает требования к памяти. Обратите внимание, что данная реализация также поддерживает offloading на уровне листьев (leaf-level), однако при использовании потоков она может стать значительно быстрее.
Пример:
>>> from diffusers import CogVideoXTransformer3DModel
>>> from diffusers.hooks import apply_group_offloading
>>> transformer = CogVideoXTransformer3DModel.from_pretrained(
... "THUDM/CogVideoX-5b", subfolder="transformer", torch_dtype=torch.bfloat16
... )
>>> apply_group_offloading(
... transformer,
... onload_device=torch.device("cuda"),
... offload_device=torch.device("cpu"),
... offload_type="block_level",
... num_blocks_per_group=2,
... use_stream=True,
... )