Запуск вычислений в DataSphere с помощью API
В Yandex DataSphere
В практическом руководстве на примере простой сверточной нейронной сети CNN
Если вы хотите развернуть сервис, который будет возвращать результаты по API, см. Развертывание сервиса на основе Docker-образа с FastAPI.
- Подготовьте инфраструктуру.
- Подготовьте ноутбуки.
- Обучите нейросеть.
- Загрузите архитектуру модели и веса.
- Создайте Cloud Functions.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Перед началом работы нужно зарегистрироваться в Yandex Cloud, настроить сообщество и привязать к нему платежный аккаунт:
- На главной странице DataSphere
нажмите Попробовать бесплатно и выберите аккаунт для входа — Яндекс ID или рабочий аккаунт в федерации (SSO). - Выберите организацию Yandex Cloud Organization, в которой вы будете работать в Yandex Cloud.
- Создайте сообщество.
- Привяжите платежный аккаунт к сообществу DataSphere, в котором вы будете работать. Убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его в интерфейсе DataSphere.
Необходимые платные ресурсы
В стоимость реализации регулярных запусков входят:
- плата за использование вычислительных ресурсов DataSphere;
- плата за количество вызовов функции Cloud Functions.
Подготовьте инфраструктуру
Войдите в консоль управления
Если у вас есть активный платежный аккаунт, на странице облака
Примечание
Если вы работаете с Yandex Cloud через федерацию удостоверений, вам может быть недоступна платежная информация. В этом случае обратитесь к администратору вашей организации в Yandex Cloud.
Создайте каталог
- В консоли управления
выберите облако и нажмите кнопку Создать каталог. - Введите имя каталога, например,
data-folder
. - Нажмите кнопку Создать.
Создайте сервисный аккаунт для проекта DataSphere
Для доступа к проекту DataSphere из функции Cloud Functions вам понадобится сервисный аккаунт с ролью datasphere.community-projects.editor
.
- В консоли управления
перейдите в каталогdata-folder
. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например,
datasphere-sa
. - Нажмите Добавить роль и назначьте сервисному аккаунту роль
datasphere.community-projects.editor
. - Нажмите кнопку Создать.
Добавьте сервисный аккаунт в проект
Чтобы сервисный аккаунт мог запускать проект DataSphere, добавьте его в список участников проекта:
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - На вкладке Участники нажмите Добавить участника.
- Выберите аккаунт
datasphere-sa
и нажмите Добавить.
Подготовьте ноутбуки и архитектуру нейросети
Склонируйте Git-репозиторий, в котором находятся ноутбуки с примерами обучения и тестирования модели машинного обучения:
- В верхнем меню нажмите Git и выберите Clone.
- В открывшемся окне введите URI репозитория
https://github.com/yandex-cloud-examples/yc-datasphere-batch-execution.git
и нажмите кнопку Clone.
Дождитесь окончания клонирования, это может занять некоторое время. Папка cклонированного репозитория появится в разделе
В репозитории содержатся два ноутбука и архитектура нейросети:
-
train_classifier.ipynb
— для скачивания обучающей выборки датасетаCIFAR10
и обучения простой нейронной сети; -
test_classifier.ipynb
— для тестирования модели; -
my_nn_model.py
— архитектура нейросети. Для классификации на вход нейросети подаются трехканальные изображения. Она содержит два сверточных слоя сmaxpool
слоем между ними и три линейных слоя:import torch.nn as nn import torch.nn.functional as F import torch class Net(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = torch.flatten(x, 1) # flatten all dimensions except batch x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x
Обучите нейросеть
В ноутбуке train_classifier.ipynb
вы скачаете обучающую выборку датасета CIFAR10
и обучите простую нейронную сеть. Веса обученной модели сохраняются в хранилище проекта под названием cifar_net.pth
.
-
Откройте проект DataSphere:
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - Нажмите кнопку Открыть проект в JupyterLab и дождитесь окончания загрузки.
- Откройте вкладку с ноутбуком.
-
-
Импортируйте библиотеки, необходимые для обучения модели:
import torch import torchvision import torchvision.transforms as transforms import torch.optim as optim from my_nn_model import Net
-
Загрузите датасет
CIFAR10
для обучения модели. Изображения в датасете относятся к 10 категориям:transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) batch_size = 4 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=2) classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
-
Выведите на экран примеры изображений, которые содержатся в датасете:
import matplotlib.pyplot as plt import numpy as np def imshow(img): img = img / 2 + 0.5 # unnormalize npimg = img.numpy() plt.imshow(np.transpose(npimg, (1, 2, 0))) plt.show() dataiter = iter(trainloader) images, labels = next(dataiter) imshow(torchvision.utils.make_grid(images)) print(' '.join(f'{classes[labels[j]]:5s}' for j in range(batch_size)))
-
Создайте функцию потерь и оптимизатор, необходимые для обучения нейросети:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') net = Net() net.to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
-
Запустите процесс обучения на 5 эпохах:
for epoch in range(5): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data[0].to(device), data[1].to(device) optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 2000 == 1999: print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}') running_loss = 0.0 print('Finished Training')
-
Сохраните полученную модель на проектный диск:
torch.save(net.state_dict(), './cifar_net.pth')
Загрузите архитектуру модели и веса
В ноутбуке test_classifier.ipynb
вы загрузите архитектуру модели и веса, созданные во время работы файла train_classifier.ipynb
. Загруженная модель используется для прогнозов на тестовой выборке. Результаты прогноза сохраняются в файле test_predictions.csv
.
-
Откройте проект DataSphere:
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - Нажмите кнопку Открыть проект в JupyterLab и дождитесь окончания загрузки.
- Откройте вкладку с ноутбуком.
-
-
Импортируйте библиотеки, необходимые для работы с моделью и создания прогнозов:
import torch import torchvision import torchvision.transforms as transforms from my_nn_model import Net import pandas as pd
-
Подготовьте объекты, которые позволят обращаться к тестовой выборке:
transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) batch_size = 4 testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=2) classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
-
Определите конфигурацию ресурсов, на которой будет выполняться модель — СPU или GPU:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
-
Загрузите веса обученной модели и сделайте прогнозы на тестовой выборке:
net = Net() net.to(device) net.load_state_dict(torch.load('./cifar_net.pth')) predictions = [] predicted_labels = [] with torch.no_grad(): for data in testloader: images, labels = data[0].to(device), data[1].to(device) outputs = net(images) _, predicted = torch.max(outputs.data, 1) predictions.append(predicted.tolist()) predicted_labels.append([classes[predicted[j]] for j in range(batch_size)])
-
Сохраните прогнозы в формате
pandas.DataFrame
:final_pred = pd.DataFrame({'class_idx': [item for sublist in predictions for item in sublist], 'class': [item for sublist in predicted_labels for item in sublist]})
-
Сохраните прогнозы модели в файл:
final_pred.to_csv('/home/jupyter/datasphere/project/test_predictions.csv')
Создайте Cloud Functions
Чтобы запускать исполнение ячеек, не открывая JupyterLab, вам понадобится Cloud Functions, которая будет инициировать запуск вычислений в ноутбуке по API.
- В консоли управления
перейдите в каталог, в котором хотите создать функцию. - Выберите сервис Cloud Functions.
- Нажмите кнопку Создать функцию.
- Введите имя функции, например,
ai-function
. - Нажмите кнопку Создать функцию.
Создайте версию Cloud Functions
Версия содержит код функции, параметры запуска и все необходимые зависимости.
-
В консоли управления
перейдите в каталог, в котором находится функция. -
Выберите сервис Cloud Functions.
-
Выберите функцию, версию которой хотите создать.
-
В разделе Последняя версия нажмите кнопку Создать в редакторе.
-
Выберите среду выполнения Python. Не выбирайте опцию Добавить файлы с примерами кода.
-
Выберите способ Редактор кода.
-
Нажмите Создать файл и введите имя файла, например
index
. -
Введите код функции, подставив идентификатор вашего проекта и абсолютный путь к ноутбуку в проекте:
import requests def handler(event, context): url = 'https://datasphere.api.cloud.yandex.net/datasphere/v2/projects/<идентификатор_проекта>:execute' body = {"notebookId": "/home/jupyter/datasphere/project/test_classifier.ipynb"} headers = {"Content-Type" : "application/json", "Authorization": "Bearer {}".format(context.token['access_token'])} resp = requests.post(url, json = body, headers=headers) return { 'body': resp.json(), }
Где:
<идентификатор_проекта>
— идентификатор проекта DataSphere, который расположен на странице проекта под названием.notebookId
— абсолютный путь к ноутбуку в проекте.
-
В блоке Параметры задайте параметры версии:
- Точка входа:
index.handler
. - Сервисный аккаунт:
datasphere-sa
.
- Точка входа:
-
В правом верхнем углу нажмите Сохранить изменения.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: