Загрузка данных в среде выполнения ИИ

Это важно

Эта функция доступна в общедоступной предварительной версии.

Загрузите обучающие данные в AI Runtime для задач машинного и глубокого обучения. Доступ ко всем данным проходит через каталог Unity: используйте Spark Connect для чтения табличных данных из таблиц Delta и томов каталога Unity для больших наборов данных и неструктурированных файлов, таких как изображения, звук и текст. При многоэпохальном обучении кэшируйте данные локально в /tmp для более быстрого доступа. Сведения о загрузке и преобразовании данных с помощью API Python Spark см. в руководстве.

Замечание

Требуется каталог Unity. Все доступ к данным в среде выполнения ИИ проходит через каталог Unity. Ваши таблицы и тома должны быть зарегистрированы в Unity Catalog и доступны вашим пользователю или учетной записи службы.

Загрузка табличных данных

Используйте Spark Connect для загрузки табличных данных машинного обучения из таблиц Delta.

Для обучения с одним узлом можно преобразовать Apache Spark DataFrames в pandas DataFrames с помощью метода PySpark, а затем при необходимости преобразовать в формат NumPy с помощью метода toPandas()to_numpy().

Замечание

Spark Connect откладывает анализ и разрешение имен во время выполнения, что может изменить поведение кода. См . статью "Сравнение Spark Connect с классической версией Spark".

Spark Connect поддерживает большинство API PySpark, включая Spark SQL, Pandas API в Spark, Structured Streaming и MLlib (на базе DataFrame). См. справочную документацию по API PySpark для последних поддерживаемых API.

Сведения о других ограничениях см. в разделе об ограничениях бессерверных вычислений.

Загрузка больших разностных таблиц с помощью томов

Для больших таблиц Delta, которые слишком большие для преобразования toPandas(), экспортируйте данные в том каталога Unity и загружайте их непосредственно с помощью 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, так и для распределенных рабочих процессов.

Загрузка неструктурированных данных из томов с помощью UCVolumeDataset

Для неструктурированных данных, таких как изображения, аудио и текстовые файлы, хранящиеся в томах каталога Unity, используйте UCVolumeDataset из serverless_gpu.data пакета. UCVolumeDataset — это PyTorch IterableDataset , копирующий каждый файл из тома в быстрый локальный кэш при первом доступе и возвращающий кэшированный локальный путь к файлу. Он обрабатывает проблемы производительности и распределения, которые вы бы в противном случае реализовали вручную:

  • Локальное кэширование. При первом обращении файлы копируются из точки монтирования FUSE в локальный каталог кэша, а затем считываются из кэша, поэтому обучение в течение нескольких эпох не требует повторного чтения тома.
  • Автоматическое секционирование. При инициализации torch.distributed файлы разделяются между рангами, а затем дополнительно между рабочими процессами DataLoader, поэтому каждая пара (rank, worker) получает непересекающийся фрагмент без дополнительной конфигурации.

Замечание

UCVolumeDataset и serverless_gpu.data.DataLoaderтребуется среда GPU 5 или более поздней версии.

UCVolumeDataset возвращает необработанные пути к локальным файлам. Чтобы декодировать эти файлы в тензоры, оберните их вторым IterableDataset, который использует поток путей и применяет вашу логику разбора. Это позволяет разделить аспекты ввода-вывода и синтаксического разбора.

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)

Оболочка получает уже кэшированные локальные пути, поэтому шаг синтаксического анализа никогда не касается подключения FUSE. Можно привязать дополнительные оболочки для расширения, маркеризации или фильтрации.

Для оптимальной производительности используйте UCVolumeDataset вместе с serverless_gpu.data.DataLoader, а не стандартный DataLoader из PyTorch. Он настраивается для бессерверных операций ввода-вывода GPU и извлекает и кэширует файлы одновременно во время вычислений GPU. См. сведения о производительности загрузки данных.

Загрузка данных внутри @distributed декоратора

При использовании безсерверного API GPU для распределенного обучения переместите код загрузки данных в декоратор @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)
    ...

При создании UCVolumeDataset внутри декоратора он во время итерации считывает сведения о рангах torch.distributed и автоматически распределяет файлы между рангами, поэтому для файловых объёмных данных не требуется DistributedSampler.

Производительность загрузки данных

/Workspace и /Volumes размещаются в удаленном хранилище каталога Unity. Если набор данных хранится в каталоге Unity, скорость загрузки данных ограничена доступной пропускной способностью сети. Если вы обучаете модель в течение нескольких эпох, рекомендуется использовать UCVolumeDataset, который выполняет это кэширование за вас: при первом обращении он копирует каждый файл в локальное хранилище, а при последующих чтениях использует локальную копию. Для наборов данных в томах предпочтительнее использовать его вместо ручного shutil.copytree, который заранее копирует всё дерево целиком, даже если в обучении используется только его часть.

Если набор данных велик, следующие методы могут повысить пропускную способность:

  • Используется serverless_gpu.data.DataLoader для параллелизации извлечения. Это взаимозаменяемый подкласс torch DataLoader, настроенный для бессерверного ввода-вывода для GPU: num_workers по умолчанию равно 6, а prefetch_factor — 4 (по сравнению с 0 и 2 в PyTorch), поэтому файлы загружаются и кэшируются параллельно, пока GPU выполняет вычисления. Кроме того, он записывает время получения данных для каждого батча в активный запуск MLflow, что помогает выявить узкие места при загрузке данных.

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

    Все ранги должны использовать одно и то же значение num_workers, поскольку UCVolumeDataset разбивает файлы на разделы, используя глобальный шаг по world_size × num_workers слотам. Несоответствие значений приводит к дублированию или пропуску файлов.

  • Увеличьте размер пакета. Более крупные пакеты данных распределяют накладные расходы на загрузку данных для каждого пакета на большее число образцов и сокращают количество операций чтения файлов на каждом шаге. Если память GPU является ограничением, объедините больший размер пакета с градиентным накоплением, чтобы сохранить эффективный размер пакета.

Потоковая передача наборов данных

Для очень больших наборов данных, которые не соответствуют памяти, используйте подходы потоковой передачи: