How to: Yandex Datasphere
⏱ Время чтения текста – 10 минутYandex DataSphere — среда для ML-разработки, которая сочетает в себе привычный интерфейс Jupyter Notebook, технологию бессерверных вычислений и возможность бесшовного использования разных конфигураций вычислительных ресурсов.
Большую часть информации, которой мы с вами поделимся, мы почерпнули из закрытого практикума, который проводила команда Яндекса, куда был также приглашен спикер Александр Волков из компании Glowbyte. В процессе работы мы опирались на запись практикума, который был посвящен нюансам работы в Yandex DataSphere, а также задавали вопросы Александру и специалистам Яндекса напрямую, когда заходили в тупик и нуждались в помощи профессионала.
Теперь, пройдя долгий и сложный путь от задумки до реализации, мы готовы рассказать, как задеплоить модель с помощью одного из сервисов Yandex.Cloud — DataSphere.
Создание проекта и ноутбука
- Для начала, создаем проект DataSphere в Yandex.Cloud.
- В проекте создаем ноутбук.
- В целом, работа с ноутбуками в DataSphere будет интуитивно понятна, если вы уже сталкивались, например, с Jupyter Notebook. Стоит лишь отметить, что можно выбрать конфигурацию машины, на которой будет работать ваш ноутбук. По дефолту стоит самая простая.
Еще, в начале использования сервиса важно понимать, как происходит тарификация. Если коротко, то размер оплаты зависит от времени использования сервиса и от мощности выбранной машины. При прогоне ячеек учитывается только время, затраченное на вычисления, при развертывании — время от создания деплоя до его удаления (даже если сервис простаивает). После регистрации Yandex.Cloud предлагает пробный период, которого вполне хватит для тестовых проектов. А дальше, конечно, придется платить.
Загрузка модели
Мы будем использовать модель-заглушку для демонстрации работоспособности деплоя, но для начала нам хотелось бы отдельно остановиться на нюансах загрузки обученной модели в проект DataSphere.
- Можно воспользоваться, например, Яндекс.Диском. Для этого надо зарегистрировать приложение в Яндекс ID, после запомнить его ID и пароль.
- Для безопасности пароль можно положить в “секреты проекта”.
- Для загрузки файлов модели можно воспользоваться следующим кодом:
Если же необходимые вам файлы лежат в Github-репозитории, то все еще проще — надо только выполнить в ноутбуке команду:!mkdir model import os from cloud_ml.storage.api import Storage disk = Storage.ya_disk(application_id=<your-app-id>, application_secret=os.environ[<your-secret-name>]) disk.get_dir(<path-to-your-model-folder-at-ydisk>, './model')
!git clone ‘<github-repository-url>’
Код модели
Давайте сделаем простой генератор случайных целых чисел, принимающий на вход границы:
input_data = {'left_bound': 1, 'right_bound': 5}
from random import randint
def generate_value(input_data):
return {'generated_value': randint(input_data['left_bound'],
input_data['right_bound'])}
output_data = generate_value(input_data)
Первую строку вынесем в отдельную ячейку (это нужно для деплоя).
При необходимости, вы можете загрузить специальные библиотеки/версии библиотек с помощью команды %pip install...
Деплой
- Для начала, нужно создать Docker-образ. Стоит отметить несколько моментов:
- Build path — это необязательное поле, но при этом его значение не выставлено по дефолту, так что советуем указать хотя бы ‘.’.
- Docker file будет сгенерирован за вас, однако, вы можете его дополнить так:
- Скопировать файлы из своего проекта в Docker-образ.
Например, команда ADD model model скопирует файлы из папки model (первый аргумент) в вашем проекте в директорию /model/ (первый слэш важен!) в Docker-образе (второй аргумент). Команду стоит прописать вне блока RUN\.
- Скопировать файлы из своего проекта в Docker-образ.
- Добавить установку необходимых вам библиотек с помощью команды pip install … &&\ (прописать это нужно внутри блока RUN\).
- Затем нужно создать реестр для хранения Docker-образов (если у вас его еще нет). Для этого переходим в рабочий каталог в облаке, выбираем сервис Container Registry и там создаем реестр.
- Далее нужно провести аутентификацию в Container Registry (если вы этого еще не сделали). Это можно сделать разными способами, которые описаны в документации.
Мы воспользуемся способом аутентификации через сервисный аккаунт с помощью авторизованных ключей. Не забудьте его создать дополнительно, если решите использовать тот же способ. Процесс аутентификации достаточно прост:
- Сначала нужно сгенерировать ключи с помощью Yandex.Cloud CLI:
yc iam key create --service-account-name <service-account-name> -o key.json
- Сначала нужно сгенерировать ключи с помощью Yandex.Cloud CLI:
- Затем провести авторизацию с помощью этих ключей (Docker должен быть запущен):
cat key.json | docker login --username json_key --password-stdin cr.yandex
- Далее нужно записать содержимое файла key.json в “секрет проекта”.
- После этого можно запушить Docker-образ в реестр. Для этого нужно выполнить следующую команду в ноутбуке (да-да, решетка в начале, все верно):
#!:docker-publish <datasphere-image-name>:<datasphere-image-tag> cr.yandex/<cloud-registry-path>:<tag> Где: <datasphere-image-name> – Репозиторий, указанный при создании Docker-образа <datasphere-image-tag> – Тег, указанный при создании Docker-образа <cloud-registry-path> – Идентификатор реестра, который можно посмотреть в Container Registry <tag> – Тег, который вы можете придумать сами
- Вам предложат ввести Registry username и Secret name of password. Если вы проводили аутентификацию тем способом, что был описан выше, то сначала нужно ввести json_key, а затем название секрета, в котором было сохранено содержимое файла key.json. После этого в реестре должен появиться ваш загруженный образ.
- Остается создать ноду из ячейки с кодом.
Важные моменты:- Прогоните все необходимые ячейки с кодом перед сохранением контрольной точки.
- Если вам нужна определенная конфигурация машины, пропишите это в ячейке, которую будете деплоить, например #!g1.1 (иначе будет использоваться дефолтная конфигурация c1.4).
- Для нашего примера при создании ноды в Output variables необходимо указать name: output_data, type: dict. Аналогично для Input variables.
- Необходимо указать Kernel Docker Image
- Image path — путь до загруженного в реестр образа (можно нажать на тег образа в реестре, и путь будет скопирован).
- Username и Password secret — то, что мы указывали, когда пушили образ в реестр.
- После создания у ноды должен быть статус Active, но придется немного подождать, пока можно будет к ней обращаться — в ноде должен быть указан инстанс со статусом HEALTHY (или несколько статусов, если вы выбрали такую конфигурацию).
Работа с командной строкой
Работа с сервисными аккаунтами
Обращение к модели
- Обращаться к ноде можно с помощью IAM-токена или API-ключа.
Пример кода для обращения к ноде можно посмотреть в GitHub
Стоит отметить, что в функции call_node есть небольшой дефект: переменная data должна заполняться следующим образом:
Значение для заполнения переменной node_id можно найти сразу после имени ноды, если выбрать ее из списка на вкладке Nodes. folder_id — идентификатор каталога, в котором был создан проект.data = { "folder_id": folder_id, "node_id": node_id, "input": {'input_data': input_params} }
- Если вам не надо менять окружение, загруженное в Docker-образ, то вы можете задеплоить другой код, т. е. повторно выполнить только пункт 6 предыдущего раздела.