Delen via


Gegevens laden in AI Runtime

Belangrijk

AI Runtime voor taken met één knooppunt bevindt zich in openbare preview. De gedistribueerde trainings-API voor workloads met meerdere GPU's blijft bèta.

In deze sectie wordt informatie behandeld over het laden van gegevens in AI Runtime, specifiek voor ML- en DL-toepassingen. Raadpleeg de zelfstudie voor meer informatie over het laden en transformeren van gegevens met behulp van de Spark Python-API.

Opmerking

Unity Catalog is vereist. Alle gegevenstoegang in AI Runtime gaat via Unity Catalog. Uw tabellen en volumes moeten zijn geregistreerd in Unity Catalog en toegankelijk zijn voor uw gebruiker of service-principal.

Tabulaire gegevens laden

Gebruik Spark Connect om machine learning-gegevens uit Delta-tabellen in tabelvorm te laden.

Voor training met één knooppunt kunt u Apache Spark DataFrames converteren naar pandas DataFrames met behulp van de PySpark-methodetoPandas() en optioneel converteren naar NumPy-indeling met behulp van de PySpark-methodeto_numpy().

Opmerking

Spark Connect zorgt ervoor dat analyse en naamomzetting worden uitgesteld tot uitvoeringstijd, waardoor het gedrag van uw code kan worden gewijzigd. Zie Spark Connect vergelijken met Spark Classic.

Spark Connect ondersteunt de meeste PySpark-API's, waaronder Spark SQL, Pandas-API op Spark, Structured Streaming en MLlib (op basis van DataFrame). Raadpleeg de referentiedocumentatie voor de PySpark-API voor de meest recente ondersteunde API's.

Zie Serverloze rekenbeperkingen voor andere beperkingen.

Grote Delta-tabellen laden door gebruik te maken van volumes

Voor grote Delta-tabellen die te groot zijn om mee te converteren toPandas(), exporteert u de gegevens naar een Unity Catalog-volume en laadt u deze rechtstreeks met behulp van PyTorch of Hugging Face:

# Step 1: Export the Delta table to Parquet files in a UC volume
output_path = "/Volumes/catalog/schema/my_volume/training_data"
spark.table("catalog.schema.my_table").write.mode("overwrite").parquet(output_path)
# Step 2: Load the exported data directly using Hugging Face datasets
from datasets import load_dataset

dataset = load_dataset("parquet", data_files="/Volumes/catalog/schema/my_volume/training_data/*.parquet")

Deze aanpak voorkomt spark-overhead tijdens de training en werkt goed voor zowel één GPU als gedistribueerde trainingswerkstromen.

Ongestructureerde gegevens uit volumes laden

Gebruik Unity Catalog-volumes voor ongestructureerde gegevens, zoals afbeeldingen, audio en tekstbestanden. In het volgende voorbeeld ziet u hoe u bestanden van een volume leest en gebruikt met een PyTorch Dataset:

# Read files from a UC volume
volume_path = "/Volumes/catalog/schema/my_volume/images/"

from torch.utils.data import Dataset
import os
from PIL import Image

class ImageDataset(Dataset):
    def __init__(self, root_dir):
        self.file_list = [os.path.join(root_dir, f) for f in os.listdir(root_dir)]

    def __len__(self):
        return len(self.file_list)

    def __getitem__(self, idx):
        img = Image.open(self.file_list[idx])
        return img

Het laden van gegevens in de @distributed decorator

Wanneer u de serverloze GPU-API gebruikt voor gedistribueerde training, verplaatst u de code voor het laden van gegevens binnen de @distributed decorator. De datasetgrootte kan groter zijn dan de maximale grootte die is toegestaan door de module pickle, dus het wordt aanbevolen om de dataset in de decorator te genereren, zoals hieronder getoond.

from serverless_gpu import distributed

# This may cause a pickle error if the dataset is too large
dataset = get_dataset(file_path)

@distributed(gpus=8, gpu_type='H100')
def run_train():
    # Load data inside the decorator to avoid pickle serialization issues
    dataset = get_dataset(file_path)
    ...

Prestaties van het laden van gegevens

/Workspace en /Volumes directory's worden gehost op externe Unity Catalog-opslag. Als uw gegevensset is opgeslagen in Unity Catalog, wordt de laadsnelheid van gegevens beperkt door de beschikbare netwerkbandbreedte. Als u meerdere tijdvakken traint, is de aanbevolen methode om eerst de gegevens lokaal te kopiëren, met name naar de /tmp map, die wordt gehost op snelle NVMe SSD-opslag.

Als uw gegevensset groot is, kunnen de volgende technieken de prestaties verbeteren:

  • Cachegegevens lokaal opslaan voor training met meerdere epochs. Kopieer gegevenssets naar /tmp voor snellere toegang in verschillende tijdvakken:

    import shutil
    shutil.copytree("/Volumes/catalog/schema/volume/dataset", "/tmp/dataset")
    
  • Het ophalen van gegevens parallel uitvoeren. Gebruik de torch DataLoader met meerdere werkrollen om het laden van gegevens te overlappen met GPU-berekeningen. Ingesteld num_workers op ten minste 2. Als u de prestaties wilt verbeteren, verhoog num_workers (dit vergroot parallelle leescapaciteit) of prefetch_factor (dit verhoogt het aantal items dat elke werker vooraf laadt):

    from torch.utils.data import DataLoader
    
    loader = DataLoader(
        dataset,
        batch_size=32,
        num_workers=2,
        prefetch_factor=2,
        pin_memory=True
    )
    
  • Spark Connect gebruiken voor grote gegevenssets in tabelvorm. Spark Connect ondersteunt de meeste PySpark-API's en verwerkt gedistribueerde leesbewerkingen efficiënt.

Streaminggegevenssets

Gebruik streamingmethoden voor zeer grote gegevenssets die niet in het geheugen passen: