Как запустить стабильную диффузию на EC2


Используйте Meadowrun для запуска новейшей модели преобразования текста в изображение на AWS

Stable Diffusion — это новая, открытая модель преобразования текста в изображение от Stability.ai, которая поразила людей.

Открытый официальный инструмент дает вам 200 генераций изображений бесплатно, а затем взимает около 1¢ за каждую генерацию изображения после этого. Но поскольку модель открыта, вы можете скачать код и модель и запустить свою собственную версию. На сабреддите r/StableDiffusion есть хорошее руководство, как это сделать, и варианты сводятся к использованию Google Colab, который требует подписки Colab Pro ($9,99/месяц), чтобы получить достаточно GPU, или локальному запуску на вашем ноутбуке, который требует GPU с не менее чем 10 ГБ VRAM.

Здесь мы представим другой вариант, который заключается в использовании Meadowrun для аренды машины GPU в AWS EC2 всего на несколько минут за раз. Meadowrun — это библиотека с открытым исходным кодом, которая позволяет легко запускать ваш код на python в облаке. Она позаботится о запуске экземпляра EC2, размещении на нем нашего кода и библиотек и его отключении, когда мы закончим.


Изображения созданы Stable Diffusion на основе «цифровой иллюстрации компьютера в стиле стимпанк, парящего среди облаков, подробная».

Необходимые условия AWS и Meadowrun

Во-первых, нам понадобится учетная запись AWS, в которой мы увеличили квоты для экземпляров GPU (по умолчанию 0). Нам также понадобится локальная среда python с установленным Meadowrun. Оба этих шага мы рассмотрели в предыдущей статье о запуске Craiyon aka DALL-E Mini (не путать с DALL-E от OpenAI), поэтому мы дадим ссылку на инструкции по этим шагам из той статьи, а не будем повторять их здесь. Мы рекомендуем проверить это раньше, чем позже, так как, похоже, что в AWS есть человек, отвечающий за увеличение квоты, и, по нашему опыту, для получения разрешения на увеличение квоты может потребоваться день или два.

Необходимые условия для стабильной диффузии

Далее нам нужно перейти на страницу Stable Diffusion на Hugging Face, принять условия и загрузить файл контрольной точки с весами модели на нашу локальную машину.

Затем мы создадим ведро S3 и загрузим этот файл в наше новое ведро, чтобы наш экземпляр EC2 мог получить доступ к этому файлу. Из каталога, куда был загружен файл контрольной точки, мы запустим программу:

aws s3 mb s3://meadowrun-sd
aws s3 cp sd-v1-4.ckpt s3://meadowrun-sd
Войти в полноэкранный режим Выйти из полноэкранного режима

Помните, что имена ведер S3 глобально уникальны, поэтому вам нужно использовать уникальное имя ведра, отличное от того, которое мы используем здесь (meadowrun-sd).

Наконец, нам нужно будет предоставить доступ к этому ведру для запущенных Meadowrun экземпляров EC2:

meadowrun-manage-ec2 grant-permission-to-s3-bucket meadowrun-sd
Войти в полноэкранный режим Выход из полноэкранного режима

Запуск Stable Diffusion

Теперь мы готовы к запуску Stable Diffusion!

import asyncio
import meadowrun

def main():
    folder_name = "steampunk_computer"
    prompt = "a digital illustration of a steampunk computer floating among clouds, detailed"

    asyncio.run(
        meadowrun.run_command(
            'bash -c ''
            'aws s3 sync s3://meadowrun-sd /var/meadowrun/machine_cache --exclude "*" '
            '--include sd-v1-4.ckpt '
            f'&& python scripts/txt2img.py --prompt "{prompt}" --plms '
            '--ckpt /var/meadowrun/machine_cache/sd-v1-4.ckpt --outdir /tmp/outputs '
            f'&& aws s3 sync /tmp/outputs s3://meadowrun-sd/{folder_name}'',
            meadowrun.AllocCloudInstance("EC2"),
            meadowrun.Resources(
                logical_cpu=1, memory_gb=8, max_eviction_rate=80,
                gpu_memory=10, flags="nvidia"
            ),
            meadowrun.Deployment.git_repo(
                "https://github.com/hrichardlee/stable-diffusion",
                branch="meadowrun-compatibility",
                interpreter=meadowrun.CondaEnvironmentYmlFile(
                    "environment.yaml", additional_software="awscli"
                ),
                environment_variables={
                    "TRANSFORMERS_CACHE": "/var/meadowrun/machine_cache/transformers"
                }
            )
        )
    )

if __name__ == "__main__":
    main()
Войти в полноэкранный режим Выход из полноэкранного режима

Давайте пройдемся по этому фрагменту. Первый параметр run_command указывает Meadowrun, что мы хотим запустить на удаленной машине. В данном случае мы используем bash для создания цепочки из трех команд:

  • Во-первых, мы используем aws s3 sync для загрузки весов из S3. Наша команда будет запущена в контейнере, но папка /var/meadowrun/machine_cache, в которую мы загрузим данные, может быть использована для кэширования данных для нескольких заданий, выполняемых на одном экземпляре. В aws s3 cp нет опции --no-overwrite, поэтому мы используем aws s3 sync, чтобы загрузить файл только в том случае, если у нас его еще нет. Это не является надежным для нескольких процессов, запущенных одновременно на одной машине, но в данном случае мы выполняем только одну команду за раз.
  • Во-вторых, мы запустим сценарий txt2img.py, который сгенерирует изображения из указанного нами запроса.
  • Последняя часть нашей команды загрузит результаты скрипта txt2img.py в наше ведро S3.

Следующие два параметра указывают Meadowrun, какой экземпляр нам нужен для выполнения нашего кода:

  • Resources указывает Meadowrun требования к экземпляру EC2. В данном случае нам требуется как минимум 1 CPU, 8 ГБ основной памяти и 10 ГБ памяти GPU на графическом процессоре Nvidia. Мы также установили max_eviction_rate на 80, что означает, что мы согласны на точечные экземпляры с вероятностью прерывания до 80%. Используемые нами экземпляры GPU довольно популярны, поэтому если наш экземпляр часто прерывается или выселяется, нам, возможно, придется перейти на экземпляр по требованию, установив этот параметр на 0.

Наконец, Deployment.git_repo определяет наши python-зависимости:

  • Первые два параметра указывают Meadowrun получать код из ветки meadowrun-compatibility этого форка официального репо. Мы почти смогли использовать исходный репозиторий как есть, но нам пришлось внести небольшие изменения в файл environment.yaml — Meadowrun пока не поддерживает установку текущего кода в виде редактируемого пакета pip.
  • Третий параметр указывает Meadowrun создать окружение conda на основе пакетов, указанных в файле environment.yaml в репозитории.
  • Нам также нужно указать Meadowrun установить awscli, которая является зависимостью без конды, устанавливаемой через apt. Мы используем AWS CLI для загрузки и выгрузки файлов в/из S3.
  • Последний параметр устанавливает переменную окружения TRANSFORMERS_CACHE. Stable Diffusion использует библиотеку трансформаторов Hugging Face, которая загружает веса моделей. Эта переменная окружения указывает трансформаторам на папку /var/meadowrun/machine_cache, чтобы мы могли повторно использовать этот кэш во всех запусках.

Чтобы пройтись по отдельным частям вывода, сначала Meadowrun сообщает нам все, что нам нужно знать об экземпляре, который он запустил для этой работы, и сколько это будет стоить (всего 16 центов в час для точечного экземпляра! Если нам нужен экземпляр по требованию, он будет стоить 53¢ в час).

Launched a new instance for the job: ec2-3-15-146-110.us-east-2.compute.amazonaws.com: g4dn.xlarge (4.0 CPU, 16.0 GB, 1.0 GPU), spot ($0.1578/hr, 61.0% eviction rate), will run 1 workers
Вход в полноэкранный режим Выход из полноэкранного режима

Далее Meadowrun создает контейнер на основе содержимого файла environment.yaml, который мы указали. Это занимает некоторое время, но Meadowrun кэширует изображение в ECR для нас, поэтому это нужно сделать только один раз. Meadowrun также очищает образ, если мы не используем его в течение некоторого времени.

Building python environment in container a07bf5...
Вход в полноэкранный режим Выход из полноэкранного режима

После этого мы увидим вывод скрипта txt2img.py:

Global seed set to 42
Loading model from /var/meadowrun/machine_cache/sd-v1-4.ckpt
...
Вход в полноэкранный режим Выход из полноэкранного режима

Этот сценарий обычно занимает около 3 минут и генерирует 6 изображений с настройками по умолчанию. В сумме получается около 6 изображений за 1¢ при использовании экземпляра spot и около 2 изображений за 1¢ при использовании экземпляра on-demand, хотя нам придется оплатить некоторые накладные расходы на создание среды.

После завершения последней команды наши изображения будут доступны в нашем ведре S3! Мы можем просмотреть их с помощью пользовательского интерфейса S3, например CyberDuck, или просто синхронизировать ведро с нашей локальной машиной с помощью командной строки:

aws s3 sync s3://meadowrun-sd/steampunk_computer steampunk_computer
Войти в полноэкранный режим Выйти из полноэкранного режима

Meadowrun автоматически выключит машину, если мы не будем использовать ее в течение 5 минут, но если мы знаем, что закончили генерировать изображения, мы можем выключить ее вручную из командной строки:

meadowrun-manage-ec2 clean
Войти в полноэкранный режим Выйти из полноэкранного режима

Заключительные замечания

Stable Diffusion замечателен тем, насколько он хорош, насколько он открыт, и насколько он дешев и прост в использовании. А Meadowrun делает это еще проще!

Чтобы быть в курсе новостей о Meadowrun, присоединяйтесь к нам на Github или следите за нами в Twitter!

Оцените статью
devanswers.ru
Добавить комментарий