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.

Laad trainingsgegevens in AI Runtime voor machine learning- en Deep Learning-workloads. Alle gegevenstoegang gaat via Unity Catalog: gebruik Spark Connect om tabelgegevens uit Delta-tabellen te lezen en Unity Catalog-volumes voor grote gegevenssets en ongestructureerde bestanden, zoals afbeeldingen, audio en tekst. Voor training met meerdere epochs cachet u gegevens lokaal naar /tmp voor snellere toegang. Zie de zelfstudie voor meer informatie over het laden en transformeren van gegevens met 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 met UCVolumeDataset

Gebruik voor ongestructureerde gegevens, zoals afbeeldingen, audiobestanden en tekstbestanden die zijn opgeslagen in Unity Catalog-volumes, UCVolumeDataset uit het pakket serverless_gpu.data. UCVolumeDataset is een PyTorch IterableDataset waarmee elk bestand van het volume naar een snelle lokale cache wordt gekopieerd bij eerste toegang en het lokale bestandspad in de cache wordt gegenereerd. Hiermee worden de prestatie- en distributieproblemen afgehandeld die u anders handmatig zou implementeren:

  • Lokale cache. Bestanden worden gekopieerd van de FUSE-koppeling naar een lokale cachemap bij eerste toegang en worden daarna vanuit de cache geleverd, zodat training met meerdere tijdsperioden het volume niet opnieuw leest.
  • Automatisch partitioneren. Wanneer torch.distributed wordt geïnitialiseerd, worden bestanden verdeeld over ranks en vervolgens verder verdeeld over DataLoader workers, zodat elk (rank, worker)-paar een niet-overlappend deel ontvangt zonder extra configuratie.

Opmerking

UCVolumeDataset en serverless_gpu.data.DataLoader vereist GPU-omgeving 5 of hoger.

UCVolumeDataset levert onbewerkte lokale bestandspaden op. Als u deze bestanden in tensors wilt decoderen, verpakt u deze in een seconde IterableDataset die de padstroom verbruikt en past u uw parseerlogica toe. Hierdoor blijven I/O- en parseringsproblemen gescheiden.

from serverless_gpu.data import UCVolumeDataset
from torch.utils.data import IterableDataset
from PIL import Image
import torchvision.transforms.functional as TF

class ImageDataset(IterableDataset):
    """Decodes each cached file path from UCVolumeDataset into a tensor."""

    def __init__(self, path_dataset: UCVolumeDataset):
        self._path_dataset = path_dataset

    def __iter__(self):
        for local_path in self._path_dataset:
            image = Image.open(local_path).convert("RGB")
            yield TF.to_tensor(image)

path_dataset = UCVolumeDataset("/Volumes/catalog/schema/my_volume/images")
dataset = ImageDataset(path_dataset)

De wrapper ontvangt reeds gecachete lokale paden, zodat de parsestap de FUSE-koppeling nooit benadert. U kunt extra wrappers koppelen voor uitbreiding, tokenisatie of filteren.

Voor optimale prestaties combineert u UCVolumeDataset met serverless_gpu.data.DataLoader in plaats van de standaard-PyTorch DataLoader. Het is afgestemd op serverloze GPU I/O en haalt bestanden gelijktijdig op en slaat bestanden op terwijl de GPU wordt berekend. Bekijk de prestaties van het laden van gegevens.

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

Wanneer u in de decorator een UCVolumeDataset construeert, leest deze tijdens het itereren rankinformatie uit torch.distributed en verdeelt bestanden automatisch over ranks, zodat u voor op bestanden gebaseerde volumegegevens geen DistributedSampler nodig hebt.

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 epochs traint, is de aanbevolen aanpak om UCVolumeDataset te gebruiken, dat deze cache voor u beheert: het kopieert elk bestand bij de eerste toegang naar de lokale opslag en voert volgende leesbewerkingen uit vanaf de lokale kopie. Voor datasets in volumes heeft dit de voorkeur boven een handmatige shutil.copytree, omdat daarbij vooraf de volledige mapstructuur wordt gekopieerd, zelfs als de training slechts een deel ervan gebruikt.

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

  • Gebruik serverless_gpu.data.DataLoader om het ophalen te parallelliseren. Dit is een direct vervangbare subklasse van torch DataLoader, afgestemd op serverless GPU-I/O: num_workers staat standaard op 6 en prefetch_factor op 4 (vergeleken met 0 en 2 in PyTorch), zodat bestanden gelijktijdig worden opgehaald en gecachet terwijl de GPU berekeningen uitvoert. Ook worden de tijdsinstellingen voor ophalen per batch bij de actieve MLflow-uitvoering in een logboek opgeslagen, zodat u knelpunten voor het laden van gegevens kunt herkennen.

    from serverless_gpu.data import DataLoader
    
    loader = DataLoader(
        dataset,
        batch_size=32,
        pin_memory=True,
        # num_workers=6, by default
        # prefetch_factor=4, by default
        # raise num_workers to increase parallel reads, or prefetch_factor to deepen each worker's queue.
    )
    

    Alle rangen moeten dezelfde num_workers-waarde gebruiken, omdat UCVolumeDataset bestanden partitioneert met een globale stride over world_size × num_workers slots. Niet-overeenkomende waarden zorgen ervoor dat bestanden worden gedupliceerd of overgeslagen.

  • Verhoog de batchgrootte. Grotere batches spreiden de overhead van het laden van gegevens per batch over meer voorbeelden en verminderen het aantal bestandsophaalbewerkingen per stap. Als GPU-geheugen de beperkende factor is, combineert u een grotere batchgrootte met verloopaccumulatie om de effectieve batchgrootte te behouden.

Streaminggegevenssets

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