Предисловие

Stable Diffusion - нейронная сеть, которая может превратить ваш текст в картинку, если уж совсем по простому. Но проблема вытекает из реализации PyTorch, который основан на технологии CUDA. И как же быть?

Использование CPU

InvokeAI дало возможность проводить вычисления на процессоре, вместо видеокарты. На своих 16 потоках картинка в 512x512 генерировалась 5 минут, а то и больше. Такой вариант нам не подходит...

AMD ROCm

ROCm - это ретранслятор кода CUDA от компании AMD. Да, он уступает по скорости, но в сравнении с CPU - он работает моментально. ROCm является, пожалуй, лучшим выходом из ситуации, за исключением одного момента, ни о какой поддержки Windows речи не идёт. Так что в этот раз радуются пользователи Linux.

ONNX

Пожалуй, самое универсальное решение в данной ситуации. Библиотека Diffusers предлагает уже готовое решение, где вам остаётся лишь отправлять ваши запросы простым Python скриптом. Имеет несколько вариантов работы:

  • CPU

  • DirectML (DirectX 12)

  • CUDA

Однако, не всё так просто. Данная реализация не может в VAE, LoRA, Upscale (на момент написания был открыт PR). Плюс, помимо этого вы должны конвертировать ваши .ckpt модели в ONNX формат.

ONNX и ноутбуки

Один весьма интересный момент. Если Ваш ноутбук имеет GPU в процессоре:

Тогда есть вероятность, что из коробки у Вас запустить не выйдет. У DirectX есть одна проблема, когда он берёт GPU Device 0, у которой ~512mb VRAM и ONNXRuntime просто словит исключение. Для этого придётся пройтись поискам по файлам в надежде найти вызов функции InferenceSession и прописать ей в вызове ID вашей дискретной видеокарты ручками, добавив provider_options=[{'device_id': 1}].

Примерно может выглядеть так:

ort.InferenceSession(path, providers=[provider], provider_options=[{'device_id': 1}], sess_options=sess_options)

Upscale (Vulkan)

Как я уже и говорил, ONNX не имеет нативной поддержки Upscale моделей. Однако, есть открытые Vulkan реализации тех же Real-ESRGAN, Real-LSR... Которые работают весьма быстро. Достаточно просто вызвать их из командной строки с правильными параметрами.

Заключение

Теперь, осталось найти лишь подходящую реализацию UI для Stable Diffusion и загрузить upscaler, если вы используете Windows.

Комментарии (1)


  1. 12rbah
    01.02.2023 08:06
    +1

    генерировалась 5 минут, а то и больше.

    А скорость генерации на gpu какая(в вашем случае)?