Načtení dat do AI Runtime

Důležité

Modul runtime AI pro úlohy s jedním uzlem je ve verzi Public Preview. Distribuované trénovací rozhraní API pro úlohy s více GPU zůstává v beta verzi.

Tato část popisuje informace o načítání dat v modulu runtime AI speciálně pro aplikace ML a DL. V tomto kurzu se dozvíte více o tom, jak načíst a transformovat data pomocí rozhraní Spark Python API.

Poznámka:

Vyžaduje se katalog Unity. Veškerý přístup k datům v modulu runtime AI prochází katalogem Unity. Vaše tabulky a svazky musí být zaregistrované v katalogu Unity a přístupné vašemu uživateli nebo služebnímu principálu.

Načítání tabulkových dat

Použijte Spark Connect k načtení tabulkových dat strojového učení z tabulek Delta.

Pro trénování s jedním uzlem můžete datové rámce Apache Sparku převést na datové rámce pandas pomocí metody toPandas() a pak volitelně převést na formát NumPy pomocí metody to_numpy().

Poznámka:

Spark Connect odkládá analýzu a řešení názvů na dobu provádění, což může změnit chování vašeho kódu. Viz Porovnání Spark Connect s Klasickým Sparkem.

Spark Connect podporuje většinu rozhraní API PySpark, včetně Spark SQL, rozhraní Pandas API ve Sparku, strukturovaném streamování a knihovně MLlib (založené na datovém rámci). Nejnovější podporovaná rozhraní API najdete v referenční dokumentaci k rozhraní API PySpark .

Další omezení najdete v tématu Omezení výpočetních prostředků bez serveru.

Načtení velkých tabulek Delta pomocí objemů

U velkých tabulek Delta, které jsou příliš velké na převod s toPandas(), exportujte data do svazku katalogu Unity a načtěte je přímo pomocí PyTorch nebo 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")

Tento přístup eliminuje režijní zátěž softwaru Spark během trénování a dobře funguje jak pro pracovní postupy s jednou GPU, tak pro distribuované tréninkové workflow.

Načtení nestrukturovaných dat ze svazků

Pro nestrukturovaná data, jako jsou obrázky, zvuk a textové soubory, použijte svazky katalogu Unity. Následující příklad ukazuje, jak číst soubory ze svazku a používat je s 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

Načtení dat uvnitř dekorátoru @distributed

Při použití Serverless GPU API pro distribuované trénování přesuňte kód načítání dat do dekorátoru @distributed. Velikost datové sady může překročit maximální velikost povolenou funkcí pickle, takže je doporučeno vygenerovat datovou sadu uvnitř dekorátoru, jak je znázorněno níže:

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

Výkon načítání dat

/Workspace a /Volumes adresáře jsou hostované ve vzdáleném úložišti Katalogu Unity. Pokud je vaše datová sada uložená v katalogu Unity, rychlost načítání dat je omezená dostupnou šířkou pásma sítě. Pokud trénujete více epoch, doporučeným přístupem je nejprve zkopírovat data místně, konkrétně do /tmp adresáře, který je hostovaný v rychlém úložišti SSD NVMe.

Pokud je vaše datová sada velká, můžou zvýšit výkon následující techniky:

  • Data můžete ukládat do mezipaměti místně pro více epochové trénování. Zkopírujte datové sady do /tmp pro rychlejší přístup napříč epochami.

    import shutil
    shutil.copytree("/Volumes/catalog/schema/volume/dataset", "/tmp/dataset")
    
  • Paralelizace načítání dat Pomocí torch DataLoaderu s více pracovními procesy můžete překrývat načítání dat pomocí výpočtů GPU. Nastavte num_workers na alespoň 2. Pokud chcete zvýšit výkon, zvyšte num_workers (což zvyšuje paralelní čtení) nebo prefetch_factor (což zvyšuje počet elementů, které každý pracovník předem načte):

    from torch.utils.data import DataLoader
    
    loader = DataLoader(
        dataset,
        batch_size=32,
        num_workers=2,
        prefetch_factor=2,
        pin_memory=True
    )
    
  • Pro velké tabulkové datové sady použijte Spark Connect. Spark Connect podporuje většinu rozhraní API PySpark a efektivně zpracovává distribuované čtení.

Streamování datových sad

U velmi velkých datových sad, které se nevejdou do paměti, použijte přístupy ke streamování: