Přístup k datům z cloudového úložiště Azure během interaktivního vývoje

PLATÍ PRO: Python SDK azure-ai-ml v2 (aktuální)

Projekt strojového učení obvykle začíná průzkumnou analýzou dat (EDA), předzpracováním dat (čištění, příprava funkcí) a zahrnuje vytváření prototypů modelů ML pro ověření hypotéz. Tato fáze projektu vytváření prototypů je v přírodě vysoce interaktivní a hodí se k vývoji v poznámkovém bloku Jupyter nebo integrovaném vývojovém prostředí s interaktivní konzolou Pythonu. V tomto článku se dozvíte, jak:

  • Přístup k datům z identifikátoru URI úložiště dat azure Učení, jako by se jednalo o systém souborů.
  • Materializace dat do Pandas pomocí mltable knihovny Pythonu
  • Materializace datových prostředků Azure Machine Učení do Pandas pomocí mltable knihovny Pythonu
  • Materializace dat prostřednictvím explicitního stažení pomocí azcopy nástroje.

Předpoklady

Tip

Pokyny v tomto článku popisují přístup k datům během interaktivního vývoje. Platí pro každého hostitele, který může spustit relaci Pythonu. To může zahrnovat váš místní počítač, cloudový virtuální počítač, GitHub Codespace atd. Doporučujeme použít výpočetní instanci Azure Machine Učení – plně spravovanou a předem nakonfigurovanou cloudovou pracovní stanici. Další informace najdete v tématu Vytvoření výpočetní instance služby Azure Machine Učení.

Důležité

Ujistěte se, že máte ve svém prostředí Python nainstalované nejnovější azure-fsspec knihovny a mltable knihovny Pythonu:

pip install -U azureml-fsspec mltable

Přístup k datům z identifikátoru URI úložiště dat, jako je systém souborů

Úložiště dat azure machine Učení je odkazem na existující účet úložiště Azure. Mezi výhody vytváření a používání úložiště dat patří:

  • Běžné snadno použitelné rozhraní API pro interakci s různými typy úložiště (Blob/Files/ADLS).
  • Snadné zjišťování užitečných úložišť dat v týmových operacích
  • Podpora přístupu k datům na základě přihlašovacích údajů (například tokenu SAS) i přístupu na základě identity (použití Microsoft Entra ID nebo Manged identity).
  • V případě přístupu na základě přihlašovacích údajů jsou informace o připojení zabezpečené pro ohrožení klíče void ve skriptech.
  • Procházejte data a zkopírujte identifikátory URI úložiště dat v uživatelském rozhraní studia.

Identifikátor URI úložiště dat je identifikátor uniform resource identifier, což je odkaz na umístění úložiště (cestu) ve vašem účtu úložiště Azure. Identifikátor URI úložiště dat má tento formát:

# 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}'.

Tyto identifikátory URI úložiště dat jsou známou implementací specifikace systému souborů (fsspec): jednotné pythonické rozhraní pro místní, vzdálené a vložené systémy souborů a úložiště bajtů. Balíček a jeho balíček závislostí azureml-dataprep můžete nainstalovat azureml-fsspec pip. Pak můžete použít implementaci úložiště dat fsspec azure machine Učení.

Implementace azure Machine Učení Datastore fsspec automaticky zpracovává předávání přihlašovacích údajů nebo identity, které azure machine Učení úložiště dat používá. V výpočetní instanci se můžete vyhnout odhalení klíče účtu ve vašich skriptech a dalších přihlašovacích procedurách.

Můžete například přímo použít identifikátory URI úložiště dat v knihovně Pandas. Tento příklad ukazuje, jak číst soubor CSV:

import pandas as pd

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

Tip

Místo toho, abyste si vzpomněli na formát identifikátoru URI úložiště dat, můžete z uživatelského rozhraní sady Studio zkopírovat a vložit identifikátor URI úložiště dat pomocí těchto kroků:

  1. V nabídce vlevo vyberte Data a pak vyberte kartu Úložiště dat.
  2. Vyberte název úložiště dat a pak vyberte Procházet.
  3. Najděte soubor nebo složku, kterou chcete číst do pandas, a vyberte tři tečky (...) vedle něj. V nabídce vyberte Kopírovat identifikátor URI . Můžete vybrat identifikátor URI úložiště dat, který chcete zkopírovat do poznámkového bloku nebo skriptu. Screenshot highlighting the copy of the datastore URI.

Můžete také vytvořit instanci systému souborů Azure Machine Učení pro zpracování příkazů podobných systému souborů , například ls, globexists, open.

  • Metoda ls() uvádí soubory v určitém adresáři. K výpisu souborů můžete použít ls(), ls(.), ls (<<folder_level_1>/<folder_level_2>). Podporujeme jak '.', tak i '..', v relativních cestách.
  • Metoda glob() podporuje globbing '*' a '**'.
  • Metoda exists() vrátí logickou hodnotu, která označuje, zda zadaný soubor existuje v aktuálním kořenovém adresáři.
  • Metoda open() vrátí objekt podobný souboru, který lze předat jakékoli jiné knihovně, která očekává, že bude pracovat se soubory Pythonu. Váš kód může tento objekt také použít, jako by se jednalo o normální objekt souboru pythonu. Tyto objekty podobné souboru respektují použití with kontextů, jak je znázorněno v tomto příkladu:
from azureml.fsspec import AzureMachineLearningFileSystem

# instantiate file system using following URI
fs = AzureMachineLearningFileSystem('azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastore*s*/datastorename')

fs.ls() # list folders/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)

Nahrání souborů přes AzureMachine Učení FileSystem

from azureml.fsspec import AzureMachineLearningFileSystem
# instantiate file system using following URI
fs = AzureMachineLearningFileSystem('azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastorename>/paths/')

# you can specify recursive as 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 specify recursive as True to upload a folder
fs.upload(lpath='data/upload_folder/', rpath='data/fsspec_folder', recursive=True, **{'overwrite': 'MERGE_WITH_OVERWRITE'})

lpath je místní cesta a rpath je to vzdálená cesta. Pokud zadané složky rpath ještě neexistují, vytvoříme pro vás složky.

Podporujeme tři režimy přepisování:

  • APPEND: Pokud v cílové cestě existuje soubor se stejným názvem, zachová se původní soubor.
  • FAIL_ON_FILE_CONFLICT: Pokud v cílové cestě existuje soubor se stejným názvem, dojde k chybě.
  • MERGE_WITH_OVERWRITE: Pokud v cílové cestě existuje soubor se stejným názvem, přepíše se stávající soubor novým souborem.

Stažení souborů přes AzureMachine Učení FileSystem

# you can specify recursive as False to download a file
# downloading overwrite option is determined by local system, and it is MERGE_WITH_OVERWRITE
fs.download(rpath='data/fsspec/crime-spring.csv', lpath='data/download_files/, recursive=False)

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

Příklady

Tyto příklady ukazují použití specifikace systému souborů v běžných scénářích.

Čtení jednoho souboru CSV do Pandas

Do Pandas můžete přečíst jeden soubor CSV, jak je znázorněno na obrázku:

import pandas as pd

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

Čtení složky souborů CSV do Pandas

Metoda Pandas read_csv() nepodporuje čtení složky souborů CSV. Je nutné, aby se cesty csv zřetězeny do datového rámce pomocí metody Pandas concat() . Následující ukázka kódu ukazuje, jak tohoto zřetězení dosáhnout pomocí systému souborů Azure Machine Učení:

import pandas as pd
from azureml.fsspec import AzureMachineLearningFileSystem

# define the URI - update <> placeholders
uri = 'azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>'

# create the filesystem
fs = AzureMachineLearningFileSystem(uri)

# append csv files in 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()

Čtení souborů CSV do Dask

Tento příklad ukazuje, jak číst soubor CSV do datového rámce Dask:

import dask.dd as dd

df = dd.read_csv("azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<filename>.csv")
df.head()

Čtení složky souborů parquet do Pandas

V rámci procesu ETL se soubory Parquet obvykle zapisují do složky, která pak může generovat soubory relevantní pro ETL, jako je průběh, potvrzení atd. Tento příklad ukazuje soubory vytvořené z procesu ETL (soubory začínající _) a potom vytvoří soubor parquet dat.

Screenshot showing the parquet etl process.

V těchto scénářích budete číst pouze soubory parquet ve složce a ignorovat soubory procesu ETL. Tento vzorový kód ukazuje, jak můžou vzory globů číst jen soubory parquet ve složce:

import pandas as pd
from azureml.fsspec import AzureMachineLearningFileSystem

# define the URI - update <> placeholders
uri = 'azureml://subscriptions/<subid>/resourcegroups/<rgname>/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()

Přístup k datům ze systému souborů Azure Databricks (dbfs)

Specifikace systému souborů (fsspec) má řadu známých implementací, včetně systému souborů Databricks (dbfs).

Pokud chcete získat přístup k datům, dbfs potřebujete:

Pomocí těchto hodnot musíte ve výpočetní instanci vytvořit proměnnou prostředí pro token PAT:

export ADB_PAT=<pat_token>

Pak můžete přistupovat k datům v Pandas, jak je znázorněno v tomto příkladu:

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-<some-number>.<two digits>.azuredatabricks.net', 
    'token': pat
}

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

Čtení obrázků pomocí pillow

from PIL import Image
from azureml.fsspec import AzureMachineLearningFileSystem

# define the URI - update <> placeholders
uri = 'azureml://subscriptions/<subid>/resourcegroups/<rgname>/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()

Příklad vlastní datové sady PyTorch

V tomto příkladu vytvoříte vlastní datovou sadu PyTorch pro zpracování obrázků. Předpokládáme, že existuje soubor poznámek (ve formátu CSV) s touto celkovou strukturou:

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

Podsložky ukládají tyto obrázky podle jejich popisků:

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

Vlastní třída datové sady PyTorch musí implementovat tři funkce: __init____len__, a __getitem__, jak je znázorněno zde:

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

Potom můžete vytvořit instanci datové sady, jak je znázorněno tady:

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

# define the URI - update <> placeholders
uri = 'azureml://subscriptions/<subid>/resourcegroups/<rgname>/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)

Materializace dat do Pandas pomocí mltable knihovny

Knihovna mltable může také pomoct získat přístup k datům v cloudovém úložišti. Čtení dat do Pandas s tímto obecným formátem mltable :

import mltable

# define a path or 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()

Podporované cesty

Knihovna mltable podporuje čtení tabulkových dat z různých typů cest:

Poloha Příklady
Cesta na místním počítači ./home/username/data/my_data
Cesta na veřejném serveru HTTP https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Cesta ve službě Azure Storage wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Úložiště dat azure Učení s dlouhým tvarem azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<wsname>/datastores/<name>/paths/<path>

Poznámka:

mltableprovede předávání přihlašovacích údajů uživatele pro cesty ve službě Azure Storage a azure machine Učení úložištích dat. Pokud nemáte oprávnění pro přístup k datům v podkladovém úložišti, nemůžete k nim získat přístup.

Soubory, složky a globy

mltable podporuje čtení z:

  • soubor(y) – například: abfss://<file_system>@<account_name>.dfs.core.windows.net/my-csv.csv
  • složky – například abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/
  • vzory globů – například abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/*.csv
  • kombinace souborů, složek a/nebo vzorů globbingu

mltable Flexibilita umožňuje materializaci dat do jednoho datového rámce z kombinace místních a cloudových prostředků úložiště a kombinací souborů, složek/globů. Příklad:

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])

Podporované formáty souborů

mltable podporuje následující formáty souborů:

  • Text s oddělovači (například soubory CSV): mltable.from_delimited_files(paths=[path])
  • Parquet: mltable.from_parquet_files(paths=[path])
  • Delta: mltable.from_delta_lake(paths=[path])
  • Formát řádků JSON: mltable.from_json_lines_files(paths=[path])

Příklady

Čtení souboru CSV

Aktualizujte zástupné symboly (<>) v tomto fragmentu kódu pomocí konkrétních podrobností:

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()

Čtení souborů parquet ve složce

Tento příklad ukazuje, jak mltable se dají použít vzory globu ( například zástupné cardy), aby se zajistilo, že se čtou jenom soubory parquet.

Aktualizujte zástupné symboly (<>) v tomto fragmentu kódu pomocí konkrétních podrobností:

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()

Čtení datových prostředků

Tato část ukazuje, jak získat přístup k datovým prostředkům azure machine Učení v Pandas.

Asset tabulky

Pokud jste v Azure Machine Učení (mltableneboli V1TabularDataset) vytvořili prostředek tabulky, můžete tento prostředek tabulky načíst do Pandas pomocí tohoto kódu:

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()

Asset souboru

Pokud jste registrovali prostředek souboru (například soubor CSV), můžete tento prostředek přečíst do datového rámce Pandas pomocí tohoto kódu:

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()

Asset složky

Pokud jste zaregistrovali asset složky (uri_folder nebo V1 FileDataset), například složku obsahující soubor CSV, můžete tento prostředek přečíst do datového rámce Pandas pomocí tohoto kódu:

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()

Poznámka ke čtení a zpracování velkých objemů dat pomocí Pandas

Tip

Pandas není navržený tak, aby zpracovával velké datové sady – Pandas dokáže zpracovávat pouze data, která se můžou vejít do paměti výpočetní instance.

U velkých datových sad doporučujeme použít Azure Machine Učení spravovaný Spark. To poskytuje rozhraní API PySpark Pandas.

Před vertikálním navýšením kapacity na vzdálenou asynchronní úlohu můžete chtít rychle iterovat menší podmnožinu velké datové sady. mltable poskytuje integrované funkce pro získání ukázek velkých dat pomocí metody 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()

Pomocí těchto operací můžete také vzít podmnožinu velkých dat:

Stahování dat pomocí azcopy nástroje

azcopy Pomocí nástroje stáhněte data do místního disku SSD hostitele (místní počítač, cloudový virtuální počítač, výpočetní instance Azure Učení compute) do místního systému souborů. Nástrojazcopy, který je předinstalovaný na výpočetní instanci Azure Machine Učení, to zvládne. Pokud nepoužíváte výpočetní instanci azure Učení nebo virtuální počítač Datová Věda (DSVM), možná budete muset nainstalovat azcopy. Další informace najdete v tématu azcopy .

Upozornění

Nedoporučujeme stahovat data do /home/azureuser/cloudfiles/code umístění výpočetní instance. Toto umístění je navržené tak, aby ukládaly artefakty poznámkového bloku a kódu, ne data. Čtení dat z tohoto umístění způsobí při trénování značné režijní náklady na výkon. Místo toho doporučujeme úložiště dat v úložišti home/azureuser, což je místní SSD výpočetního uzlu.

Otevřete terminál a vytvořte nový adresář, například:

mkdir /home/azureuser/data

Přihlášení k azcopy pomocí:

azcopy login

Dále můžete kopírovat data pomocí identifikátoru URI úložiště.

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

Další kroky