Как развернуть нейросеть для генерации изображений за 5 минут? Пошаговая инструкция
Говорят, построить свою конвейерную ленту по разработке нейронок не так сложно: нужен «всего лишь» сервер с GPU и настроенное окружение с библиотекой Diffusers. Решили проверить это на практике и разработать Telegram-бота для генерации вайф в режиме 24/7. Что из этого получилось, рассказываем в тексте.
Используйте навигацию, если не хотите читать текст целиком:
Знакомство с Diffusers
Diffusers — это библиотека от Hugging Face, которая позволяет работать с сотнями обученных Stable Diffusion-моделей для генерации изображений, аудио и даже объемных молекулярных структур. Ее можно использовать как для экспериментов с существующими моделями, так и для обучения своих.
Разработчики из Hugging Face утверждают, что их детище — простой модульный проект. И профессиональные знания об устройстве нейронных сетей и работе с тензорами не нужны. Это действительно так: для работы с Diffusers достаточно импортировать несколько пакетов и запустить пайплайн на полюбившейся модели. Последнее можно найти на Civitai или в официальной библиотеке Hugging Face.
Раз все так просто, давайте поэкспериментируем c Diffusers.
Подготовка облачного окружения
Для нашего проекта локальная машина не подойдет: генерация одной картинки потребляет много виртуальных ресурсов и времени. Особенно в случае сервиса, с которым могут работать сразу несколько пользователей. Поэтому понадобится виртуальный сервер с GPU и настроенным окружением.
Чтобы избежать ситуации как на картинке, развернем проект на Data Analytics Virtual Machine — виртуальном сервере с предустановленным набором инструментов для анализа данных и машинного обучения. А за основу возьмем конфигурацию с видеокартой Tesla V4.
- Переходим в раздел Облачная платформа внутри панели управления.
- Выбираем пул ru-7a и создаем облачный сервер с дистрибутивом Ubuntu LTS Data Analytics 64-bit и нужной конфигурацией.
Выбор дистрибутива для Data Analytics Virtual Machine.
Важно, чтобы сервер был доступен «из интернета», иначе с компьютера не подключиться. Для этого во время настройки конфигураций выберите новый публичный IP-адрес.
Далее — запускаем сервер и настраиваем окружение.
Подключаемся к DAVM и разворачиваем Diffusers
Нужно дать системе пару минут на подгрузку всех Docker-образов. Потом, чтобы настроить окружение, нужно просто подключиться к серверу по SSH — тогда он покажет данные для авторизации в окружении DAVM.
Данные для подключения к DAVM.
Теперь, если перейти по ссылке из сообщения и авторизоваться в DAVM, можно запустить Jupyter Lab, Keycloak, Prefect или Superset. Для нашего проекта понадобится только первое.
Список инструментов DAVM.
После перехода в Jupyter Lab нужно загрузить готовый notebook-шаблон для работы с Diffusers. Его можно взять в нашем GitHub-репозитории.
Краткий обзор шаблона
Внутри шаблона есть несколько основных блоков — импорт нужных библиотек, загрузка модели для генерации изображений, настройка пайплайна и вывод «детища искусства».
На что стоит обратить внимание:
- model_id — переменная-ссылка на модель в Hugging Face, которую хотите использовать. Галерею каждой модели можно посмотреть на Civitai и в официальной библиотеке. Так, если хотите получить изображения в стиле Midjourney, используйте prompthero/openjourney. Если нужна модель, заточенная под портреты, — darkstorm2150/Protogen_v2.2_Official_Release, а под вайфы — hakurei/waifu-diffusion.
- pipe.to() — метод, с помощью которого можно выбрать, на каких ядрах запустить инференс модели. Если вы используете сервер с GPU, должно быть pipe.to("cuda"), если только процессорные мощности, то pipe.to("cpu").
Мы проверили скорость генерации изображений через модель darkstorm2150/Protogen_v2.2_Official_Release — на CPU и CUDA-ядрах. На процессоре инференс занимает примерно в 20 раз больше времени.
Если вы не хотите использовать серверы с видеокартами, попробуйте оптимизировать инференс на CPU. О том, какие инструменты можно использовать, рассказали по ссылке.
- pipe() — это функция, которая отвечает за генерацию изображений. С помощью специальных аргументов ее можно конфигурировать — например, настраивать количество размеры изображений, число итераций в инференсе, сам prompt и другое. Не забывайте, что работаете со Stable Diffusion-моделями — желательно разбираться в основных параметрах.
Обратите внимание на negative prompt — для некоторых моделей это важный параметр, который позволяет исключить большую долю странных генераций. А иногда эта разница не так заметна.
prompthero/openjourney, reference — шаблон в GitHub.
Что получилось
Отлично — теперь мы умеем подгружать модели Diffusers и генерировать собственные изображения.
Что крутого:
- Весь процесс от запуска сервера до генерации картинки занимает около 5 минут.
- Лимитов на количество генераций нет. Фактически, у нас готово окружение для тестирования моделей в режиме 24/7.
Используя дистрибутив DAVM не нужно тратить время на поиск, установку и настройку необходимых драйверов, разрешение конфликтов версий. Сборка готова к работе прямо «из коробки».
Теперь можно поделиться доступом к проекту с друзьями и коллегами. Это бывает полезно, если нужно протестировать, например, собственную модель в бою. Можно повторить за Midjourney и сделать многопользовательского чат-бота для общения с нейросетью. Например, через Telegram.
Создание Telegram-бота
Попробуем набросать «базовый» Telegram-интерфейс для работы с нашей нейросетью. Здесь можно позаимствовать best practices и реализовать ту самую команду — /imagine. Большего на первых порах и не нужно.
Единственное, что можно добавить кроме /imagine — кнопки (или команды) для конфигурирования pipe(), чтобы настраивать геометрию изображений, guidance scale и другие параметры. Но имеет ли это смысл, если можно удобно настраивать модель в предустановленном Jupiter Lab? Нет — поэтому остановимся на простом варианте.
Обработчик команды /imagine
После того, как вы зарегистрировали Telegram-бота в @BotFather и импортировали telebot, можно написать простой обработчик команды /imagine на стандартном message_handler.
Функция для генерации изображений
Обработчик message_handler проверяет, есть ли в сообщении пользователя prompt. Если находит — отправляет его генератору изображений, который не только отрисовывает, но и сохраняет результат в директиве images.
Готово — Telegram-бот работает, через него можно тестировать модели из библиотеки Diffusers. Даже с учетом того, что сейчас генерация не асинхронна и есть «строгая очередь» из пользовательских запросов, несколько человек могут работать с ботом спокойно.
Даже с учетом дополнительного функционала в виде Telegram-бота, процесс развертывания проекта занял около часа. Основные сложности возникают только с подбором моделей, их параметризацией и составлением prompt-запросов. Но разве не это делает процесс интересным?
Делайте форк нашего репозитория на GitHub, предлагайте свои улучшения и делитесь мнением в комментариях. А также подпишитесь на блог Selectel, чтобы всегда быть в курсе новостей и новых экспериментов в мире ML.
Спасибо за статью. Познавательно.
Аренда такого сервера 40к в месяц, правда. Для некоммерческого проекта "на поиграться" многовато. Хотя может кто-то знает, как это монетизировать...