![](https://habrastorage.org/webt/2n/no/gb/2nnogbtbz7havg2iekiqge7xc6e.png)
Привет, Хабр! Построить конвейерную ленту по генерации изображений не так сложно — мы доказали это в обзоре. Но как сохранить результаты? Ведь если вы захотите пересоздать виртуальную машину с нейронкой, на которой хранятся файлы, то окончательно их потеряете. Под катом рассказываем, как подключить ее к объектному хранилищу и хранить промпты в метаданных объектов.
В статье будем использовать готовый notebook-шаблон для работы с библиотекой Diffusers. Если вы уже знакомы с созданием виртуального сервера для ее работы и ключевыми преимуществами S3, то можете смело переходить к настройке хранилища.
Используйте навигацию, если не хотите читать текст полностью:
→ Особенности S3
→ Вкратце о DAVM
→ Создаем DAVM
→ Настраиваем S3
→ DAVM на практике
→ Подключаемся к S3
→ Заключение
Особенности S3
Сегодня S3-хранилище — это один из наиболее популярных сервисов облачного хранения данных. Технология позволяет работать с большим количеством информации любого типа и быстро масштабироваться. В числе ее преимуществ — автоматическое резервное копирование и возможность добавления метаданных к файлам.
С помощью метаданных можно удобно сортировать объекты по типу, дате создания и т. д. Находить и управлять объектами можно с помощью уникальных URL. Алгоритмы доступа здесь довольно простые. Даже если данных в объектном хранилище будет очень много, доступ к отдельным объектам вы получите также быстро. При этом в S3 можно хранить петабайты данных.
Хотя технология набирает популярность среди компаний и пользователей, есть нюансы. Для работы с хранилищем нужно специализированное программное обеспечение с правильной конфигурацией, а скорость доступа довольно ограничена в сравнении с другими типами хранилищ.
Следует исходить из задач, которые вы планируете решить с помощью сервиса. Так, к примеру, объектное хранилище не подходит для размещения базы данных. Среди распространенных сценариев использования S3 — хранение личной информации, бэкапирование, Big Data.
Другие подробности об S3 вы найдете в нашем обзоре.
![](https://habrastorage.org/webt/7b/kz/yr/7bkzyrfpd9tjqs29mng5smwbprq.png)
Вкратце о DAVM
Data Analytics Virtual Machine (DAVM) — виртуальный сервер с образом ОС и набором инструментов для анализа данных и машинного обучения. Вы можете кастомизировать DAVM под свои задачи и быстро пересоздать платформу, если что-то пошло не так. Для второго сценария особенно будет удобно хранить данные вне виртуального сервера. В этом случае подойдет хранилище S3 (объектное хранилище).
Образ DAVM разворачивается за несколько минут из панели управления. В нем используется Ubuntu 22.04, любое необходимое количество GPU, а также предустановлен готовый набор инструментов.
- JupyterLab — среда разработки для работы с Jupyter Notebooks, данными и кодом.
- Prefect — ПО для управления задачами по сбору, мониторингу и обработке данных.
- Apache Superset — веб-приложение для визуализации и исследования данных, создания дашбордов и отчетов.
- PostgreSQL — реляционная СУБД для хранения данных.
- Различные библиотеки для машинного обучения. Например, TensorFlow и PyTorch.
![](https://habrastorage.org/getpro/habr/post_images/eb4/695/dac/eb4695dac0c7cf1d020634c99149e4be.png)
Устройство виртуальной машины DAVM.
Внутри установлен Docker, где в контейнерах запущены Prefect, Superset, Keycloak и Jupyter Hub. Стоит отметить «отдельно стоящий» PostgreSQL, в связке с которым запущен Superset. Данные можно загрузить через Prefect в PostgreSQL, а затем переместить их в Superset.
Хранение можно организовать в рамках DAVM. Однако в таком случае есть риск потерять информацию в результате сбоя или пересоздания платформы. Лучше использовать S3 или облачные базы данных, к примеру, с PostgreSQL. Так будет возможность создать платформу заново, если что-то пойдет не так. Хранение данных станет более безопасным.
Полный список предустановленных библиотек и фреймворков, их версии и другие технические подробности о DAVM можно найти в документации продукта. Кастомизировать все компоненты платформы можно в зависимости от задач.
Создаем DAVM
За основу возьмем конфигурацию с видеокартой Tesla T4.
1. Переходим в раздел Облачная платформа внутри панели управления.
2. Выбираем пул ru-7a или ru-9a, создаем облачный сервер с дистрибутивом Ubuntu 22.04 LTS Machine Learning 64-bit и подходящей конфигурацией. Используем виртуальную машину с видеокартой NVIDIA Tesla® T4 16 ГБ.
![](https://habrastorage.org/getpro/habr/post_images/101/c2e/7b7/101c2e7b7224d432a4126e6001ee46f9.png)
3. Важно, чтобы сервер был доступен «из интернета», иначе подключиться с компьютера будет нельзя. Для этого выбираем новый публичный IP-адрес.
![](https://habrastorage.org/getpro/habr/post_images/593/13d/c5a/59313dc5a722fcd04b7e90f3c6734fc1.png)
4. Нажимаем Создать. Система загрузится в пределах пары минут. Чтобы настроить окружение, подключимся к серверу по SSH — тогда он покажет данные для авторизации в окружении DAVM. Команду для подключения можно найти во вкладке Конфигурация.
![](https://habrastorage.org/getpro/habr/post_images/0e6/f28/59a/0e6f2859a2d687216f5cbd36a79f606e.png)
Созданный сервер. Вкладка «Конфигурация».
5. Берем в терминале ссылку для подключения, логин и информацию о пароле для первого входа.
![](https://habrastorage.org/getpro/habr/post_images/72c/ae0/004/72cae0004dd2c46af8a8222c64f5457d.png)
Скриншот из терминала. Ссылка для подключения и данные для входа.
6. Переходим по ссылке и авторизуемся в DAVM. Теперь можно запустить Jupyter Lab, Keycloak, Prefect или Superset из браузера. В рамках статьи будем использовать только Jupyter Lab.
![](https://habrastorage.org/getpro/habr/post_images/f21/c3d/d5d/f21c3dd5d46f0eb454dd7a58cb1854a1.png)
Стартовая страница DAVM.
Настраиваем S3
1. В панели управления переходим в Объектное хранилище → Создать контейнер.
2. Выбираем Регион — Санкт-Петербург и Пул — ru-1.
3. Тип — публичный. Такой контейнер доступен без авторизации. Если нужно ограничить прямой доступ до файлов — подойдет приватный. Класс — стандартное хранение. Оптимальный выбор для работы с часто используемыми данными. Холодное хранение применяется для бэкапов, архивов и прочих важных данных с редким обращением.
4. Выключаем адресацию. Нажимаем Создать контейнер.
![](https://habrastorage.org/getpro/habr/post_images/6b0/041/b59/6b0041b5929401cc5f59002aa45b2b94.png)
Создание контейнера в панели управления.
Создаем сервисного пользователя
Чтобы взаимодействовать с S3 по API, следует создать сервисного пользователя.
1. Переходим во вкладку Управление доступом → Сервисные пользователи.
2. Нажимаем Добавить пользователя. Имя пользователя можем оставить по умолчанию, а пароль сгенерировать.
3. В поле Роль выбираем Администратор объектного хранилища.
4. После выбора нужного проекта нажимаем Добавить пользователя.
![](https://habrastorage.org/getpro/habr/post_images/238/c8a/238/238c8a238e7a654e6bc5fa7e9c8c09ae.png)
Добавление пользователя во вкладке «Управление доступом».
Получаем ключи
На один проект можно выпустить несколько ключей. Однако на каждый новый нужно создавать отдельный ключ.
1. Во вкладке Управление пользователями переходим к созданному пользователю.
2. В поле S3 ключи нажимаем Добавить ключ.
![](https://habrastorage.org/getpro/habr/post_images/b5d/1f7/146/b5d1f7146b50ddf1403cea63824cd6e2.png)
3. В окне Добавление S3 ключа выбираем наш проект, имя можно оставить по умолчанию. Нажимаем Сгенерировать.
![](https://habrastorage.org/getpro/habr/post_images/f89/b42/1f5/f89b421f57a7dc53927c7950538b1a83.png)
Видим, что сгенерировано два значения: Access key — идентификатор ключа, и Secret key — секретный ключ. Копируем и сохраняем ключ — после закрытия окна его нельзя будет просмотреть.
![](https://habrastorage.org/getpro/habr/post_images/cba/a98/1d8/cbaa981d8343f7cff12eb2ef24bd1209.png)
Теперь, когда мы создали и настроили S3 и DAVM, можно перейти к практике и организовать подключение между ними.
DAVM на практике
Для теста платформы возьмем готовый notebook-шаблон для работы с библиотекой Diffusers. Подробнее о применении мы уже рассказали в обзоре.
Diffusers — это библиотека от Hugging Face, которая позволяет работать с сотнями обученных Stable Diffusion-моделей для генерации изображений, аудио и даже объемных молекулярных структур. Ее можно использовать как для экспериментов с существующими моделями, так и для обучения своих.
Разворачиваем нейросеть для генерации изображений. Процесс занимает не более десяти минут, так как в DAVM уже установлены и настроены драйверы и необходимое ПО.
По умолчанию инференс модели запускаем на ядрах GPU. На мощностях CPU скорость генерации изображений займет значительно больше времени. Для удобства «общения» с нейросетью создали Telegram-бота. Пользователь может отправить запрос и быстро получить сгенерированное изображение. Саму модель можно настраивать через Jupiter Lab.
![](https://habrastorage.org/getpro/habr/post_images/efb/f93/4f9/efbf934f9dc695aec2a0a306aef74816.png)
Генерация изображений в чат-боте. На одно изображение уходит около 5-10 секунд.
Подключаемся к S3
С помощью коннектора
Для подключения к объектному хранилищу можно использовать коннектор S3 в DAVM. В поле Access Key ID вводим идентификатор ключа, а в Secret Access Key — секретный ключ. В поле Endpoint URL вводим ссылку — https://s3.storage.selcloud.ru. Нажимаем Connect. Готово — вы храните данные вне виртуальной машины, в отдельном и масштабируемом хранилище.
![](https://habrastorage.org/getpro/habr/post_images/120/309/554/1203095542953b2606b37e9eb48b7378.png)
Коннектор S3 в DAVM.
Однако способ может быть недостаточно гибким для некоторых задач. Допустим, вы хотите настроить подключение к S3 в проекте. Так вы сможете добавлять метаданные к файлам, прописывать сценарии чтения и записи и кастомизировать их под свои цели.
Еще один из многочисленных инструментов для работы S3 — утилита s3fs. Она позволяет использовать объектное хранилище как файловую систему на операционных системах Linux. Подробнее — в инструкции.
С помощью Jupyter Notebook
Рассмотрим подключение к S3-бакету в Jupyter Notebook. Бакет — это сущность для хранения объектов в S3.
1. Как и ранее, переходим в браузере по ссылке (<IP-виртуальной-машины>.pl.davm.selcloud.ru). Выбираем нужную иконку.
2. Импортируем комплект средств разработки (SDK) boto3, предназначенный для работы с AWS. Подробнее о библиотеке и ее использовании вы можете узнать в документации.
import boto3
Создаем сессию boto3 с указанием URL сервиса S3 для Selectel — https://s3.storage.selcloud.ru. 'your_access_key_id' и 'your_secret_access_key' — это наши учетные данные доступа к Selectel S3, их мы получили ранее.
session = boto3.session.Session()
s3 = session.client(
service_name='s3',
endpoint_url='https://s3.ru-1.storage.selcloud.ru',
aws_access_key_id='your_access_key_id',
aws_secret_access_key='your_secret_access_key'
)
Пример чтения файла из бакета:
bucket_name = 'your_bucket_name'
response = s3.list_objects_v2(Bucket=bucket_name)
for obj in response['Contents']:
key = obj['Key']
obj = s3.get_object(Bucket=bucket_name, Key=key)
body = obj['Body'].read()
print(f'Key: {key}, Body: {body}')
Соответственно, 'your_bucket_name' — имя нашего S3-бакета в Selectel.
Пример записи файла в бакет (метод upload_file):
user_image_path = f"./images/{user_id}.png"
if os.path.exists(user_image_path):
os.remove(user_image_path)
try:
image.save(user_image_path)
s3.upload_file(user_image_path, ‘your_bucket_name’, ‘your_file_name’, ExtraArgs={'Metadata':{'UserPrompt': user_prompt}})
return user_image_path
Здесь мы можем настроить запись метаданных (ExtraArgs). В случае с нейросетью-ботом будет удобно хранить пользовательские запросы. Вывести метаданные в консоли можно следующим способом:
metadata = s3.head_object(Bucket='your_bucket_name', Key=’your_file_name’)
print(metadata)
![](https://habrastorage.org/getpro/habr/post_images/30d/a52/5b0/30da525b0b31a0c708feb6032e47b241.png)
Хранение запроса пользователя в метаданных файла.
В каждом файле хранится запрос, на который было сгенерировано изображение. Сценариев применения метаданных множество. В случае с генерацией изображений это полезно для проведения тестов. Мы отслеживанием наименее удачные или спорные иллюстрации и запросы на них. Благодаря этому можно исключать подозрительные генерации на уровне модели и улучшать ее работу.
Заключение
S3 — удобный и функциональный инструмент для облачного хранения данных. Он предлагает высокую надежность, масштабируемость и гибкость, а также идеально подходит для хранения больших объемов данных.
Однако объектное хранилище — это не универсальное решение для любых целей. Так, к примеру, оно не подходит для размещения баз данных. Прежде чем выбрать S3 для своего проекта, необходимо тщательно оценить его возможности и ограничения. Для более детального изучения возможностей S3 рекомендуем ознакомиться с нашим обзором и документацией по работе с S3-хранилищем Selectel.
Подключайтесь к GitHub-репозиторию проекта. Оставляйте issues, делайте «форки» и используйте его как референс, если хотите поднять похожий проект. Делитесь в комментариях опытом работы с S3 и предложениями по улучшению!