Работа с датасетами
Для работы с большими объемами данных в DataSphere используйте датасеты. Основные операции с датасетами выполняются в коде ячеек с помощью служебных команд #pragma dataset
.
Создать и инициализировать датасет
Создать и инициализировать датасет можно из ячейки с кодом на Bash или Python, содержащей команду #pragma dataset init
. При инициализации укажите уникальное в пределах проекта имя датасета и размер диска, на котором будет размещен датасет. Требования к имени датасета:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
Примечание
Во время инициализации датасета будет выделен весь запрошенный объем дискового хранилища, однако часть этого объема будет занята файловой системой. Указывайте размер датасета в ГБ, округляя до целого в большую сторону.
Совет
Чем больше выделенный для датасета диск, тем выше скорость чтения данных.
Во время инициализации датасет однократно подключается к проекту с доступом для чтения и записи. Если код в ячейке инициализации датасета выполнен успешно, датасет сохраняется и повторно подключается с доступом только для чтения. Если во время инициализации произойдет ошибка, датасет будет отключен и удален.
После инициализации данные датасета изменить невозможно. Если данные нужно актуализировать, удалите датасет и создайте новый.
Наполнить датасет файлами из хранилища проекта или подключенного объектного хранилища
Этот способ также подойдет для создания датасета с данными из бакета Yandex Object Storage или другого объектного хранилища, подключенного к хранилищу проекта с помощью коннектора S3.
Чтобы создать датасет <имя_датасета>
, инициализируйте его и скопируйте файлы каталога <имя_исходного_каталога>
:
#!:bash
#pragma dataset init <имя_датасета> --size 1Gb
set -e
cp -r <имя_исходного_каталога> /home/jupyter/mnt/datasets/<имя_датасета>
Наполнить датасет из файла по ссылке
Чтобы создать датасет <имя_датасета>
из архива CIFAR-10
#!:bash
#pragma dataset init <имя_датасета> --size 1Gb
set -e
cd /home/jupyter/mnt/datasets/<имя_датасета>
wget https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
tar -xvf cifar-10-python.tar.gz
rm -rf cifar-10-python.tar.gz
#pragma dataset init <имя_датасета> --size 1Gb
from urllib.request import urlopen
import tarfile
from os import remove
file_name = 'cifar-10-python.tar.gz'
file_url = 'https://www.cs.toronto.edu/~kriz/' + file_name
dest_dir = '/home/jupyter/mnt/datasets/<имя_датасета>/'
dest_file = dest_dir + file_name
with urlopen(file_url) as i:
with open(dest_file, 'w+b') as o:
o.write(i.read())
tar = tarfile.open(dest_file)
tar.extractall(dest_dir)
tar.close()
remove(dest_file)
# This prevents serialization of temporary variables
del i, o, tar
Наполнить датасет объектами файловых хранилищ
Если вы подключаетесь к бакету Object Storage с помощью коннектора S3, создайте датасет из объектов как из локальных файлов проекта.
#pragma dataset init <имя_датасета> --size 1Gb
import os
import boto3
S3_CREDS = {
"aws_access_key_id": os.environ['<секрет_с_идентификатором_ключа_доступа>'],
"aws_secret_access_key": os.environ['<секрет_с_секретным_ключом>']
}
bucket_name = "<имя_бакета>"
source_path = ''
target_path = '/home/jupyter/mnt/datasets/<имя_датасета>/'
s3r = boto3.resource(service_name='s3', endpoint_url='https://storage.yandexcloud.net', **S3_CREDS)
bucket = s3r.Bucket(bucket_name)
for obj in bucket.objects.filter(Prefix=source_path):
if not os.path.relpath(obj.key, source_path).startswith('../'):
os.makedirs(os.path.join(target_path, os.path.dirname(obj.key)), exist_ok=True)
if obj.key[-1] != '/':
bucket.download_file(obj.key, os.path.join(target_path, obj.key))
Где:
aws_access_key_id
— идентификатор статического ключа доступа, сгенерированный для сервисного аккаунта проекта.aws_secret_access_key
— секретный ключ, сгенерированный для того же сервисного аккаунта.
Инициализируйте датасет в ячейке с кодом:
#pragma dataset init <имя_датасета> --size 8Gb
import requests
from urllib.parse import urlencode
from io import BytesIO
from zipfile import ZipFile
base_url = 'https://cloud-api.yandex.net/v1/disk/public/resources/download?'
public_key = '<ссылка_на_каталог_на_Яндекс_Диске>'
final_url = base_url + urlencode(dict(public_key=public_key))
response = requests.get(final_url)
download_url = response.json()['href']
response = requests.get(download_url)
dist_path = '/home/jupyter/mnt/datasets/<имя_датасета>/'
zipfile = ZipFile(BytesIO(response.content))
zipfile.extractall(path=dist_path)
Где <ссылка_на_каталог_на_Яндекс_Диске>
— ссылка для доступа к каталогу на Яндекс Диске, содержимое которого нужно загрузить в DataSphere.
-
Установите пакет gdown
:%pip install gdown
-
Инициализируйте датасет в ячейке с кодом:
#pragma dataset init <имя_датасета> --size 1Gb import gdown gdrive_folder_id = '<идентификатор_папки_Google_Drive>' dst_path = '/home/jupyter/mnt/datasets/<имя_датасета>/' gdown.download_folder(id=gdrive_folder_id, output=dst_path, use_cookies=False)
Где
<идентификатор_папки_Google_Drive>
— идентификатор папки Google Drive, который содержится в адресе послеhttps://drive.google.com/drive/folders/
. Например, в URLhttps://drive.google.com/drive/folders/exampleId
идентификатор папки —exampleId
.
Активировать датасет
Сразу после инициализации датасет становится активным в проекте и доступен по адресу /home/jupyter/mnt/datasets/<имя_датасета>
. Одновременно в проекте может быть активировано до 3 датасетов. Во время работы вы можете активировать датасеты, когда они необходимы, и отключать их, если данные больше не нужны.
Чтобы активировать датасет:
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - В блоке Ресурсы проекта нажмите
Датасет. - В строке с нужным датасетом нажмите значок
и выберите Активировать.
Посмотреть список датасетов, доступных в проекте
На странице проекта в блоке Ресурсы проекта выберите
Поделиться датасетом
Примечание
Делиться ресурсами можно только в рамках одной организации между сообществами, созданными в одной зоне доступности.
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - В блоке Ресурсы проекта нажмите
Датасет. - Выберите нужный датасет в списке.
- Перейдите на вкладку Доступ.
- Включите опцию видимости напротив названия сообщества, с которым нужно поделиться датасетом.
Чтобы датасет стал доступен для работы в другом проекте, необходимо добавить его на вкладке Доступные.
Деактивировать датасет
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. - На странице проекта в блоке Ресурсы проекта нажмите
Датасет. - В строке с нужным датасетом нажмите значок
и выберите Деактивировать.
Удалить датасет
Вы можете удалить датасет, только если он:
- не активирован в собственном проекте;
- не используется в других проектах;
- недоступен в сообществе.
Чтобы удалить датасет:
- На странице проекта в блоке Ресурсы проекта нажмите
Датасет. - В строке с нужным датасетом нажмите значок
и выберите Удалить.
Важно
Фактически удаление ресурсов может занимать до 72 часов.