Megosztás a következőn keresztül:


Adatok betöltése az AI futtatókörnyezetben

Fontos

Az egycsomópontos feladatokhoz készült AI-futtatókörnyezet nyilvános előzetes verzióban érhető el. A több GPU-s számítási feladatok elosztott betanítási API-ja a bétaverzióban marad.

Ez a szakasz a kifejezetten ML- és DL-alkalmazásokhoz készült AI-futtatókörnyezet adatainak betöltésével kapcsolatos információkat ismerteti. Az oktatóanyagból megtudhatja, hogyan tölthet be és alakíthat át adatokat a Spark Python API használatával.

Megjegyzés:

A Unity-katalógusra szükség van. Az AI-futtatókörnyezet összes adathozzáférése a Unity Katalóguson keresztül történik. A táblákat és köteteket regisztrálni kell a Unity Katalógusban, és elérhetővé kell tenni a felhasználó vagy a szolgáltatásnév számára.

Táblázatos adatok betöltése

A Spark Connect használatával táblázatos gépi tanulási adatokat tölthet be Delta-táblákból.

Az egycsomópontos betanításhoz az Apache Spark DataFrame-eket a PySpark metódussaltoPandas() pandas DataFrame-ekre konvertálhatja, majd opcionálisan NumPy formátumra konvertálhatja a PySpark metódussalto_numpy().

Megjegyzés:

A Spark Connect elhalasztja az elemzést és a névfeloldást a végrehajtási időre, ami megváltoztathatja a kód viselkedését. Lásd a Spark Connect és a Klasszikus Spark összehasonlítása című témakört.

A Spark Connect a legtöbb PySpark API-t támogatja, beleértve a Spark SQL-t, a Sparkon futó Pandas API-t, a strukturált streamelést és az MLlib-t (DataFrame-alapú). Tekintse meg a PySpark API referenciadokumentációját a legújabb támogatott API-khoz.

További korlátozásokért lásd a kiszolgáló nélküli számítási korlátozásokat.

Nagyméretű Delta-táblák betöltése tárterületek segítségével

Delta nagytáblák esetén, amelyek túl nagyok ahhoz, hogy a toPandas() funkcióval átalakíthatók legyenek, exportálja az adatokat egy Unity Catalog-kötetbe, és töltse be közvetlenül a PyTorch vagy a Hugging Face használatával.

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

Ez a megközelítés elkerüli a Spark terhelését a betanítás során, és jól működik az egy GPU-s és az elosztott betanítási munkafolyamatok esetében is.

Strukturálatlan adatok betöltése kötetekből

Strukturálatlan adatok, például képek, hang- és szövegfájlok esetén használja a Unity Catalog köteteit. Az alábbi példa bemutatja, hogyan olvashat fájlokat egy kötetből, és hogyan használhatja őket PyTorch Datasethasználatával:

# 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

Adatok betöltése a dekorátoron @distributed belül

Ha kiszolgáló nélküli GPU API-t használ az elosztott betanításhoz, helyezze át az adatbetöltési kódot a @distributed dekorátorba. Az adathalmaz mérete meghaladhatja a pickle által megengedett maximális méretet, ezért javasoljuk, hogy az adathalmazt a dekorátoron belül hozza létre, az alábbiak szerint:

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

Adatbetöltési teljesítmény

/Workspace és /Volumes a címtárak távoli Unity Catalog-tárolóban vannak tárolva. Ha az adathalmaz a Unity Katalógusban van tárolva, az adatbetöltés sebességét a rendelkezésre álló hálózati sávszélesség korlátozza. Ha több epochot tanít be, az ajánlott módszer, hogy először másolja le az adatokat helyileg, közvetlenül a gyors NVMe SSD tárhelyen található /tmp könyvtárba.

Ha az adathalmaz nagy, az alábbi technikák javíthatják a teljesítményt:

  • Cache adatok helyi tárolása több-korszakos betanításhoz. Adathalmazok másolása a /tmp helyre a gyorsabb hozzáférés érdekében az egyes korszakok során.

    import shutil
    shutil.copytree("/Volumes/catalog/schema/volume/dataset", "/tmp/dataset")
    
  • Párhuzamosítsa az adatbeolvasást. Használja a torch DataLoader-t több munkafolyamattal az adatbetöltés és a GPU-számítás átfedésének eléréséhez. Állítsa num_workers be legalább 2 értékre. A teljesítmény javítása érdekében növelje num_workers (ami növeli a párhuzamos olvasást) vagy prefetch_factor (ami növeli az egyes munkavállalók által előre letöltött elemek számát):

    from torch.utils.data import DataLoader
    
    loader = DataLoader(
        dataset,
        batch_size=32,
        num_workers=2,
        prefetch_factor=2,
        pin_memory=True
    )
    
  • Nagy táblázatos adathalmazokhoz használja a Spark Connectet. A Spark Connect a legtöbb PySpark API-t támogatja, és hatékonyan kezeli az elosztott olvasásokat.

Streamelési adatkészletek

Nagyon nagy adathalmazok esetén, amelyek nem férnek el a memóriában, használjon streamelési módszereket: