Udostępnij za pośrednictwem


Ładowanie danych w środowisku uruchomieniowym sztucznej inteligencji

Ważna

Środowisko uruchomieniowe sztucznej inteligencji dla zadań z jednym węzłem jest w publicznej wersji zapoznawczej. Rozproszony interfejs API trenowania dla obciążeń z wieloma procesorami GPU pozostaje w wersji beta.

W tej sekcji opisano informacje dotyczące ładowania danych w środowisku uruchomieniowym sztucznej inteligencji specjalnie dla aplikacji ML i DL. Zapoznaj się z samouczkiem , aby dowiedzieć się więcej na temat ładowania i przekształcania danych przy użyciu interfejsu API języka Python platformy Spark.

Uwaga / Notatka

Unity Catalog jest wymagany. Cały dostęp do danych w AI Runtime odbywa się poprzez Unity Catalog. Tabele i zasoby muszą być zarejestrowane w katalogu Unity i dostępne dla użytkownika lub podmiotu usługowego.

Ładowanie danych tabelarycznych

Użyj programu Spark Connect, aby załadować tabelaryczne dane uczenia maszynowego z tabel delta.

W przypadku trenowania z jednym węzłem można przekonwertować ramki danych platformy Apache Spark na ramki danych biblioteki pandas przy użyciu metody toPandas(), a następnie opcjonalnie przekonwertować na format NumPy przy użyciu metody to_numpy().

Uwaga / Notatka

Spark Connect odracza analizę i rozpoznawanie nazw do czasu kompilacji, co może wpłynąć na sposób działania twojego kodu. Zobacz Porównanie programu Spark Connect z modelem klasycznym platformy Spark.

Narzędzie Spark Connect obsługuje większość interfejsów API PySpark, w tym Spark SQL, interfejs API Pandas na platformie Spark, uporządkowane przesyłanie strumieniowe oraz bibliotekę MLlib (opartą na ramkach danych). Aby uzyskać najnowsze obsługiwane interfejsy API, zobacz dokumentację interfejsu API PySpark .

Aby uzyskać informacje o innych ograniczeniach, zobacz Ograniczenia obliczeniowe bezserwerowe.

Ładowanie dużych tabel Delta za pomocą woluminów

W przypadku dużych tabel Delta, które są zbyt duże do konwersji za pomocą toPandas(), wyeksportuj dane do woluminu Unity Catalog i załaduj je bezpośrednio z użyciem PyTorch lub 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")

Takie podejście pozwala uniknąć narzutów platformy Spark podczas trenowania i działa dobrze zarówno w przypadku procesów trenowania pojedynczego GPU, jak i rozproszonej pracy trenowania.

Ładowanie danych nieustrukturyzowanych z woluminów

W przypadku danych bez struktury, takich jak obrazy, audio i pliki tekstowe, użyj woluminów Unity Catalog. W poniższym przykładzie pokazano, jak odczytywać pliki z dysku i korzystać z nich za pomocą biblioteki 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

Ładowanie danych wewnątrz dekoratora @distributed

Podczas korzystania z Serverless GPU API do rozproszonego trenowania, umieść kod ładowania danych wewnątrz dekoratora @distributed. Rozmiar zestawu danych może przekraczać maksymalny rozmiar dozwolony przez pickle, dlatego zaleca się wygenerować zestaw danych wewnątrz dekoratora, co przedstawiono poniżej.

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

Wydajność ładowania danych

/Workspace i /Volumes katalogi są hostowane na zdalnym magazynie Unity Catalog. Jeśli zestaw danych jest przechowywany w Unity Catalog, szybkość ładowania danych jest ograniczona przez dostępną szerokość pasma sieci. Jeśli trenujesz wiele epok, zalecane jest lokalne skopiowanie danych, w szczególności do katalogu /tmp, który jest hostowany na szybkim magazynie SSD NVMe.

Jeśli zestaw danych jest duży, następujące techniki mogą zwiększyć wydajność:

  • Buforuj dane lokalnie na potrzeby trenowania w wielu epokach. pl-PL: Skopiuj zestawy danych do /tmp, aby uzyskać szybszy dostęp między epokami:

    import shutil
    shutil.copytree("/Volumes/catalog/schema/volume/dataset", "/tmp/dataset")
    
  • Zrównoleglij pobieranie danych. Użyj torch DataLoader z wieloma pracownikami, aby zrównoleglić ładowanie danych z obliczeniami GPU. Ustaw num_workers wartość co najmniej 2. Aby zwiększyć wydajność, zwiększ num_workers (co zwiększa równoległe operacje odczytu) lub prefetch_factor (co zwiększa liczbę elementów wczytywanych przez każdego z pracowników):

    from torch.utils.data import DataLoader
    
    loader = DataLoader(
        dataset,
        batch_size=32,
        num_workers=2,
        prefetch_factor=2,
        pin_memory=True
    )
    
  • Użyj programu Spark Connect dla dużych zestawów danych tabelarycznych. Narzędzie Spark Connect obsługuje większość interfejsów API PySpark i efektywnie obsługuje rozproszone operacje odczytu.

Zestawy danych przesyłania strumieniowego

W przypadku bardzo dużych zestawów danych, które nie mieszczą się w pamięci, użyj metod przesyłania strumieniowego: