Mengakses data dari penyimpanan cloud Azure selama pengembangan interaktif

BERLAKU UNTUK: Python SDK azure-ai-ml v2 (saat ini)

Proyek pembelajaran mesin biasanya dimulai dengan analisis data eksploratif (EDA) dan praproses data (pembersihan, rekayasa fitur). Ini juga termasuk membangun prototipe model pembelajaran mesin untuk memvalidasi hipotesis. Fase proyek produksi prototipe ini sangat interaktif, dan sangat cocok untuk dikembangkan dalam notebook Jupyter atau dalam IDE dengan konsol Python interaktif. Dalam artikel ini, Anda akan mempelajari cara:

  • Mengakses data dari URI penyimpanan data Azure Machine Learning seolah-olah itu adalah sistem file.
  • Materialisasi aset data Azure Machine Learning ke Pandas dengan menggunakan mltable pustaka Python.
  • Mematerialisasi data dengan unduhan eksplisit menggunakan utilitas azcopy.

Prasyarat

Petunjuk / Saran

Panduan dalam artikel ini menjelaskan akses data selama pengembangan interaktif. Ini berlaku untuk host apa pun yang dapat menjalankan sesi Python. Host ini dapat menjadi komputer lokal Anda, VM cloud, GitHub Codespace, atau host lain. Gunakan instans komputasi Azure Machine Learning - stasiun kerja cloud yang dikelola sepenuhnya dan telah dikonfigurasi sebelumnya. Untuk informasi selengkapnya, lihat Membuat instans komputasi Azure Pembelajaran Mesin.

Penting

Pastikan Anda memiliki pustaka azure-fsspec, mltable, dan azure-ai-ml Python terbaru yang diinstal di lingkungan Python Anda.

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

Versi paket terbaru azure-fsspec dapat berubah dari waktu ke waktu. Untuk informasi selengkapnya tentang paket azure-fsspec, lihat azureml-fsspec 1.3.1.

Mengakses data dari URI datastore seperti yang Anda lakukan dari sistem file

Penyimpanan data Azure Machine Learning adalah referensi ke akun penyimpanan Azure yang sudah ada. Manfaat membuat dan menggunakan datastore meliputi:

  • API umum yang mudah digunakan untuk berinteraksi dengan berbagai jenis penyimpanan (blob, file, Azure Data Lake Storage).
  • Penemuan datastore yang berguna dengan mudah dalam operasi tim.
  • Dukungan untuk akses berbasis kredensial (misalnya, token SAS) dan berbasis identitas (ID Microsoft Entra atau identitas terkelola) ke data.
  • Untuk akses berbasis kredensial, informasi koneksi diamankan untuk menghindari paparan kunci dalam skrip.
  • Anda dapat menelusuri data dan menyalin dan menempelkan URI datastore di antarmuka pengguna studio Azure Machine Learning.

URI Datastore adalah Pengidentifikasi Sumber Daya Seragam, yang merupakan referensi ke lokasi penyimpanan (jalur) di akun penyimpanan Azure Anda. URI datastore memiliki format ini:

# 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 datastore ini adalah sebuah implementasi yang diketahui dari spesifikasi Filesystem (fsspec): antarmuka Pythonic terpadu untuk sistem file lokal, jarak jauh, dan tersemat serta penyimpanan data byte. Pertama, gunakan pip untuk menginstal azureml-fsspec paket dan paket dependensinya azureml-dataprep . Anda kemudian dapat menggunakan Azure Machine Learning untuk implementasi datastore fsspec.

Implementasi datastore fsspec Azure Machine Learning secara otomatis menangani penerusan kredensial/identitas yang digunakan oleh datastore Azure Machine Learning. Anda dapat menghindari paparan kunci akun dalam skrip dan prosedur masuk tambahan pada instans komputasi.

Misalnya, Anda dapat langsung menggunakan URI datastore di Pandas. Contoh ini menunjukkan cara membaca file 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()

Petunjuk / Saran

Untuk menghindari perlu mengingat format URI datastore, Anda dapat menyalin dan menempelkan URI datastore di antarmuka pengguna studio dengan mengambil langkah-langkah berikut:

  1. Pilih Data di menu sebelah kiri, lalu pilih tab Penyimpanan data .
  2. Pilih nama penyimpanan data Anda, lalu pilih Telusuri.
  3. Temukan file atau folder yang ingin Anda baca ke Pandas, pilih elipsis (...) di sampingnya, lalu pilih Salin URI. Anda kemudian dapat memilih URI datastore untuk disalin ke buku catatan atau skrip Anda. Cuplikan layar yang memperlihatkan cara menyalin URI datastore.

Anda juga dapat menginstansiasi Azure Machine Learning filesystem untuk menangani perintah yang menyerupai perintah sistem file, seperti ls, glob, exists, dan open.

  • Metode ini ls() mencantumkan file dalam direktori tertentu. Anda dapat menggunakan ls(), ls(.), dan ls (<folder_level_1>/<folder_level_2>) untuk mencantumkan file. Keduanya . dan .. didukung dalam jalur relatif.
  • Metode ini glob() mendukung * dan ** globbing.
  • Metode mengembalikan exists() nilai Boolean yang menunjukkan apakah file tertentu ada di direktori akar saat ini.
  • Metode open() mengembalikan objek mirip file yang dapat diteruskan ke pustaka lain yang dirancang untuk bekerja dengan file Python. Kode Anda juga dapat menggunakan objek ini seolah-olah itu adalah objek file Python normal. Objek seperti file ini menghormati penggunaan with konteks, seperti yang ditunjukkan dalam contoh ini:
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)

Mengunggah file dengan menggunakan 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 adalah jalur lokal, dan rpath merupakan jalur jarak jauh. Jika folder yang Anda tentukan di rpath tidak ada, metode tersebut akan membuat folder untuk Anda.

Metode ini mendukung tiga overwrite mode:

  • MENAMBAHKAN. Jika terdapat file dengan nama yang sama di jalur tujuan, APPEND mempertahankan file asli.
  • GAGAL_KONFLIK_BERKAS Jika file dengan nama yang sama ada di jalur tujuan, FAIL_ON_FILE_CONFLICT melemparkan kesalahan.
  • GABUNG_DENGAN_MENGGANTI. Jika file dengan nama yang sama ada di jalur tujuan, MERGE_WITH_OVERWRITE menimpa file yang ada dengan file baru.

Mengunduh file dengan menggunakan 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)

Contoh

Contoh-contoh ini menunjukkan cara menggunakan spesifikasi sistem file dalam skenario umum.

Membaca satu file CSV ke Pandas

Anda dapat membaca satu file CSV ke Pandas dengan menggunakan kode ini:

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

Membaca folder file CSV ke Pandas

Metode Pandas read_csv() tidak mendukung pembacaan folder file CSV. Untuk menangani batasan ini, gunakan glob untuk mendapatkan jalur CSV, dan menggabungkannya ke bingkai data dengan metode Pandas concat() . Sampel kode berikutnya menunjukkan cara mencapai perangkaian ini dengan menggunakan sistem file Azure Machine Learning:

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

Membaca file CSV ke Dask

Contoh ini menunjukkan cara membaca file CSV ke dalam bingkai data 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()

Membaca folder file parket ke Pandas

Selama proses ETL, file Parquet biasanya ditulis ke folder. Prosesnya kemudian dapat memancarkan file yang relevan dengan ETL, seperti kemajuan, penerapan, dan metadata lainnya. Contoh ini menunjukkan file yang dibuat dari proses ETL (file yang dimulai dengan _) yang kemudian menghasilkan file Parquet dari data.

Cuplikan layar memperlihatkan proses Parquet ETL.

Dalam skenario ini, Anda hanya akan membaca file Parquet yang ada di dalam folder. Anda mengabaikan file proses ETL. Sampel kode ini menunjukkan bagaimana pola glob hanya dapat membaca file Parquet dalam folder:

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

Mengakses data dari sistem file Azure Databricks Anda

Spesifikasi Filesystem (fsspec) memiliki berbagai implementasi yang diketahui, termasuk Sistem File Databricks (dbfs).

Untuk mengakses data dari dbfs sumber daya, Anda memerlukan:

Dengan nilai-nilai ini, buat variabel lingkungan untuk token PAT pada instans komputasi Anda:

export ADB_PAT=<personal_access_token>

Anda kemudian dapat mengakses data di Pandas, seperti yang ditunjukkan dalam contoh ini:

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)

Membaca gambar dengan 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(οΌ‰

Contoh himpunan data kustom PyTorch

Dalam contoh ini, Anda membuat himpunan data kustom PyTorch untuk memproses gambar. Dalam skenario ini, file anotasi (dalam format CSV) ada, dengan struktur keseluruhan ini:

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

Subfolder menyimpan gambar-gambar ini, sesuai dengan labelnya:

/
└── πŸ“images
    β”œβ”€β”€ πŸ“0
    β”‚   β”œβ”€β”€ πŸ“·image0.png
    β”‚   └── πŸ“·image1.png
    β”œβ”€β”€ πŸ“1
    β”‚   β”œβ”€β”€ πŸ“·image2.png
    β”‚   └── πŸ“·image3.png
    └── πŸ“2
        β”œβ”€β”€ πŸ“·image4.png
        └── πŸ“·image5.png

Kelas PyTorch Dataset kustom harus menerapkan tiga fungsi: __init__, , __len__dan __getitem__, seperti yang ditunjukkan di sini:

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

Anda kemudian dapat membuat instans himpunan data, seperti yang ditunjukkan di sini:

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)

Materialisasikan data ke dalam Pandas menggunakan pustaka mltable

Pustaka mltable juga dapat membantu Anda mengakses data di penyimpanan cloud. Untuk membaca data ke Panda dengan menggunakan mltable, gunakan format umum berikut:

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

Jalur yang didukung

Pustaka mltable mendukung pembacaan data tabular dari berbagai jenis jalur:

Lokasi Contoh
Jalur pada komputer lokal Anda ./home/username/data/my_data
Jalur pada server HTTP publik https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Jalur pada Azure Storage wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Datastore Azure Pembelajaran Mesin bentuk panjang azureml://subscriptions/<subscription_ID>/resourcegroups/<resource_group_name>/workspaces/<workspace_name>/datastores/<name>/paths/<path>

Catatan

Untuk jalur di penyimpanan data Azure Storage dan Azure Machine Learning, mltable menggunakan passthrough kredensial. Jika Anda tidak memiliki izin untuk mengakses data pada penyimpanan yang mendasar, Anda tidak dapat mengakses data.

File, folder, dan glob

mltable mendukung pembacaan dari:

  • File. Contohnya, abfss://<file_system>@<account_name>.dfs.core.windows.net/my-csv.csv.
  • Folder. Contohnya, abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/.
  • pola glob . Contohnya, abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/*.csv.
  • Kombinasi file, folder, dan/atau pola glob.

mltable memungkinkan materialisasi data menjadi satu kerangka data dari kombinasi sumber daya penyimpanan lokal dan cloud, dan dari kombinasi file, folder, dan glob. Contohnya:

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

Format file yang didukung

mltable mendukung format file berikut.

  • Teks yang dibatasi (misalnya, file CSV): mltable.from_delimited_files(paths=[path])
  • Parket: mltable.from_parquet_files(paths=[path])
  • Delta: mltable.from_delta_lake(paths=[path])
  • Format Baris JSON: mltable.from_json_lines_files(paths=[path])

Contoh

Membaca file CSV

Ganti placeholder (<>) dalam cuplikan kode ini dengan nilai Anda.

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

Membaca file Parquet dalam folder

Contoh ini menunjukkan cara mltable menggunakan pola glob , seperti wildcard, untuk memastikan bahwa hanya file Parquet yang dibaca.

Ganti placeholder (<>) dalam cuplikan kode ini dengan nilai Anda:

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

Membaca aset data

Bagian ini memperlihatkan cara mengakses aset data Azure Pembelajaran Mesin Anda di Pandas.

Aset tabel

Jika sebelumnya Anda membuat aset tabel di Azure Machine Learning (atau mltable V1 TabularDataset), Anda dapat memuat aset tabel tersebut ke Pandas dengan menggunakan kode ini:

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

Aset file

Jika Anda telah mendaftarkan aset file (file CSV, misalnya), Anda dapat membaca aset tersebut ke dalam bingkai data Pandas dengan menggunakan kode ini:

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

Aset folder

Jika Anda telah mendaftarkan aset folder (uri_folder atau V1 FileDataset), misalnya, folder yang berisi file CSV, Anda dapat membaca aset tersebut ke dalam bingkai data Pandas dengan menggunakan kode ini:

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

Membaca dan memproses volume data besar dengan menggunakan Panda

Petunjuk / Saran

Panda tidak dirancang untuk menangani himpunan data besar. Panda hanya dapat memproses data yang sesuai dengan memori instans komputasi.

Untuk himpunan data besar, gunakan Spark terkelola Azure Machine Learning. Layanan ini menyediakan API PySpark Pandas.

Anda mungkin ingin melakukan iterasi dengan cepat pada subset himpunan data besar yang lebih kecil sebelum meningkatkan skala ke pekerjaan asinkron jarak jauh. mltable menyediakan fungsionalitas untuk mendapatkan sampel data besar melalui metode 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()

Anda juga dapat mengambil subset data besar dengan menggunakan operasi ini:

Mengunduh data dengan menggunakan azcopy utilitas

azcopy Gunakan utilitas untuk mengunduh data ke dalam sistem file lokal SSD host Anda (komputer lokal, VM cloud, instans komputasi Azure Machine Learning, dan sebagainya). azcopy Utilitas, yang telah diinstal sebelumnya pada instans komputasi Azure Pembelajaran Mesin, menangani unduhan data. Jika Anda tidak menggunakan instans komputasi Azure Machine Learning atau Data Science Virtual Machine (DSVM), Anda mungkin perlu menginstal azcopy. Untuk informasi selengkapnya, lihat azcopy.

Perhatian

Jangan mengunduh data ke /home/azureuser/cloudfiles/code lokasi pada instans komputasi. Lokasi ini dirancang untuk menyimpan artefak buku catatan dan kode, bukan data. Membaca data dari lokasi ini menimbulkan beban kinerja yang signifikan selama pelatihan. Sebagai gantinya, simpan data di lokasi home/azureuser, yaitu SSD lokal dari simpul komputasi.

Buka terminal dan buat direktori baru, misalnya:

mkdir /home/azureuser/data

Masuk ke azcopy:

azcopy login

Sekarang Anda dapat menyalin data dengan menggunakan URI penyimpanan:

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

Langkah berikutnya