Развертывание сервиса из модели ONNX
DataSphere позволяет разворачивать и эксплуатировать сервисы на основе обученной в проекте модели.
В этом практическом руководстве вы развернете сервис из модели в формате ONNX. Модель fast-neural-style-mosaic-onnx
преобразует изображение в соответствии с заданным стилем. Модель взята из хранилища моделей ONNX
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Перед началом работы нужно зарегистрироваться в Yandex Cloud, настроить сообщество и привязать к нему платежный аккаунт:
- На главной странице DataSphere
нажмите Попробовать бесплатно и выберите аккаунт для входа — Яндекс ID или рабочий аккаунт в федерации (SSO). - Выберите организацию Yandex Cloud Organization, в которой вы будете работать в Yandex Cloud.
- Создайте сообщество.
- Привяжите платежный аккаунт к сообществу DataSphere, в котором вы будете работать. Убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его в интерфейсе DataSphere.
Необходимые платные ресурсы
В стоимость развертывания сервиса из модели входят:
- плата за постоянно запущенные инстансы ноды (см. тарифы DataSphere);
- плата за запуск ячеек с кодом для проверки работы развернутого сервиса.
Подготовьте инфраструктуру
Войдите в консоль управления
Если у вас есть активный платежный аккаунт, на странице облака
Примечание
Если вы работаете с Yandex Cloud через федерацию удостоверений, вам может быть недоступна платежная информация. В этом случае обратитесь к администратору вашей организации в Yandex Cloud.
Создайте каталог
Создайте каталог, в котором вы развернете всю необходимую инфраструктуру, а ваш сервис будет хранить логи.
Примечание
В примере инфраструктура Yandex Cloud и развернутый сервис работают в одном каталоге Yandex Cloud, однако это не обязательно.
- В консоли управления
выберите облако и нажмите кнопку Создать каталог. - Введите имя каталога, например
data-folder
. - Нажмите кнопку Создать.
Создайте сервисный аккаунт для проекта DataSphere
-
Перейдите в каталог
data-folder
. -
В списке сервисов выберите Identity and Access Management.
-
Нажмите кнопку Создать сервисный аккаунт.
-
Введите имя сервисного аккаунта, например
datasphere-sa
. -
Нажмите Добавить роль и назначьте сервисному аккаунту роли:
vpc.user
— для работы с сетью DataSphere.datasphere.user
— чтобы отправлять запросы в ноду.
-
Нажмите кнопку Создать.
Создайте модель
Модель fast-neural-style-mosaic-onnx
— это одна из моделей переноса стиля, разработанная для преобразования изображения под стиль другого изображения.
-
Откройте проект DataSphere:
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - Нажмите кнопку Открыть проект в JupyterLab и дождитесь окончания загрузки.
- Откройте вкладку с ноутбуком.
-
-
Установите модуль
onnx
:%pip install onnx
-
Скачайте файл
mosaic.onnx
:!wget -O "mosaic.onnx" "https://github.com/onnx/models/raw/main/validated/vision/style_transfer/fast_neural_style/model/mosaic-8.onnx"
-
Загрузите модель в переменную и проверьте ее согласованность:
import onnx onnx_model = onnx.load("mosaic.onnx") onnx.checker.check_model(onnx_model)
-
На панели справа выберите
. В появившемся окне нажмите Создать модель. -
Выберите имя переменной, из которой вы хотите создать модель.
-
Введите имя модели, например
onnx-model
. -
Нажмите кнопку Создать.
Создайте ноду
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - В правом верхнем углу нажмите кнопку Создать ресурс. Во всплывающем окне выберите Нода.
- В поле Имя введите имя ноды.
- В блоке Тип укажите тип ресурса — Модель.
- В поле Модели выберите модель
onnx-model
. - В блоке Каталог выберите каталог
data-folder
. - В блоке Обеспечение выберите конфигурацию вычислительных ресурсов инстанса, зону доступности и идентификатор подсети в которых будет размещен инстанс.
- В блоке Список управления доступом (ACL) нажмите кнопку
Добавить ACL и укажите идентификаторы каталогов, из которых можно будет подключаться к ноде. По умолчанию указывается идентификатор каталога пользователя, создающего ноду. - Нажмите кнопку Создать.
Проверьте работу развернутого сервиса
-
Создайте секреты для проверки работы ноды:
IAM_SECRET
со значением IAM-токена.NODE_ID
с идентификатором ноды.FOLDER_ID
с идентификатором каталога.
-
Откройте проект DataSphere:
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - Нажмите кнопку Открыть проект в JupyterLab и дождитесь окончания загрузки.
- Откройте вкладку с ноутбуком.
-
-
Установите модуль
tritonclient
:%pip install tritonclient[http]
-
Импортируйте необходимые библиотеки:
import numpy as np import matplotlib.pyplot as plt from PIL import Image import requests import urllib import os %matplotlib inline
-
Подготовьте изображение:
url, filename = ("https://github.com/pytorch/hub/raw/master/images/dog.jpg", "dog.jpg") try: urllib.URLopener().retrieve(url, filename) except: urllib.request.urlretrieve(url, filename) # loading input and resize if needed onnx_image = Image.open(filename) size_reduction_factor = 5 onnx_image = onnx_image.resize((224, 224)) # Preprocess image x = np.array(onnx_image).astype('float32') x = np.transpose(x, [2, 0, 1]) onnx_input = np.expand_dims(x, axis=0) plt.figure(figsize=(15, 15)) plt.imshow(onnx_image) plt.show()
-
Аутентифицируйтесь, используя ранее созданные секреты:
IAM_SECRET = os.environ['IAM_SECRET'] NODE_ID = os.environ['NODE_ID'] FOLDER_ID = os.environ['FOLDER_ID'] headers = { "Authorization": f"Bearer {IAM_SECRET}", # get IAM token from secrets "x-node-id": f"{NODE_ID}", # sample node "x-folder-id": f"{FOLDER_ID}" # node folder ID }
-
Отправьте тестовые запросы, подставив идентификатор модели:
import tritonclient.http as httpclient model="<идентификатор_модели_в_DataSphere>" # request model config with model ready status print(f"""model_name: {model},\n model_ready: {triton_client.is_model_ready(model_name=model, headers=headers)},\n model_config: {triton_client.get_model_config(model_name=model, headers=headers)}\n""")
-
Подготовьте изображение и отправьте запрос в ноду:
payload = httpclient.InferInput("input1", list(onnx_input.shape), "FP32") payload.set_data_from_numpy(onnx_input, binary_data=False) results = triton_client.infer(model, inputs=[payload], headers=headers)
-
Получите результат преобразования изображения:
output = results.as_numpy("output1")[0] output = np.clip(output, 0, 255) output = output.transpose(1,2,0).astype("uint8") img = Image.fromarray(output) img
В ответе вы получите преобразованное изображение.
Как удалить созданные ресурсы
При развертывании и эксплуатации моделей вы платите за время работы каждого инстанса ноды — от момента запуска до момента удаления.
Если развернутый сервис вам больше не нужен, удалите ноду.