다음을 통해 공유


AI 런타임에서 데이터 로드

중요합니다

단일 노드 작업에 대한 AI 런타임은 공개 미리 보기로 제공됩니다. 다중 GPU 워크로드에 대한 분산 학습 API는 베타에 남아 있습니다.

이 섹션에서는 특히 ML 및 DL 애플리케이션용 AI 런타임에서 데이터를 로드하는 방법에 대해 설명합니다. Spark Python API를 사용하여 데이터를 로드하고 변환하는 방법에 대해 자세히 알아보려면 자습서 를 확인하세요.

메모

Unity 카탈로그가 필요합니다. AI 런타임의 모든 데이터 액세스는 Unity 카탈로그를 통해 진행됩니다. 테이블 및 볼륨은 Unity 카탈로그에 등록되어야 하며 사용자 또는 서비스 주체가 액세스할 수 있어야 합니다.

표 형식 데이터 로드

Spark Connect를 사용하여 델타 테이블에서 테이블 형식 기계 학습 데이터를 로드합니다.

단일 노드 학습의 경우 PySpark 메서드를 사용하여 Apache Spark DataFrames를 pandas DataFrames로 변환한 다음 필요에 따라 toPandas()to_numpy()를 사용하여 NumPy 형식으로 변환할 수 있습니다.

메모

Spark Connect는 분석 및 이름 확인을 실행 시간으로 연기하여 코드의 동작을 변경할 수 있습니다. Spark Connect와 Spark 클래식 비교를 참조하세요.

Spark Connect는 Spark SQL, Spark의 Pandas API, 구조적 스트리밍 및 MLlib(데이터 프레임 기반)를 비롯한 대부분의 PySpark API를 지원합니다. 지원되는 최신 API는 PySpark API 참조 설명서를 참조하세요.

다른 제한 사항은 서버리스 컴퓨팅 제한을 참조하세요.

볼륨을 활용하여 대규모 델타 테이블 로드

변환할 수 없는 큰 델타 테이블의 경우 데이터를 Unity 카탈로그 볼륨으로 toPandas()내보내고 PyTorch 또는 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")

이 방법은 학습 중에 Spark 오버헤드를 방지하고 단일 GPU 및 분산 학습 워크플로 모두에서 잘 작동합니다.

볼륨에서 구조화되지 않은 데이터 로드

이미지, 오디오 및 텍스트 파일과 같은 구조화되지 않은 데이터의 경우 Unity 카탈로그 볼륨을 사용합니다. 다음 예제에서는 볼륨에서 파일을 읽고 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

데코레이터 내부에 @distributed 데이터 로드

분산 학습에 서버리스 GPU API 를 사용하는 경우 @distributed 데코레이터 내에서 데이터 로드 코드를 이동합니다. 데이터 세트 크기는 피클에서 허용하는 최대 크기를 초과할 수 있으므로 아래와 같이 데코레이터 내부에 데이터 세트를 생성하는 것이 좋습니다.

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

데이터 로드 성능

/Workspace/Volumes 디렉터리 원격 Unity 카탈로그 스토리지에 호스트됩니다. 데이터 세트가 Unity 카탈로그에 저장되는 경우 데이터 로드 속도는 사용 가능한 네트워크 대역폭에 의해 제한됩니다. 여러 에포크를 훈련하는 경우 데이터를 로컬로 복사하여 /tmp 디렉터리에 넣는 것이 좋습니다. 이 디렉터리는 빠른 NVMe SSD 스토리지에서 호스트됩니다.

데이터 세트가 큰 경우 다음 기술을 사용하여 성능을 향상시킬 수 있습니다.

  • 다중 Epoch 학습을 위해 로컬로 데이터를 캐시합니다. 여러 Epoch에서 보다 빠르게 액세스할 수 있도록 /tmp에 데이터 세트를 복사합니다.

    import shutil
    shutil.copytree("/Volumes/catalog/schema/volume/dataset", "/tmp/dataset")
    
  • 데이터 페치를 병렬화합니다. 여러 작업자와 함께 torch DataLoader 를 사용하여 GPU 계산과 데이터 로드를 겹칩니다. 최소 2로 설정합니다 num_workers . 성능을 향상시키려면 num_workers (병렬 읽기를 증가시킴) 또는 prefetch_factor (각 작업자가 프리페치하는 항목 수를 증가시킴)를 늘리십시오.

    from torch.utils.data import DataLoader
    
    loader = DataLoader(
        dataset,
        batch_size=32,
        num_workers=2,
        prefetch_factor=2,
        pin_memory=True
    )
    
  • 큰 테이블 형식 데이터 세트에 Spark Connect를 사용합니다. Spark Connect는 대부분의 PySpark API를 지원하고 분산 읽기를 효율적으로 처리합니다.

스트리밍 데이터 세트

메모리에 맞지 않는 매우 큰 데이터 세트의 경우 스트리밍 방법을 사용합니다.