Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ОБЛАСТЬ ПРИМЕНЕНИЯ:
Пакет SDK для Python azure-ai-ml версии 2 (current)
Проект машинного обучения обычно начинается с анализа аналитических данных (EDA) и предварительной обработки данных (очистка, проектирование признаков). Она также включает создание прототипов модели машинного обучения для проверки гипотез. Этот этап создания прототипов является очень интерактивным, и он позволяет разрабатывать в записной книжке Jupyter или в интегрированной среде разработки с помощью интерактивной консоли Python. В этой статье вы узнаете, как:
- Доступ к данным из URI хранилища данных Машинного обучения Azure, как если бы это была файловая система.
- Материализуйте ресурсы данных Машинного обучения Azure в Pandas с помощью библиотеки
mltablePython. - Материализуйте данные, загрузив их непосредственно с помощью служебной программы
azcopy.
Необходимые компоненты
- Рабочая область Машинного обучения Azure. Дополнительные сведения см. в статье "Управление рабочими областями машинного обучения Azure" на портале или с помощью пакета SDK для Python версии 2.
- Хранилище данных Машинного обучения Azure. Дополнительные сведения см. в разделе "Создание хранилищ данных".
Совет
В этом руководстве описывается доступ к данным во время интерактивной разработки. Он применяется к любому узлу, который может запускать сеанс 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) хранилища данных в пользовательском интерфейсе студии, выполнив следующие действия.
- Выберите данные в меню слева и перейдите на вкладку хранилища данных .
- Выберите имя хранилища данных и нажмите кнопку "Обзор".
- Найдите файл или папку, которую вы хотите прочитать в Pandas, выберите многоточие (...) рядом с ним, а затем выберите 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.
В этих сценариях вы считываете только файлы 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 ресурса, вам потребуется:
- Имя экземпляра в формате
adb-<number>.<number>.azuredatabricks.net. Это значение можно найти в URL-адресе рабочей области Azure Databricks. - Личный маркер доступа. Дополнительные сведения о создании личного маркера доступа см. в статье "Аутентификация с помощью личных маркеров доступа Azure Databricks" (устаревшая версия).
С помощью этих значений создайте переменную среды для 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