Доступ к данным из облачного хранилища Azure во время интерактивной разработки

ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK для Python azure-ai-ml версии 2 (current)

Проект машинного обучения обычно начинается с анализа аналитических данных (EDA) и предварительной обработки данных (очистка, проектирование признаков). Она также включает создание прототипов модели машинного обучения для проверки гипотез. Этот этап создания прототипов является очень интерактивным, и он позволяет разрабатывать в записной книжке Jupyter или в интегрированной среде разработки с помощью интерактивной консоли Python. В этой статье вы узнаете, как:

  • Доступ к данным из URI хранилища данных Машинного обучения Azure, как если бы это была файловая система.
  • Материализуйте ресурсы данных Машинного обучения Azure в Pandas с помощью библиотеки mltable Python.
  • Материализуйте данные, загрузив их непосредственно с помощью служебной программы azcopy.

Необходимые компоненты

Совет

В этом руководстве описывается доступ к данным во время интерактивной разработки. Он применяется к любому узлу, который может запускать сеанс Python. Этот узел может быть локальным компьютером, облачной виртуальной машиной, пространством кода GitHub или другим узлом. Используйте вычислительный экземпляр Машинного обучения Azure — полностью управляемую и предварительно настроенную облачную рабочую станцию. Дополнительные сведения см. в статье "Создание Машинное обучение Azure вычислительного экземпляра".

Внимание

Убедитесь, что в вашей среде Python установлены последние версии библиотек azure-fsspec, mltable и azure-ai-ml.

pip install -U azureml-fsspec==1.3.1 mltable azure-ai-ml

Последняя azure-fsspec версия пакета может меняться со временем. Дополнительные сведения о пакете azure-fsspec см. в статье azureml-fsspec 1.3.1.

Доступ к данным из URI хранилища данных, как и из файловой системы

Хранилище данных Машинного обучения Azure — это ссылка на существующую учетную запись хранения Azure. Преимущества создания и использования хранилищ данных:

  • Общий простой API для взаимодействия с различными типами хранилища (BLOB-объектов, файлов, Azure Data Lake Storage).
  • Простое обнаружение полезных хранилищ данных в операциях группы.
  • Поддержка доступа к данным на основе учетных данных (например, маркер SAS) и на основе удостоверений (идентификатор Microsoft Entra или управляемое удостоверение).
  • Для доступа на основе учетных данных информация о подключении защищена, чтобы избежать утечки ключа при использовании в скриптах.
  • Вы можете просматривать данные и копировать и вставлять URI хранилища данных в пользовательском интерфейсе Студии машинного обучения Azure.

URI хранилища данных — это универсальный идентификатор ресурса, который является ссылкой на расположение хранилища (путь) в учетной записи хранения Azure. Универсальный код ресурса (URI) хранилища данных имеет следующий формат:

# Azure Machine Learning workspace details:
subscription = '<subscription_ID>'
resource_group = '<resource_group>'
workspace = '<workspace>'
datastore_name = '<datastore>'
path_on_datastore = '<path>'

# Long-form datastore URI format:
uri = f'azureml://subscriptions/{subscription}/resourcegroups/{resource_group}/workspaces/{workspace}/datastores/{datastore_name}/paths/{path_on_datastore}'.

Эти URI хранилищ данных представляют собой известную реализацию спецификации файловой системы (fsspec): унифицированный Pythonic интерфейс для локальных, удаленных и встроенных файловых систем и хранилищ байтов. Сначала используйте pip для установки azureml-fsspec пакета и его пакета зависимостей azureml-dataprep . Затем можно использовать реализацию хранилища fsspec данных Машинного обучения Azure.

Реализация хранилища fsspec данных Azure Machine Learning автоматически обрабатывает передачу учетных данных и удостоверений, которую использует хранилище данных. Вы можете избежать как раскрытия ключа учетной записи в ваших сценариях, так и дополнительных процедур аутентификации на экземпляре вычисления.

Например, вы можете напрямую использовать URI хранилища данных в Pandas. В этом примере показано, как считывать CSV-файл:

import pandas as pd

df = pd.read_csv("azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<filename>.csv")
df.head()

Совет

Чтобы избежать необходимости запоминать формат URI хранилища данных, можно скопировать и вставить универсальный код ресурса (URI) хранилища данных в пользовательском интерфейсе студии, выполнив следующие действия.

  1. Выберите данные в меню слева и перейдите на вкладку хранилища данных .
  2. Выберите имя хранилища данных и нажмите кнопку "Обзор".
  3. Найдите файл или папку, которую вы хотите прочитать в Pandas, выберите многоточие (...) рядом с ним, а затем выберите URI копирования. Затем можно выбрать универсальный код ресурса (URI) хранилища данных для копирования в записную книжку или скрипт. Снимок экрана: копирование URI хранилища данных.

Вы также можете создать экземпляр файловой системы Машинного обучения Azure для обработки таких команд, как, напримерls, globи existsopen.

  • Метод ls() перечисляет файлы в определенном каталоге. Вы можете использовать ls()и ls(.)ls (<folder_level_1>/<folder_level_2>) перечислять файлы. Поддерживаются как ., так и .. в относительных путях.
  • Метод glob() поддерживает * и ** глоббинг.
  • Метод exists() возвращает логическое значение, указывающее, существует ли указанный файл в текущем корневом каталоге.
  • Метод open() возвращает объект, похожий на файл, который можно передать в любую другую библиотеку, которая ожидает работы с файлами Python. Код также может использовать этот объект, как если бы он был обычным файлом Python. Эти объекты, подобные файлам, уважают использование with контекстов, как показано в этом примере:
from azureml.fsspec import AzureMachineLearningFileSystem

# Instantiate the filesystem by using the following URI.
fs = AzureMachineLearningFileSystem('azureml://subscriptions/<subscriptionID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>')

fs.ls() # List folders and files in datastore datastorename.

# Output example:
# folder1
# folder2
# file3.csv

# Use an open context.
with fs.open('./folder1/file1.csv') as f:
    # Do some process.
    process_file(f)

Отправка файлов с помощью AzureMachineLearningFileSystem

from azureml.fsspec import AzureMachineLearningFileSystem
# Instantiate the filesystem by using the following URI.
fs = AzureMachineLearningFileSystem('azureml://subscriptions/<subscriptionID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/')

# You can set recursive to False to upload a file.
fs.upload(lpath='data/upload_files/crime-spring.csv', rpath='data/fsspec', recursive=False, **{'overwrite': 'MERGE_WITH_OVERWRITE'})

# You need to set recursive to True to upload a folder.
fs.upload(lpath='data/upload_folder/', rpath='data/fsspec_folder', recursive=True, **{'overwrite': 'MERGE_WITH_OVERWRITE'})

lpath — это локальный путь и rpath удаленный путь. Если указанные папки rpath не существуют, метод создает папки для вас.

Метод поддерживает три overwrite режима:

  • ДОБАВИТЬ. Если файл с тем же именем существует в пути назначения, ДОБАВЛЕНИЕ сохраняет исходный файл.
  • FAIL_ON_FILE_CONFLICT (ОШИБКА_ПРИ_КОНФЛИКТЕ_ФАЙЛОВ) Если файл с тем же именем существует в пути назначения, FAIL_ON_FILE_CONFLICT выдает ошибку.
  • СЛИЯНИЕ_С_ПЕРЕЗАПИСЬЮ. Если файл с тем же именем существует в пути назначения, MERGE_WITH_OVERWRITE перезаписывает существующий файл новым файлом.

Скачивание файлов с помощью AzureMachineLearningFileSystem

# You can set recursive to False to download a file.
# The downloading overwrite option is determined by the local system. It's MERGE_WITH_OVERWRITE.
fs.download(rpath='data/fsspec/crime-spring.csv', lpath='data/download_files/', recursive=False)

# You need to set recursive to True to download a folder.
fs.download(rpath='data/fsspec_folder', lpath='data/download_folder/', recursive=True)

Примеры

В этих примерах показано, как использовать спецификацию файловой системы в распространенных сценариях.

Чтение одного CSV-файла в Pandas

С помощью этого кода можно считывать один CSV-файл в Pandas:

import pandas as pd

df = pd.read_csv("azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<file_name>.csv")

Чтение папки CSV-файлов в Pandas

Метод Pandas read_csv() не поддерживает чтение папки CSV-файлов. Чтобы обработать это ограничение, используйте глоб для получения путей CSV и сцепления их с кадром данных с помощью метода Pandas concat() . В следующем примере кода показано, как достичь этого объединения с помощью файловой системы Машинного обучения Azure:

import pandas as pd
from azureml.fsspec import AzureMachineLearningFileSystem

# Define the URI. Update <> placeholders.
uri = 'azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>'

# Create the filesystem.
fs = AzureMachineLearningFileSystem(uri)

# Append .csv files in the folder to a list.
dflist = []
for path in fs.glob('/<folder>/*.csv'):
    with fs.open(path) as f:
        dflist.append(pd.read_csv(f))

# Concatenate data frames.
df = pd.concat(dflist)
df.head()

Чтение CSV-файлов в Dask

В этом примере показано, как считывать CSV-файл в кадр данных Dask:

import dask.dd as dd

df = dd.read_csv("azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<file_name>.csv")
df.head()

Чтение папки файлов Parquet в Pandas

В процессе ETL файлы Parquet обычно записываются в папку. Затем процесс может выдавать файлы, относящиеся к ETL, такие как ход выполнения, коммиты и другие метаданные. В этом примере показаны файлы, созданные из процесса ETL (файлы, начинающиеся с _), которые затем создают файл данных Parquet.

Снимок экрана, показывающий процесс ETL Parquet.

В этих сценариях вы считываете только файлы Parquet в папке. Вы игнорируете файлы процесса ETL. В этом примере кода показано, как шаблоны глобов могут считывать только файлы Parquet в папке:

import pandas as pd
from azureml.fsspec import AzureMachineLearningFileSystem

# Define the URI. Update <> placeholders.
uri = 'azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>'

# Create the filesystem.
fs = AzureMachineLearningFileSystem(uri)

# Append Parquet files in folder to a list.
dflist = []
for path in fs.glob('/<folder>/*.parquet'):
    with fs.open(path) as f:
        dflist.append(pd.read_parquet(f))

# Concatenate data frames.
df = pd.concat(dflist)
df.head()

Доступ к данным из файловой системы Azure Databricks

Спецификация файловой системы (fsspec) имеет ряд известных реализаций, включая файловую систему Databricks (dbfs).

Чтобы получить доступ к данным из dbfs ресурса, вам потребуется:

С помощью этих значений создайте переменную среды для PAT token на вашeй вычислительной инстанции.

export ADB_PAT=<personal_access_token>

Затем вы можете получить доступ к данным в Pandas, как показано в этом примере:

import os
import pandas as pd

pat = os.getenv(ADB_PAT)
path_on_dbfs = '<absolute_path_on_dbfs>' # e.g. /folder/subfolder/file.csv

storage_options = {
    'instance':'adb-<number>.<number>.azuredatabricks.net', 
    'token': pat
}

df = pd.read_csv(f'dbfs://{path_on_dbfs}', storage_options=storage_options)

Чтение изображений с помощью pillow

from PIL import Image
from azureml.fsspec import AzureMachineLearningFileSystem

# Define the URI. Update <> placeholders.
uri = 'azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>'

# Create the filesystem.
fs = AzureMachineLearningFileSystem(uri)

with fs.open('/<folder>/<image.jpeg>') as f:
    img = Image.open(f)
    img.show()

Пример пользовательского набора данных PyTorch

В этом примере создается настраиваемый набор данных PyTorch для обработки изображений. В этом сценарии существует файл заметок (в формате CSV) с этой общей структурой:

image_path, label
0/image0.png, label0
0/image1.png, label0
1/image2.png, label1
1/image3.png, label1
2/image4.png, label2
2/image5.png, label2

Вложенные папки хранят эти изображения в соответствии с их метками:

/
└── 📁images
    ├── 📁0
    │   ├── 📷image0.png
    │   └── 📷image1.png
    ├── 📁1
    │   ├── 📷image2.png
    │   └── 📷image3.png
    └── 📁2
        ├── 📷image4.png
        └── 📷image5.png

Пользовательский класс набора данных PyTorch должен реализовать три функции: __init__, __len__и __getitem__, как показано ниже:

import os
import pandas as pd
from PIL import Image
from torch.utils.data import Dataset

class CustomImageDataset(Dataset):
    def __init__(self, filesystem, annotations_file, img_dir, transform=None, target_transform=None):
        self.fs = filesystem
        f = filesystem.open(annotations_file)
        self.img_labels = pd.read_csv(f)
        f.close()
        self.img_dir = img_dir
        self.transform = transform
        self.target_transform = target_transform

    def __len__(self):
        return len(self.img_labels)

    def __getitem__(self, idx):
        img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])
        f = self.fs.open(img_path)
        image = Image.open(f)
        f.close()
        label = self.img_labels.iloc[idx, 1]
        if self.transform:
            image = self.transform(image)
        if self.target_transform:
            label = self.target_transform(label)
        return image, label

Затем можно создать экземпляр набора данных, как показано здесь:

from azureml.fsspec import AzureMachineLearningFileSystem
from torch.utils.data import DataLoader

# Define the URI. Update <> placeholders.
uri = 'azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<datastore_name>'

# Create the filesystem.
fs = AzureMachineLearningFileSystem(uri)

# Create the dataset.
training_data = CustomImageDataset(
    filesystem=fs,
    annotations_file='/annotations.csv', 
    img_dir='/<path_to_images>/'
)

# Prepare your data for training with DataLoaders.
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)

Материализуйте данные в Pandas с помощью библиотеки mltable.

Библиотека mltable также может помочь получить доступ к данным в облачном хранилище. Чтобы вводить данные в Pandas с помощью mltable, используйте следующий общий формат.

import mltable

# Define a path, folder, or pattern.
path = {
    'file': '<supported_path>'
    # alternatives
    # 'folder': '<supported_path>'
    # 'pattern': '<supported_path>'
}

# Create an mltable from paths.
tbl = mltable.from_delimited_files(paths=[path])
# alternatives
# tbl = mltable.from_parquet_files(paths=[path])
# tbl = mltable.from_json_lines_files(paths=[path])
# tbl = mltable.from_delta_lake(paths=[path])

# Materialize to Pandas.
df = tbl.to_pandas_dataframe()
df.head()

Поддерживаемые пути

Библиотека mltable поддерживает чтение табличных данных из разных типов путей:

Расположение Примеры
Путь к локальному компьютеру ./home/username/data/my_data
Путь на общедоступном сервере HTTP(S) https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Путь к службе хранилища Azure wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Хранилище данных с длинной формой Машинное обучение Azure azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<name>/paths/<path>

Примечание.

Для путей к хранилищам данных Azure и хранилищам данных Машинного обучения Azure используется передача учетных данных. Если у вас нет разрешения на доступ к данным в базовом хранилище, доступ к данным невозможно получить.

Файлы, папки и глобы

mltable поддерживает чтение из:

  • Files. Например: abfss://<file_system>@<account_name>.dfs.core.windows.net/my-csv.csv.
  • Папки. Например: abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/.
  • Шаблоны glob. Например: abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/*.csv.
  • Сочетание файлов, папок и (или) шаблонов глобов.

mltable позволяет материализовать данные в один датафрейм из сочетания локальных и облачных ресурсов хранилища, а также из сочетаний файлов, папок и глобов. Например:

path1 = {
    'file': 'abfss://filesystem@account1.dfs.core.windows.net/my-csv.csv'
}

path2 = {
    'folder': './home/username/data/my_data'
}

path3 = {
    'pattern': 'abfss://filesystem@account2.dfs.core.windows.net/folder/*.csv'
}

tbl = mltable.from_delimited_files(paths=[path1, path2, path3])

Поддерживаемые типы файлов

mltable поддерживает следующие форматы файлов.

  • Разделенный текст (например, CSV-файлы): mltable.from_delimited_files(paths=[path])
  • Паркет: mltable.from_parquet_files(paths=[path])
  • Дельта: mltable.from_delta_lake(paths=[path])
  • Формат строк JSON: mltable.from_json_lines_files(paths=[path])

Примеры

Чтение CSV-файла

Замените заполнители (<>) в этом фрагменте кода своими значениями:

import mltable

path = {
    'file': 'abfss://<filesystem>@<account>.dfs.core.windows.net/<folder>/<file_name>.csv'
}

tbl = mltable.from_delimited_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()

Чтение файлов Parquet в папке

В этом примере показано, как mltable могут использовать подстановочные знаки, чтобы гарантировать, что будут прочитаны только файлы формата Parquet.

Замените заполнители (<>) в этом фрагменте кода своими значениями:

import mltable

path = {
    'pattern': 'abfss://<filesystem>@<account>.dfs.core.windows.net/<folder>/*.parquet'
}

tbl = mltable.from_parquet_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()

Чтение ресурсов данных

В этом разделе показано, как получить доступ к ресурсам данных Машинное обучение Azure в Pandas.

Ресурс таблицы

Если вы ранее создали актив таблицы в Azure Machine Learning (mltable или версию V1 TabularDataset), вы можете загрузить этот актив таблицы в Pandas, применив следующий код:

import mltable
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

ml_client = MLClient.from_config(credential=DefaultAzureCredential())
data_asset = ml_client.data.get(name="<name_of_asset>", version="<version>")

tbl = mltable.load(f'azureml:/{data_asset.id}')
df = tbl.to_pandas_dataframe()
df.head()

Файловый ресурс

Если вы зарегистрировали файловый ресурс (CSV-файл, например), этот ресурс можно считывать в кадр данных Pandas с помощью этого кода:

import mltable
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

ml_client = MLClient.from_config(credential=DefaultAzureCredential())
data_asset = ml_client.data.get(name="<name_of_asset>", version="<version>")

path = {
    'file': data_asset.path
}

tbl = mltable.from_delimited_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()

Ресурс папки

Если вы зарегистрировали ресурс папки (uri_folder или V1 FileDataset), например, папку, содержащую CSV-файл, вы можете прочитать этот ресурс в фрейм данных Pandas с помощью следующего кода:

import mltable
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

ml_client = MLClient.from_config(credential=DefaultAzureCredential())
data_asset = ml_client.data.get(name="<name_of_asset>", version="<version>")

path = {
    'folder': data_asset.path
}

tbl = mltable.from_delimited_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()

Чтение и обработка больших томов данных с помощью Pandas

Совет

Pandas не предназначен для обработки больших наборов данных. Pandas может обрабатывать только данные, которые помещаются в память вычислительного экземпляра.

Для больших наборов данных используйте управляемый Spark в Azure Machine Learning. Эта служба предоставляет API PySpark Pandas.

Перед масштабированием до удаленного асинхронного задания может потребоваться быстро выполнить итерацию в меньшем подмножестве большого набора данных. mltable предоставляет функциональные возможности для получения примеров больших данных с помощью метода take_random_sample :

import mltable

path = {
    'file': 'https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv'
}

tbl = mltable.from_delimited_files(paths=[path])
# Take a random 30% sample of the data.
tbl = tbl.take_random_sample(probability=.3)
df = tbl.to_pandas_dataframe()
df.head()

Вы также можете принимать подмножества больших данных с помощью следующих операций:

Скачивание данных с помощью служебной azcopy программы

Используйте утилиту azcopy для загрузки данных в локальную файловую систему SSD вашего узла (локального компьютера, облачной виртуальной машины, вычислительного экземпляра Azure Machine Learning и т. д.). Программаazcopy, предустановленная в Машинное обучение Azure вычислительном экземпляре, обрабатывает скачивание данных. Если вы не используете вычислительный экземпляр Машинного обучения Azure или виртуальную машину для обработки и анализа данных (DSVM), возможно, потребуется установить azcopy. Дополнительные сведения см. в статье azcopy.

Внимание

Не скачивайте данные в расположение /home/azureuser/cloudfiles/code на вычислительном экземпляре. Это локация предназначена для хранения артефактов ноутбука и кода, а не данных. Чтение данных из этого расположения приводит к значительным потерям производительности во время обучения. Вместо этого сохраните данные в home/azureuser расположении, которое является локальным SSD вычислительного узла.

Откройте терминал и создайте новый каталог, например:

mkdir /home/azureuser/data

Вход в azcopy:

azcopy login

Теперь можно скопировать данные с помощью URI хранилища:

SOURCE=https://<account_name>.blob.core.windows.net/<container>/<path>
DEST=/home/azureuser/data
azcopy cp $SOURCE $DEST

Следующие шаги