Få åtkomst till data från Azure-molnlagring under interaktiv utveckling

GÄLLER FÖR: Python SDK azure-ai-ml v2 (aktuell)

Ett maskininlärningsprojekt börjar vanligtvis med undersökande dataanalys (EDA), förbearbetning av data (rengöring, funktionsteknik) och omfattar att skapa prototyper av ML-modeller för att validera hypoteser. Den här prototypprojektfasen är mycket interaktiv till sin natur och lämpar sig för utveckling i en Jupyter-anteckningsbok eller en IDE med en interaktiv Python-konsol. I den här artikeln lär du dig att:

  • Få åtkomst till data från en Azure Machine Learning Datastores-URI som om det vore ett filsystem.
  • Materialisera data till Pandas med hjälp av mltable Python-biblioteket.
  • Materialisera Azure Machine Learning-datatillgångar till Pandas med hjälp av mltable Python-biblioteket.
  • Materialisera data via en explicit nedladdning med azcopy verktyget.

Förutsättningar

Dricks

Vägledningen i den här artikeln beskriver dataåtkomst under interaktiv utveckling. Den gäller för alla värdar som kan köra en Python-session. Detta kan omfatta din lokala dator, en virtuell molndator, ett GitHub Codespace osv. Vi rekommenderar att du använder en Azure Machine Learning-beräkningsinstans – en fullständigt hanterad och förkonfigurerad molnarbetsstation. Mer information finns i Skapa en Azure Machine Learning-beräkningsinstans.

Viktigt!

Se till att du har de senaste azure-fsspec biblioteken och mltable python-biblioteken installerade i python-miljön:

pip install -U azureml-fsspec mltable

Komma åt data från en URI för datalager, till exempel ett filsystem

Ett Azure Machine Learning-datalager är en referens till ett befintligt Azure Storage-konto. Fördelarna med att skapa och använda datalager är:

  • Ett vanligt, lätt att använda API för att interagera med olika lagringstyper (Blob/Files/ADLS).
  • Enkel identifiering av användbara datalager i teamåtgärder.
  • Stöd för både autentiseringsbaserad (till exempel SAS-token) och identitetsbaserad åtkomst (använd Microsoft Entra-ID eller hanterad identitet) för att få åtkomst till data.
  • För åtkomst baserad på autentiseringsuppgifter skyddas anslutningsinformationen för att annullera nyckelexponering i skript.
  • Bläddra bland data och kopiera och klistra in URI:er för datalager i Studio-användargränssnittet.

En URI för datalager är en enhetlig resursidentifierare, som är en referens till en lagringsplats (sökväg ) på ditt Azure Storage-konto. En URI för datalager har det här formatet:

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

Dessa URI:er för datalager är en känd implementering av Filsystemspecifikationen (fsspec): ett enhetligt python-gränssnitt till lokala, fjärranslutna och inbäddade filsystem och bytelagring. Du kan pip installera azureml-fsspec paketet och dess beroendepaket azureml-dataprep . Sedan kan du använda Azure Machine Learning Datastore-implementeringen fsspec .

Azure Machine Learning Datastore-implementeringen fsspec hanterar automatiskt autentiseringsuppgifterna/identitetsgenomströmningen som Azure Machine Learning-dataarkivet använder. Du kan undvika både kontonyckelexponering i dina skript och ytterligare inloggningsprocedurer på en beräkningsinstans.

Du kan till exempel direkt använda Datastore-URI:er i Pandas. Det här exemplet visar hur du läser en CSV-fil:

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

Dricks

I stället för att komma ihåg URI-formatet för datalager kan du kopiera och klistra in datalager-URI:n från Studio-användargränssnittet med följande steg:

  1. Välj Data på den vänstra menyn och välj sedan fliken Datalager .
  2. Välj ditt datalagernamn och sedan Bläddra.
  3. Leta upp den fil/mapp som du vill läsa i Pandas och välj ellipsen (...) bredvid den. Välj Kopiera URI på menyn. Du kan välja den Datastore-URI som ska kopieras till notebook-filen/skriptet. Screenshot highlighting the copy of the datastore URI.

Du kan också instansiera ett Azure Machine Learning-filsystem för att hantera filsystemliknande kommandon, till exempel ls, glob, exists, open.

  • Metoden ls() visar filer i en specifik katalog. Du kan använda ls(), ls(.), ls (<<folder_level_1>/<folder_level_2>) för att visa filer. Vi stöder både "." och ".", i relativa sökvägar.
  • Metoden glob() stöder "*" och "**" globbing.
  • Metoden exists() returnerar ett booleskt värde som anger om en angiven fil finns i den aktuella rotkatalogen.
  • Metoden open() returnerar ett filliknande objekt som kan skickas till alla andra bibliotek som förväntar sig att arbeta med Python-filer. Koden kan också använda det här objektet, som om det vore ett normalt Python-filobjekt. Dessa filliknande objekt respekterar användningen av with kontexter, som du ser i det här exemplet:
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)

Ladda upp filer via AzureMachineLearningFileSystem

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 är den lokala sökvägen och rpath är fjärrsökvägen. Om de mappar som du anger i rpath inte finns ännu skapar vi mapparna åt dig.

Vi stöder tre överskrivningslägen:

  • TILLÄGG: Om det finns en fil med samma namn i målsökvägen behåller den ursprungliga filen
  • FAIL_ON_FILE_CONFLICT: Om det finns en fil med samma namn i målsökvägen utlöser detta ett fel
  • MERGE_WITH_OVERWRITE: Om det finns en fil med samma namn i målsökvägen skrivs den befintliga filen över med den nya filen

Ladda ned filer via AzureMachineLearningFileSystem

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

Exempel

De här exemplen visar hur filsystemspecifikationen används i vanliga scenarier.

Läsa en enda CSV-fil i Pandas

Du kan läsa en enskild CSV-fil i Pandas enligt följande:

import pandas as pd

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

Läsa en mapp med CSV-filer i Pandas

Pandas-metoden read_csv() stöder inte läsning av en mapp med CSV-filer. Du måste glob csv-sökvägar och sammanfoga dem till en dataram med Pandas-metoden concat() . Nästa kodexempel visar hur du uppnår den här sammanlänkningen med Azure Machine Learning-filsystemet:

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

Läsa CSV-filer i Dask

Det här exemplet visar hur du läser en CSV-fil i en Dask-dataram:

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

Läsa en mapp med parquet-filer i Pandas

Som en del av en ETL-process skrivs Parquet-filer vanligtvis till en mapp, som sedan kan generera filer som är relevanta för ETL, till exempel förlopp, incheckningar osv. Det här exemplet visar filer som skapats från en ETL-process (filer som börjar med ) som sedan skapar en parquetfil med _data.

Screenshot showing the parquet etl process.

I dessa scenarier läser du bara parquet-filerna i mappen och ignorerar ETL-processfilerna. Det här kodexemplet visar hur globmönster kan läsa endast parquet-filer i en mapp:

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

Komma åt data från ditt Azure Databricks-filsystem (dbfs)

Filsystemsspecifikationen (fsspec) har en rad kända implementeringar, inklusive Databricks-filsystemet (dbfs).

För att komma åt data från dbfs behöver du:

Med dessa värden måste du skapa en miljövariabel på beräkningsinstansen för PAT-token:

export ADB_PAT=<pat_token>

Du kan sedan komma åt data i Pandas som du ser i det här exemplet:

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)

Läsa bilder med 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()

Exempel på anpassad PyTorch-datauppsättning

I det här exemplet skapar du en anpassad PyTorch-datauppsättning för bearbetning av bilder. Vi antar att det finns en anteckningsfil (i CSV-format) med den här övergripande strukturen:

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

Undermappar lagrar dessa bilder enligt deras etiketter:

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

En anpassad PyTorch Dataset-klass måste implementera tre funktioner: __init__, __len__och __getitem__, enligt följande:

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

Du kan sedan instansiera datauppsättningen enligt följande:

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)

Materialisera data till Pandas med hjälp av mltable biblioteket

Biblioteket mltable kan också hjälpa dig att komma åt data i molnlagring. Att läsa data i Pandas med mltable har det här allmänna formatet:

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

Sökvägar som stöds

Biblioteket mltable stöder läsning av tabelldata från olika sökvägstyper:

Plats Exempel
En sökväg på den lokala datorn ./home/username/data/my_data
En sökväg på en offentlig http-server https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
En sökväg i Azure Storage wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Ett långformat Azure Machine Learning-datalager azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<wsname>/datastores/<name>/paths/<path>

Kommentar

mltable utför genomströmning av användarautentiseringsuppgifter för sökvägar i Azure Storage- och Azure Machine Learning-datalager. Om du inte har behörighet att komma åt data på den underliggande lagringen kan du inte komma åt data.

Filer, mappar och globs

mltable stöder läsning från:

  • file(s) – till exempel: abfss://<file_system>@<account_name>.dfs.core.windows.net/my-csv.csv
  • folder(s) – till exempel abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/
  • globmönster – till exempel abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/*.csv
  • en kombination av filer, mappar och/eller globbande mönster

mltable flexibilitet möjliggör datamaterialisering i en enda dataram, från en kombination av lokala och molnbaserade lagringsresurser och kombinationer av filer/mapp/globs. Till exempel:

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

Filformat som stöds

mltable stöder följande filformat:

  • Avgränsad text (till exempel CSV-filer): mltable.from_delimited_files(paths=[path])
  • Parquet: mltable.from_parquet_files(paths=[path])
  • Delta: mltable.from_delta_lake(paths=[path])
  • JSON-linjeformat: mltable.from_json_lines_files(paths=[path])

Exempel

Läsa en CSV-fil

Uppdatera platshållarna (<>) i det här kodfragmentet med din specifika information:

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

Läsa parquet-filer i en mapp

Det här exemplet visar hur mltable du kan använda globmönster – till exempel jokertecken – för att säkerställa att endast parquet-filerna läse.

Uppdatera platshållarna (<>) i det här kodfragmentet med din specifika information:

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

Läsa datatillgångar

Det här avsnittet visar hur du kommer åt dina Azure Machine Learning-datatillgångar i Pandas.

Tabelltillgång

Om du tidigare har skapat en tabelltillgång i Azure Machine Learning (en mltable, eller en V1 TabularDataset) kan du läsa in tabelltillgången i Pandas med den här koden:

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

Filtillgång

Om du har registrerat en filtillgång (till exempel en CSV-fil) kan du läsa tillgången i en Pandas-dataram med den här koden:

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

Mapptillgång

Om du har registrerat en mapptillgång (uri_folder eller en V1 FileDataset) – till exempel en mapp som innehåller en CSV-fil – kan du läsa tillgången i en Pandas-dataram med den här koden:

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

En anteckning om att läsa och bearbeta stora datavolymer med Pandas

Dricks

Pandas är inte utformat för att hantera stora datamängder – Pandas kan bara bearbeta data som får plats i beräkningsinstansens minne.

För stora datamängder rekommenderar vi användning av Azure Machine Learning managed Spark. Detta tillhandahåller PySpark Pandas-API:et.

Du kanske vill iterera snabbt på en mindre delmängd av en stor datamängd innan du skalar upp till ett asynkront fjärrjobb. mltable innehåller inbyggda funktioner för att hämta exempel på stora data med hjälp av metoden 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()

Du kan också ta delmängder av stora data med dessa åtgärder:

Ladda ned data med hjälp av azcopy verktyget

azcopy Använd verktyget för att ladda ned data till den lokala SSD:n för din värd (lokal dator, virtuell molndator, Azure Machine Learning Compute Instance) till det lokala filsystemet. Verktyget azcopy , som är förinstallerat på en Azure Machine Learning-beräkningsinstans, hanterar detta. Om du inte använder en Azure Machine Learning-beräkningsinstans eller en Datavetenskap virtuell dator (DSVM) kan du behöva installera azcopy. Mer information finns i azcopy .

Varning

Vi rekommenderar inte att data laddas ned till platsen /home/azureuser/cloudfiles/code på en beräkningsinstans. Den här platsen är utformad för att lagra notebook- och kodartefakter, inte data. Läsning av data från den här platsen medför betydande prestandaomkostnader vid träning. I stället rekommenderar vi datalagring i home/azureuser, som är den lokala SSD:en för beräkningsnoden.

Öppna en terminal och skapa en ny katalog, till exempel:

mkdir /home/azureuser/data

Logga in på azcopy med hjälp av:

azcopy login

Sedan kan du kopiera data med hjälp av en lagrings-URI

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

Nästa steg