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 ML-modellprototyper 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 i 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 Python-biblioteket
mltable
. - 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
- En Azure Machine Learning-arbetsyta. Mer information finns i Hantera Azure Machine Learning-arbetsytor i portalen eller med Python SDK (v2).
- Ett Azure Machine Learning-datalager. Mer information finns i Skapa datalager.
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
, mltable
och azure-ai-ml
python-biblioteken installerade i Python-miljön:
pip install -U azureml-fsspec==1.3.1 mltable azure-ai-ml
Den senaste azure-fsspec
paketversionen kan eventuellt ändras med tiden. Mer information om paketet finns i den här resursenazure-fsspec
.
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. Använd först pip för att 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 extra 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
För att undvika 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:
- Välj Data på den vänstra menyn och välj sedan fliken Datalager .
- Välj ditt datalagernamn och sedan Bläddra.
- 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.
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 avwith
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
ännu inte finns 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 APPEND den ursprungliga filen
- FAIL_ON_FILE_CONFLICT: om det finns en fil med samma namn i målsökvägen FAIL_ON_FILE_CONFLICT utlöser ett fel
- MERGE_WITH_OVERWRITE: om det finns en fil med samma namn i målsökvägen skriver MERGE_WITH_OVERWRITE över den befintliga filen 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. För att hantera detta kan du globera csv-sökvägarna 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.
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 resursen dbfs
behöver du:
- Instansnamn i form av
adb-<some-number>.<two digits>.azuredatabricks.net
. Du hittar det här värdet i URL:en för din Azure Databricks-arbetsyta. - Personlig åtkomsttoken (PAT); Mer information om hur du skapar PAT finns i Autentisering med personliga åtkomsttoken för Azure Databricks
Med dessa värden måste du skapa en miljövariabel för PAT-token på beräkningsinstansen:
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, som du ser här:
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 osv.) till det lokala filsystemet. Verktyget azcopy
, som är förinstallerat på en Azure Machine Learning-beräkningsinstans, hanterar nedladdningen av data. 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