Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Эта функция доступна в общедоступной предварительной версии.
Загрузите обучающие данные в 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для параллелизации извлечения. Это взаимозаменяемый подкласс torchDataLoader, настроенный для бессерверного ввода-вывода для 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 является ограничением, объедините больший размер пакета с градиентным накоплением, чтобы сохранить эффективный размер пакета.
Потоковая передача наборов данных
Для очень больших наборов данных, которые не соответствуют памяти, используйте подходы потоковой передачи:
-
UCVolumeDatasetизserverless_gpu.dataдля потоковой передачи файлов из томов Unity Catalog с локальным кэшированием и автоматическим распределением по разделам. См. раздел Загрузка неструктурированных данных из томов сUCVolumeDataset. - PyTorch IterableDataset для пользовательской логики потоковой передачи.
- Наборы данных Hugging Face с потоковой передачей для наборов данных, размещенных на хабе или в томах.
- Ray Data для распределенной пакетной обработки данных.