Авторы:
(1) Сасун Амбарцумян, Activeloop, Маунтин-Вью, Калифорния, США;
(2) Абхинав Тули, Activeloop, Маунтин-Вью, Калифорния, США;
(3) Левон Гукасян, Activeloop, Маунтин-Вью, Калифорния, США;
(4) Фариз Рахман, Activeloop, Маунтин-Вью, Калифорния, США;.
(5) Грант Топчян, Activeloop, Маунтин-Вью, Калифорния, США;
(6) Дэвид Исаян, Activeloop, Маунтин-Вью, Калифорния, США;
(7) Марк Маккуэйд, Activeloop, Маунтин-Вью, Калифорния, США;
(8) Микаел Арутюнян, Activeloop, Маунтин-Вью, Калифорния, США;
(9) Татевик Акопян, Activeloop, Маунтин-Вью, Калифорния, США;
(10) Иво Страник, Activeloop, Маунтин-Вью, Калифорния, США;
(11) Давид Буниатян, Activeloop, Маунтин-Вью, Калифорния, США.
Как показано на рис. 1, Deep Lake хранит необработанные данные и представления в хранилище объектов, например S3, и материализует наборы данных с полным происхождением. Потоковая передача, запросы на языке тензорных запросов и механизм визуализации выполняются либо вместе с вычислениями глубокого обучения, либо в браузере, не требуя внешнего управляемого или централизованного обслуживания.
4.1.1 Выписка. Иногда метаданные могут уже находиться в реляционной базе данных. Мы дополнительно создали коннектор назначения ETL, используя Airbyte[3] [22]. Платформа позволяет подключаться к любому поддерживаемому источнику данных, включая базы данных SQL/NoSQL, озера данных или хранилища данных, и синхронизировать данные с Deep Lake. Протокол соединителя преобразует данные в столбчатый формат.
4.1.2 Преобразование. Чтобы значительно ускорить рабочие процессы обработки данных и избавить пользователей от необходимости беспокоиться о компоновке фрагментов, Deep Lake предоставляет возможность параллельного выполнения преобразований Python. Преобразование принимает набор данных, выполняет выборочную итерацию по первому измерению и выводит новый набор данных. Пользовательская функция Python ожидает два обязательных аргумента 𝑠𝑎𝑚𝑝𝑙𝑒_𝑖𝑛, 𝑠𝑎𝑚𝑝𝑙𝑒_𝑜𝑢𝑡 и декорируется @𝑑𝑒𝑒𝑝𝑙𝑎𝑘𝑒. 𝑐𝑜𝑚𝑝𝑢𝑡𝑒. Один 𝑠𝑎𝑚𝑝𝑙𝑒_𝑖𝑛 может динамически создавать несколько 𝑠𝑎𝑚𝑝𝑙𝑒_𝑜𝑢𝑡𝑠. Он позволяет выполнять преобразования как «один к одному», так и «один ко многим». Трансформацию также можно применить без создания нового набора данных.
За кулисами планировщик группирует выборочные преобразования, выполняемые на соседних фрагментах, и планирует их в пуле процессов. При желании вычисления можно делегировать кластеру Ray [53]. Вместо определения входного набора данных пользователь может предоставить произвольный итератор с настраиваемыми объектами для создания рабочих процессов приема. Пользователи также могут объединять несколько преобразований и определять сложные конвейеры.
Deep Lake также учитывает необходимость воспроизводимости экспериментов и соответствия полной линии данных. Различные версии набора данных существуют в одном хранилище, разделенные подкаталогами. Каждый подкаталог действует как независимый набор данных со своими файлами метаданных. В отличие от неверсионного набора данных, эти подкаталоги содержат только фрагменты, измененные в конкретной версии, а также соответствующий набор фрагментов для каждого тензора, содержащий имена всех измененных фрагментов. Информационный файл контроля версий, расположенный в корне каталога, отслеживает взаимосвязь между этими версиями в виде ветвящегося дерева контроля версий. При доступе к любому фрагменту тензора в определенной версии дерево контроля версий просматривается, начиная с текущего коммита и направляясь к первому коммиту. Во время обхода набор фрагментов каждой версии проверяется на наличие требуемого фрагмента. Если чанк найден, обход останавливается и данные извлекаются. Для отслеживания различий между версиями для каждой версии также сохраняется файл различий фиксации для каждого тензора. Это ускоряет сравнение версий и ветвей. Более того, идентификаторы образцов генерируются и сохраняются во время заполнения набора данных. Это важно для отслеживания одних и тех же выборок во время операций слияния. Интерфейс управления версиями Deep Lake — это API Python, который позволяет инженерам машинного обучения создавать версии своих наборов данных в сценариях обработки данных, не переключаясь между интерфейсом командной строки. Он поддерживает следующие команды:
• Commit : создает неизменяемый снимок текущего состояния набора данных.
• Извлечение : извлекает существующую ветку/фиксацию или создает новую ветку, если она не существует.
• Diff : сравнивает различия между двумя версиями набора данных.
• Объединить : объединяет две разные версии набора данных, разрешая конфликты в соответствии с политикой, определенной пользователем.
Визуализация данных — важная часть рабочих процессов машинного обучения, особенно когда данные сложно анализировать аналитически. Быстрая и плавная визуализация позволяет быстрее собирать данные, добавлять аннотации, проверять качество и выполнять итерации обучения. Механизм визуализации Deep Lake предоставляет веб-интерфейс для визуализации крупномасштабных данных непосредственно из источника. Он учитывает htype тензоров, чтобы определить лучший макет для визуализации. Первичные тензоры, такие как изображение, видео и аудио, отображаются первыми, а вторичные данные и аннотации, такие как текст, class_label, bbox иbinary_mask, накладываются. Визуализатор также учитывает информацию о метатипе, такую как последовательность, чтобы обеспечить последовательное представление данных, при котором последовательности можно воспроизводить и переходить к определенной позиции последовательности без извлечения всех данных, что актуально для случаев использования видео или аудио. . Визуализатор удовлетворяет критически важные потребности в рабочих процессах машинного обучения, позволяя пользователям понимать и устранять неполадки в данных, отображать их эволюцию, сравнивать прогнозы с реальными данными или отображать несколько последовательностей изображений (например, изображений с камеры и карт различий) рядом друг с другом.
Запрос и балансировка наборов данных — обычный шаг в обучении рабочих процессов глубокого обучения. Обычно это достигается внутри загрузчика данных с использованием стратегий выборки или отдельных этапов предварительной обработки для подвыборки набора данных. С другой стороны, традиционные озера данных подключаются к внешним механизмам аналитических запросов [66] и передают кадры данных в рабочие процессы обработки данных. Чтобы устранить разрыв между форматом и быстрым доступом к конкретным данным, мы предоставляем встроенный SQL-подобный механизм запросов, реализованный на C++, который называется Tensor Query Language (TQL). Пример запроса показан на рис. 5. Хотя синтаксический анализатор SQL был расширен из Hyrise [37] для разработки языка тензорных запросов, мы реализовали наш планировщик и механизм выполнения, который может опционально делегировать вычисления внешним платформам тензорных вычислений. План запроса генерирует вычислительный граф тензорных операций. Затем планировщик выполняет граф запроса.
Выполнение запроса можно делегировать внешним платформам тензорных вычислений, таким как PyTorch [58] или XLA [64], и эффективно использовать базовое ускоренное оборудование. Помимо стандартных функций SQL, TQL также реализует числовые вычисления. Есть две основные причины для реализации нового языка запросов. Во-первых, традиционный SQL не поддерживает операции с многомерными массивами, такие как вычисление среднего значения пикселей изображения или проецирование массивов в определенное измерение. TQL решает эту проблему, добавляя индексацию в стиле Python/NumPy, нарезку массивов и предоставляя большой набор удобных функций для работы с массивами, многие из которых являются обычными операциями, поддерживаемыми в NumPy. Во-вторых, TQL обеспечивает более глубокую интеграцию запроса с другими функциями Deep Lake, такими как контроль версий, механизм потоковой передачи и визуализация. Например, TQL позволяет запрашивать данные по определенным версиям или, возможно, по нескольким версиям набора данных. TQL также поддерживает специальные инструкции для настройки визуализации результатов запроса или плавной интеграции с загрузчиком данных для фильтрованной потоковой передачи. Встроенный механизм запросов работает вместе с клиентом либо во время обучения модели на удаленном вычислительном экземпляре, либо во время компиляции в браузере с помощью WebAssembly. TQL расширяет SQL числовыми вычислениями поверх многомерных столбцов. Он создает представления наборов данных, которые можно визуализировать или напрямую передавать в системы глубокого обучения. Однако представления запросов могут быть разреженными, что может повлиять на производительность потоковой передачи.
Большая часть необработанных данных, используемых для глубокого обучения, хранится в виде необработанных файлов (сжатых в таких форматах, как JPEG) локально или в облаке. Распространенный способ создания наборов данных — сохранить указатели на эти необработанные файлы в базе данных, выполнить запрос к ним, чтобы получить необходимое подмножество данных, загрузить отфильтрованные файлы на машину, а затем обучить модель, перебирающую файлы. Кроме того, происхождение данных необходимо поддерживать вручную с помощью файла происхождения. Формат хранения тензоров упрощает эти шаги с помощью связанных тензоров — хранения указателей (ссылок/URL-адресов на одного или нескольких облачных провайдеров) на исходные данные. Указатели в одном тензоре могут быть подключены к нескольким поставщикам хранилищ, что позволяет пользователям получать консолидированное представление своих данных, представленных в нескольких источниках. Все функции Deep Lake, включая запросы, контроль версий и потоковую передачу в платформы глубокого обучения, можно использовать со связанными тензорами. Однако производительность потоковой передачи данных не будет такой оптимальной, как у тензоров по умолчанию. Аналогичная проблема существует с разреженными представлениями, созданными из-за запросов, которые будут неэффективно передаваться из-за структуры фрагментов. Кроме того, материализация преобразует представление набора данных в оптимальный макет для потоковой передачи в системы глубокого обучения для более быстрого выполнения итераций. Материализация включает в себя получение фактических данных из ссылок или представлений и эффективное их разбиение на фрагменты. Выполнение этого шага ближе к завершению рабочих процессов машинного обучения приводит к минимальному дублированию данных, обеспечивая при этом оптимальную производительность потоковой передачи и минимальное дублирование данных при полном происхождении данных.
По мере того, как наборы данных становятся больше, хранение и передача по сети из удаленно распределенного хранилища становится неизбежным. Потоковая передача данных позволяет обучать модели, не дожидаясь копирования всех данных на локальный компьютер. Потоковый загрузчик данных обеспечивает выборку, распаковку данных, применение преобразований, сопоставление и передачу данных в обучающую модель. Загрузчики данных глубокого обучения обычно делегируют выборку и преобразование параллельным процессам, чтобы избежать синхронных вычислений. Затем данные передаются основному рабочему процессу посредством межпроцессного взаимодействия (IPC), что приводит к увеличению затрат на копирование в памяти или использованию общей памяти с некоторыми проблемами надежности. Напротив, загрузчик данных Deep Lake делегирует высокопараллельную выборку и распаковку на месте в C++ для каждого процесса, чтобы избежать глобальной блокировки интерпретатора. Затем он передает указатель в памяти определяемой пользователем функции преобразования и сопоставляет их перед тем, как подвергнуть их циклу обучения в встроенной структуре памяти глубокого обучения. Преобразование выполняется параллельно, когда оно использует только вызовы подпрограмм собственной библиотеки и соответственно освобождает глобальную блокировку интерпретатора Python (GIL). В результате мы получаем:
• Производительность : доставка данных в модель глубокого обучения достаточно быстрая, чтобы либо графический процессор был полностью использован, либо был ограничен вычислительными ресурсами.
• Интеллектуальный планировщик : динамическое различие между приоритетами задач с интенсивным использованием ЦП и менее интенсивными.
• Эффективное распределение ресурсов : прогнозирование потребления памяти во избежание прерывания процесса обучения из-за переполнения памяти.
Этот документ доступен на arxiv под лицензией CC 4.0.
[3] Исходный код доступен: https://github.com/activeloopai/airbyte в ветке @feature/connector/deeplake.