Partilhar via


Aceder a dados a partir do armazenamento na cloud do Azure durante o desenvolvimento interativo

APLICA-SE A: Python SDK azure-ai-ml v2 (atual)

Um projeto de aprendizado de máquina normalmente começa com análise exploratória de dados (EDA), pré-processamento de dados (limpeza, engenharia de recursos) e inclui a construção de protótipos de modelo de ML para validar hipóteses. Esta fase de projeto de prototipagem é altamente interativa por natureza, e presta-se ao desenvolvimento em um notebook Jupyter, ou em um IDE com um console interativo Python. Neste artigo, saiba como:

  • Acesse dados de um URI de Armazenamentos de Dados do Azure Machine Learning como se fosse um sistema de arquivos.
  • Materialize dados em Pandas usando a mltable biblioteca Python.
  • Materialize ativos de dados do Azure Machine Learning em Pandas usando a mltable biblioteca Python.
  • Materializar dados através de um download explícito com o azcopy utilitário.

Pré-requisitos

Gorjeta

As orientações neste artigo descrevem o acesso a dados durante o desenvolvimento interativo. Ele se aplica a qualquer host que possa executar uma sessão Python. Isso pode incluir sua máquina local, uma VM na nuvem, um GitHub Codespace, etc. Recomendamos o uso de uma instância de computação do Azure Machine Learning - uma estação de trabalho em nuvem totalmente gerenciada e pré-configurada. Para obter mais informações, visite Criar uma instância de computação do Azure Machine Learning.

Importante

Certifique-se de ter as bibliotecas , mltablee azure-ai-ml python mais recentes azure-fsspecinstaladas em seu ambiente Python:

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

A versão mais recente azure-fsspec do pacote pode mudar ao longo do tempo. Para obter mais informações sobre o azure-fsspec pacote, visite este recurso.

Acessar dados de um URI de armazenamento de dados, como um sistema de arquivos

Um armazenamento de dados do Azure Machine Learning é uma referência a uma conta de armazenamento existente do Azure. Os benefícios da criação e uso de armazenamento de dados incluem:

  • Uma API comum e fácil de usar para interagir com diferentes tipos de armazenamento (Blob/Files/ADLS).
  • Fácil descoberta de armazenamentos de dados úteis em operações de equipe.
  • Suporte de acesso baseado em credenciais (por exemplo, token SAS) e baseado em identidade (use ID do Microsoft Entra ou identidade mangada) para acessar dados.
  • Para acesso baseado em credenciais, as informações de conexão são protegidas, para anular a exposição de chaves em scripts.
  • Procure dados e copie e cole URIs de armazenamento de dados na interface do usuário do Studio.

Um URI de armazenamento de dados é um Identificador Uniforme de Recursos, que é uma referência a um local de armazenamento (caminho) em sua conta de armazenamento do Azure. Um URI de armazenamento de dados tem este formato:

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

Esses URIs de armazenamento de dados são uma implementação conhecida da especificação do sistema de arquivos (fsspec): uma interface pythonic unificada para sistemas de arquivos locais, remotos e incorporados e armazenamento de bytes. Primeiro, use pip para instalar o azureml-fsspec pacote e seu pacote de azureml-dataprep dependência. Em seguida, você pode usar a implementação do Azure Machine Learning Datastore fsspec .

A implementação do Repositório fsspec de Dados do Azure Machine Learning lida automaticamente com a passagem de credencial/identidade que o armazenamento de dados do Azure Machine Learning usa. Você pode evitar a exposição da chave de conta em seus scripts e procedimentos de entrada extras em uma instância de computação.

Por exemplo, você pode usar diretamente URIs Datastore no Pandas. Este exemplo mostra como ler um arquivo 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()

Gorjeta

Para evitar lembrar o formato URI do armazenamento de dados, você pode copiar e colar o URI do armazenamento de dados da interface do usuário do Studio com estas etapas:

  1. Selecione Dados no menu à esquerda e, em seguida, selecione a guia Armazenamentos de dados.
  2. Selecione o nome do armazenamento de dados e, em seguida , Procurar.
  3. Encontre o arquivo/pasta que deseja ler no Pandas e selecione as reticências (...) ao lado dele. Selecione Copiar URI no menu. Você pode selecionar o URI do Datastore para copiar em seu bloco de anotações/script. Captura de tela realçando a cópia do URI do armazenamento de dados.

Você também pode instanciar um sistema de arquivos do Azure Machine Learning para manipular comandos semelhantes a sistemas de arquivos - por exemplo ls, , glob, exists, open.

  • O ls() método lista arquivos em um diretório específico. Você pode usar ls(), ls(.), ls (<<folder_level_1>/<folder_level_2>) para listar arquivos. Apoiamos tanto '.' como '..', em caminhos relativos.
  • O glob() método suporta '*' e '**' globbing.
  • O exists() método retorna um valor Boolean que indica se um arquivo especificado existe no diretório raiz atual.
  • O open() método retorna um objeto semelhante a um arquivo, que pode ser passado para qualquer outra biblioteca que espera trabalhar com arquivos python. Seu código também pode usar esse objeto, como se fosse um objeto de arquivo python normal. Esses objetos semelhantes a arquivos respeitam o uso de with contextos, como mostrado neste exemplo:
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)

Carregar ficheiros através do 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 é o caminho local e rpath é o caminho remoto. Se as pastas especificadas ainda rpath não existirem, nós criamos as pastas para você.

Suportamos três modos de 'substituição':

  • APPEND: se existir um arquivo com o mesmo nome no caminho de destino, APPEND manterá o arquivo original
  • FAIL_ON_FILE_CONFLICT: Se existir um ficheiro com o mesmo nome no caminho de destino, FAIL_ON_FILE_CONFLICT gera um erro
  • MERGE_WITH_OVERWRITE: se existir um ficheiro com o mesmo nome no caminho de destino, MERGE_WITH_OVERWRITE substitui esse ficheiro existente pelo novo ficheiro

Baixar arquivos 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)

Exemplos

Estes exemplos mostram o uso da especificação do sistema de arquivos em cenários comuns.

Leia um único arquivo CSV no Pandas

Você pode ler um único arquivo CSV no Pandas como mostrado:

import pandas as pd

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

Leia uma pasta de arquivos CSV no Pandas

O método Pandas read_csv() não suporta a leitura de uma pasta de arquivos CSV. Para lidar com isso, glob os caminhos csv e concatená-los em um quadro de dados com o método Pandas concat() . O próximo exemplo de código mostra como obter essa concatenação com o sistema de arquivos do Azure Machine Learning:

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

Lendo arquivos CSV no Dask

Este exemplo mostra como ler um arquivo CSV em um quadro de dados 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()

Leia uma pasta de arquivos de parquet no Pandas

Como parte de um processo ETL, os arquivos Parquet são normalmente gravados em uma pasta, que pode emitir arquivos relevantes para o ETL, como progresso, confirmações, etc. Este exemplo mostra arquivos criados a partir de um processo ETL (arquivos começando com _) que, em seguida, produzem um arquivo parquet de dados.

Captura de tela mostrando o processo ETL do parquet.

Nesses cenários, você lê apenas os arquivos parquet na pasta e ignora os arquivos de processo ETL. Este exemplo de código mostra como os padrões glob podem ler somente arquivos parquet em uma pasta:

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

Acessando dados do seu sistema de arquivos Azure Databricks (dbfs)

A especificação do sistema de arquivos (fsspec) tem uma variedade de implementações conhecidas, incluindo o sistema de arquivos Databricks (dbfs).

Para acessar dados do dbfs recurso, você precisa:

  • Nome da instância, na forma de adb-<some-number>.<two digits>.azuredatabricks.net. Você pode encontrar esse valor na URL do seu espaço de trabalho do Azure Databricks.
  • Personal Access Token (PAT); para obter mais informações sobre a criação de PAT, visite Autenticação usando tokens de acesso pessoal do Azure Databricks

Com esses valores, você deve criar uma variável de ambiente para o token PAT em sua instância de computação:

export ADB_PAT=<pat_token>

Em seguida, você pode acessar dados no Pandas, como mostrado neste exemplo:

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)

Leitura de imagens com 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()

Exemplo de conjunto de dados personalizado do PyTorch

Neste exemplo, você cria um conjunto de dados personalizado do PyTorch para processar imagens. Assumimos que existe um ficheiro de anotações (em formato CSV), com esta estrutura geral:

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

As subpastas armazenam essas imagens, de acordo com seus rótulos:

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

Uma classe de conjunto de dados PyTorch personalizada deve implementar três funções: __init__, __len__e __getitem__, conforme mostrado aqui:

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

Em seguida, você pode instanciar o conjunto de dados, conforme mostrado aqui:

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)

Materialize dados em Pandas usando mltable a biblioteca

A mltable biblioteca também pode ajudar a acessar dados no armazenamento em nuvem. A leitura de dados em Pandas com mltable tem este formato geral:

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

Caminhos suportados

A mltable biblioteca suporta a leitura de dados tabulares de diferentes tipos de caminho:

Location Exemplos
Um caminho no computador local ./home/username/data/my_data
Um caminho em um servidor http(s) público(s) https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Um caminho no Armazenamento do Azure wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Um armazenamento de dados de longo prazo do Azure Machine Learning azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<wsname>/datastores/<name>/paths/<path>

Nota

mltable faz a passagem de credenciais do usuário para caminhos no Armazenamento do Azure e nos armazenamentos de dados do Azure Machine Learning. Se você não tiver permissão para acessar os dados no armazenamento subjacente, não poderá acessar os dados.

Arquivos, pastas e globs

mltable Suporta leitura de:

  • ficheiro(s) - por exemplo: abfss://<file_system>@<account_name>.dfs.core.windows.net/my-csv.csv
  • pasta(s) - por exemplo abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/
  • Padrão(s) glob - por exemplo abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/*.csv
  • uma combinação de arquivos, pastas e/ou padrões de globbing

mltable A flexibilidade permite a materialização de dados em um único dataframe, a partir de uma combinação de recursos de armazenamento local e em nuvem e combinações de arquivos/pastas/globs. Por exemplo:

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

Formatos de ficheiro suportados

mltable suporta os seguintes formatos de ficheiro:

  • Texto delimitado (por exemplo: ficheiros CSV): mltable.from_delimited_files(paths=[path])
  • Parquet: mltable.from_parquet_files(paths=[path])
  • Delta: mltable.from_delta_lake(paths=[path])
  • Formato de linhas JSON: mltable.from_json_lines_files(paths=[path])

Exemplos

Ler um ficheiro CSV

Atualize os espaços reservados (<>) neste trecho de código com seus detalhes específicos:

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

Ler arquivos parquet em uma pasta

Este exemplo mostra como mltable pode usar padrões glob - como curingas - para garantir que apenas os arquivos parquet sejam lidos.

Atualize os espaços reservados (<>) neste trecho de código com seus detalhes específicos:

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

Leitura de ativos de dados

Esta seção mostra como acessar seus ativos de dados do Azure Machine Learning no Pandas.

Ativo de tabela

Se você criou anteriormente um ativo de tabela no Aprendizado de Máquina do Azure (um mltable, ou um V1 TabularDataset), você pode carregar esse ativo de tabela no Pandas com este código:

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

Ativo de arquivo

Se você registrou um ativo de arquivo (um arquivo CSV, por exemplo), você pode ler esse ativo em um quadro de dados Pandas com este código:

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

Ativo de pasta

Se você registrou um ativo de pasta (uri_folder ou um V1 FileDataset) - por exemplo, uma pasta contendo um arquivo CSV - você pode ler esse ativo em um quadro de dados Pandas com este código:

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

Uma nota sobre a leitura e processamento de grandes volumes de dados com Pandas

Gorjeta

O Pandas não foi projetado para lidar com grandes conjuntos de dados. O Pandas só pode processar dados que cabem na memória da instância de computação.

Para grandes conjuntos de dados, recomendamos o uso do Azure Machine Learning gerenciado Spark. Isso fornece a API PySpark Pandas.

Talvez você queira iterar rapidamente em um subconjunto menor de um conjunto de dados grande antes de escalar para um trabalho assíncrono remoto. mltable Fornece funcionalidade integrada para obter amostras de dados grandes usando o método 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()

Você também pode usar subconjuntos de dados grandes com estas operações:

Download de dados usando o azcopy utilitário

Use o azcopy utilitário para baixar os dados para o SSD local do seu host (máquina local, VM na nuvem, Instância de Computação do Azure Machine Learning, etc.) no sistema de arquivos local. O azcopy utilitário, que é pré-instalado em uma instância de computação do Azure Machine Learning, lida com o download de dados. Se você não usar uma instância de computação do Azure Machine Learning ou uma DSVM (Máquina Virtual de Ciência de Dados), talvez seja necessário instalar azcopyo . Para mais informações, visite azcopy.

Atenção

Não recomendamos downloads de dados para o /home/azureuser/cloudfiles/code local em uma instância de computação. Esse local foi projetado para armazenar artefatos de bloco de anotações e códigos, não dados. A leitura de dados deste local incorrerá em uma sobrecarga de desempenho significativa durante o treinamento. Em vez disso, recomendamos o armazenamento de dados no home/azureuser, que é o SSD local do nó de computação.

Abra um terminal e crie um novo diretório, por exemplo:

mkdir /home/azureuser/data

Inicie sessão no azcopy usando:

azcopy login

Em seguida, você pode copiar dados usando um URI de armazenamento

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

Próximos passos