Масштабирование градиента с помощью GPU-дроплетов и сетевой инфраструктуры
Введение
Вы когда-нибудь пробовали генерировать изображения с помощью ИИ?
Если у вас есть, вы знаете, что ключом к хорошему изображению является хороший подробный запрос.
А я плохо справляюсь с такими детализированными визуальными запросами, поэтому полагаюсь на большие языковые модели, чтобы сгенерировать детализированный запрос, а затем использовать его для создания отличных изображений. Вот несколько примеров запросов и изображений, которые я смог сгенерировать:
Создайте потрясающий вид на воздушный Бенгалуру, Индия, с названием города, написанным жирным золотым шрифтом в верхней части изображения, на фоне видимого силуэта города и холмов Нанди.
Промпт: Создайте изображение знакового здания Видхана Соуда в Бангалоре, Индия, с названием города, написанным современным шрифтом без засечек внизу изображения, в элегантном и минималистичном стиле.
Запрос: Создайте изображение оживленного уличного рынка в Бангалоре, Индия, с названием города, написанным игривым курсивом над сценой, в теплом и привлекательном стиле.
Для достижения этих результатов мы используем модель Flux.1-schnell для генерации изображений и модель Llamma 3.1 — 8B — Instruct для генерации подсказок. Обе из них размещены на одной единственной машине H100 с помощью MIG (подробности позже).
Этот блог — не просто еще один учебник по генерации изображений. Наша цель — создать масштабируемую, безопасную и доступную (и недорогую) архитектуру ИИ.
Представьте себе бизнес-сценарий, в котором глобальная платформа электронной торговли требует быстрой кастомизации изображений для пользователей или контентная платформа, предоставляющая текст, сгенерированный ИИ по запросу, на различных континентах.
Такая настройка создаёт множество трудностей для разработчика. Пример:
- Графические процессоры внушают страх и дорогие
- Инструменты градиента являются передовыми, и каждый инструмент имеет специфические требования к настройке.
- Надежное соединение серверов backend с серверами Gradient
- Маршрутизация пользователей, распределенных по всему миру, к ближайшему серверу и т.д.
Эта презентация должна дать вам отправную точку для решения каждой проблемы здесь.
Предварительные условия
Перед тем как приступить к добавлению демонстрации, убедитесь, что у вас есть следующее:
- Аккаунт DigitalOcean.
- Базовые знания о графических процессорах (GPU), облачной сети, VPC и концепциях балансировки нагрузки.
- Базовое знакомство с Bash, Docker, Python.
- Предоставлен доступ HuggingFace к генерации изображений с моделью Flux.1
- Предоставлен доступ к модели Llama 3.1-8b-Instruct на HuggingFace
- vLLM — это быстрая и простая в использовании библиотека для вывода и обслуживания LLM.
Практическое руководство
Высокий уровень проектирования
Чтобы это сделать возможным, мы разработали распределённую архитектуру с использованием инфраструктуры DigitalOcean. Мы начинаем с глобального балансировщика нагрузки (GLB), чтобы управлять входящими запросами, обеспечивая минимальную задержку для пользователей из любого региона.
Следующим у нас есть легкие приложения для генерации изображений, развернутые в ключевых регионах — Лондоне, Нью-Йорке и Сиднее, каждое из которых имеет свой кеш и готово подключаться к нашим ресурсам GPU по мере необходимости. Наконец, все эти компоненты безопасно связываются через VPC Peering, передавая сложные задачи обратно в наш мощный GPU H100 в Торонто, где происходит магия генерации подсказок и изображений.
Компоненты
Легковесное приложение для генерации изображений
Приложение для генерации изображений — это простое приложение на Python Flask с тремя основными компонентами:
-
Раздел обнаружения местоположения: Этот компонент делает фиктивный запрос из браузера на сервер, чтобы определить местоположение пользователя (город и страна) и узнать, какой регион сервера обрабатывает запрос. Эта информация отображается пользователю и помогает оптимизировать создание подсказок и изображений, как мы объясним более подробно позже.
-
Секция выпадающего меню запросов: После определения местоположения пользователя, приложение сначала проверяет кэш на наличие существующих запросов, связанных с этим местоположением. Если в кэше находятся подходящие запросы, они немедленно отображаются в выпадающем меню, позволяя пользователю выбрать запрос для генерации изображения. Если кэшированных запросов нет, приложение отправляет запрос к LLM (Большой Языковой Модели) для генерации новых запросов, которые затем кэшируются для будущего использования и появляются в выпадающем меню для выбора пользователем.
-
Секция сгенерированного изображения: Когда пользователь выбирает запрос, приложение сначала проверяет, есть ли сгенерированное изображение для этого конкретного запроса, уже кэшированное на диске. Если кэшированное изображение существует, оно загружается напрямую с диска, что обеспечивает более быстрое время отклика. Если кэшированного изображения нет, приложение делает запрос к API для генерации нового изображения, которое затем кэшируется для будущих запросов и отображается пользователю.
Компонент GPU MIG
MIG (многоинстанционная GPU) — это функция графических процессоров NVIDIA, таких как H100, которая позволяет одному физическому графическому процессору быть разделенным на несколько независимых инстанций. Каждая инстанция, называемая MIG-срезом, работает как полностью изолированный графический процессор со своими вычислительными, памятью и пропускной способностью. Этот подход не только оптимизирует использование графического процессора, но также позволяет развернуть как модели генерации изображений, так и модели генерации подсказок бок о бок.
Пошаговая настройка
Запустите GPU Droplet: Начните с создания GPU Droplet на DigitalOcean с одной H100 GPU с предустановленным образцом ОС для разработки ML.
Включите MIG на H100 GPU: Как только GPU Droplet будет запущен, включите режим MIG (мульти-инстанс GPU) на H100. MIG позволяет разделить GPU на несколько более мелких экземпляров GPU, каждый из которых изолирован от других. Эта изоляция имеет решающее значение для одновременного выполнения различных моделей без вмешательства.
sudo nvidia-smi -i 0 -mig 1
Выберите профиль MIG и создайте экземпляры: С включенным MIG выберите профиль, который соответствует требованиям каждой модели, которую вы планируете запустить.
nvidia-smi mig -lgip # will list all the profiles
Например
sudo nvidia-smi mig -cgi 9,9 -C
Эта команда создает 2 экземпляра MIG с профилем, предоставляющим 40 ГБ памяти, чего должно быть достаточно для обеих моделей. Ниже приведенный код выведет все идентификаторы экземпляров MIG.
nvidia-smi -L
Настройка Docker-контейнеров на каждом экземпляре MIG: Для каждого экземпляра MIG запустите отдельный Docker-контейнер с соответствующей моделью. Эта настройка включает в себя загрузку и запуск двух Docker-контейнеров для моделей: один для генерации изображений (Flux.1-schnell) и один для генерации подсказок (Llama 3.1 через vLLM).
Развертывание Flux.1-schnell для генерации изображений: Мы использовали метатонические изображения и код для развертывания Docker-образа Flux.1.
Clone the repo git clone https://github.com/matatonic/openedai-images-flux cd openedai-images-flux Copy Config file cp config.default.json config/config.json Run the docker image sudo docker run -d -e HUGGING_FACE_HUB_TOKEN="<HF_READ_TOKEN>" --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=<MIG_INSANCE_ID> -v ./config:/app/config -v ./models:/app/models -v ./lora:/app/lora -v ./models/hf_home:/root/.cache/huggingface -p 5005:5005 ghcr.io/matatonic/openedai-images-flux
Разверните Llama 3.1 с помощью vLLM для генерации подсказок: Скачайте и запустите Docker-контейнер для модели генерации подсказок с использованием vLLM.
sudo docker run -d --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=<MIG_INSANCE_ID> -v ~/.cache/huggingface:/root/.cache/huggingface -e HUGGING_FACE_HUB_TOKEN="<HF_READ_TOKEN>" -p 8000:8000 --ipc=host vllm/vllm-openai:latest --model meta-llama/Meta-Llama-3.1-8B-Instruct
Доступ к модели и связь:
- Каждый контейнер доступен через назначенные порты, что позволяет экземплярам приложения для генерации изображений подключаться и отправлять запросы как к модели изображения (Flux.1-schnell), так и к модели подсказки (Llama 3.1) по мере необходимости.
- Разделение MIG обеспечивает эффективность и одновременную работу обеих моделей, используя ресурсы GPU, не мешая друг другу.
Региональные приложения
Мы настроили легкие приложения в регионах (Лондон, Нью-Йорк, Сидней), чтобы обрабатывать запросы пользователей локально, кешируя часто запрашиваемые подсказки и изображения для более быстрого ответа.
- Сначала создайте Дроплеты в одном регионе через раздел Дроплеты на панели управления DO.
- Подключитесь по SSH и настройте код. Ради скорости я уже создал контейнер, так что все, что нам нужно, это убедиться, что у нас есть доступ к реестру контейнеров DO и загрузить изображение.
Login to docker registry sudo docker login registry.linux-console.net Pull the container sudo docker pull registry.linux-console.net/<cr_name>/city-image-generator:v2
- На этом этапе я сделаю снимок дроплета и сделаю его доступным для других регионов, в которые я планирую развернуть приложение.
- Вернитесь к капле и запустите контейнер
Run the Container sudo docker run -d -p 80:80 registry.linux-console.net/<cr_name>/city-image-generator:v2
- Теперь создайте другие капли в других регионах, используя снимок, и запустите контейнер.
VPC пиринг
VPC Peering обеспечивает безопасное, с низкой задержкой общение между региональными экземплярами приложений и GPU сервером в Торонто по частной сети.
- Перейдите в раздел Сеть на панели управления DigitalOcean.
- Вы должны увидеть
default vpcдля каждого региона (например, Лондон, Нью-Йорк, Сидней и Торонто). - Используйте функцию VPC Peering для установления соединений между VPC Торонто и каждым региональным VPC.
- Проверьте подключение, используя простые сетевые инструменты, такие как
pingилиcurl, с региональных серверов приложений на GPU-сервер.
Глобальный балансировщик нагрузки (ГБН)
GLB распределяет входящие запросы пользователей на ближайший региональный экземпляр приложения, оптимизируя задержку и улучшая пользовательский опыт.
- В разделе Балансировщики нагрузки сетевой части панели управления создайте новый Глобальный балансировщик нагрузки.
- Добавьте ваши региональные экземпляры приложения в качестве целевых серверов.
- Настройте проверки состояния, таймауты и другие дополнительные параметры.
- Создать Балансировщик нагрузки
С установленными всеми компонентами ваша архитектура полностью функционирует, обеспечивая масштабируемые и безопасные сервисы Gradient. Графический интерфейс DigitalOcean упрощает большую часть настройки, позволяя вам сосредоточиться на оптимизации производительности и функциональности ваших моделей ИИ.
Заключение
Этот демонстрационный пример является практической отправной точкой для бизнеса/разработчиков, исследующих распределенные решения на основе градиентов, такие как платформы электронной коммерции, генерирующие персонализированный контент, или контентные платформы на основе ИИ, обслуживающие глобальную аудиторию. Используя продукты DigitalOcean, эта настройка демонстрирует, как сбалансировать масштабируемость, безопасность и эффективность затрат при развертывании передовых ИИ-сервисов.
Ссылки
Вы можете узнать больше о технологиях, использованных в этой демонстрации, здесь:
- Многоэкземплярные графические процессоры Nvidia (MIG)
- Когда использовать MIG?
- Модели Flux.1
- Модели Llama 3.1






Добавить комментарий