Lance - Ваш Lakehouse готов к AI-революции?

12 дек 2025
7,129
872
52
1 неделя

Lance Logo

Привет, коллеги-разработчики! Знакома ли вам ситуация, когда ваши ML-модели становятся всё сложнее, а данные — всё объёмнее и разнообразнее? Мы постоянно ищем способы ускорить пайплайны, эффективно хранить мультимодальные данные и быстро находить нужные векторы. Традиционные форматы вроде Parquet или Iceberg, хоть и хороши для классической аналитики, часто оказываются узким местом, когда речь заходит о высокопроизводительных AI/ML задачах.

Именно здесь на сцену выходит Lance – проект, который обещает перевернуть ваше представление о работе с данными в Lakehouse для задач искусственного интеллекта. Давайте разберемся, что это за зверь и почему он может стать вашим новым любимым инструментом.

Что такое Lance и зачем он нужен?

Lance — это не просто очередной формат файла, это полноценный открытый Lakehouse-формат, специально разработанный для мультимодального AI. Представьте, что у вас есть единое хранилище, которое не только умеет работать с огромными таблицами, но и нативно поддерживает изображения, видео, аудио, текст и, что самое главное, векторные эмбеддинги. И всё это — с производительностью, о которой раньше можно было только мечтать.

Lance включает в себя спецификации для формата файла, формата таблицы и каталога, позволяя вам построить полноценный Lakehouse прямо поверх объектного хранилища. Кому это пригодится? В первую очередь, тем, кто:

Реклама
  • Строит поисковые системы и Feature Stores с гибридными возможностями поиска.
  • Занимается крупномасштабным ML-обучением, где критичны высокая производительность ввода-вывода и случайный доступ.
  • Хранит, запрашивает и управляет мультимодальными данными.

По сути, Lance стремится закрыть пробелы, которые оставляют традиционные Lakehouse-форматы, не заточенные под специфические требования AI/ML-нагрузок.

Lance под микроскопом: Ключевые особенности

Давайте посмотрим, что делает Lance таким особенным и почему он так хорошо подходит для AI.

Гибридный поиск: Векторы, текст, SQL – всё в одном

Часто ли вам приходилось городить сложные архитектуры, чтобы объединить векторный поиск, полнотекстовый поиск и фильтрацию по SQL-предикатам? С Lance эта проблема уходит в прошлое. Он позволяет комбинировать поиск по векторному сходству, полнотекстовый поиск (BM25) и SQL-аналитику на одном и том же наборе данных, используя ускоренные вторичные индексы. Это значит, что вы можете, например, найти изображения, похожие на заданный вектор, отфильтровать их по ключевым словам в описании и выбрать только те, что были загружены за последний месяц, — и всё это в одном запросе!

Молниеносный случайный доступ: Прощай, медленный Parquet!

Одна из самых больших болей при работе с большими датасетами для ML — это медленный случайный доступ. Parquet, например, оптимизирован для последовательного чтения, но при попытке выбрать случайные строки или небольшие блоки данных, он начинает «тормозить». Lance решает эту проблему, предлагая в 100 раз более быстрый случайный доступ, чем Parquet или Iceberg, при этом не жертвуя производительностью сканирования. Это критично для семплирования данных во время обучения моделей или для интерактивного исследования больших датасетов.

Нативная поддержка мультимодальных данных

Мир AI всё больше уходит в мультимодальность. Изображения, видео, аудио, текст и их векторные представления (эмбеддинги) часто живут в разных местах и требуют разных подходов к хранению. Lance унифицирует этот процесс, позволяя хранить все эти типы данных в едином формате. Благодаря эффективному кодированию BLOB-ов и ленивой загрузке, вы можете работать с комплексными датасетами гораздо проще и быстрее.

Эволюция данных без боли

В процессе ML-разработки данные постоянно меняются, добавляются новые фичи, обновляются старые. Традиционные форматы часто требуют полной перезаписи таблиц при добавлении новых колонок, что долго и дорого. Lance позволяет эффективно добавлять колонки с заполненными значениями без полной перезаписи таблицы. Это просто находка для Feature Engineering, где итерации с новыми признаками — обычное дело.

Версионирование без лишних хлопот

Воспроизводимость экспериментов и возможность отката к предыдущим состояниям данных — краеугольный камень MLOps. Lance предлагает версионирование с нулевым копированием, включая ACID-транзакции, путешествие во времени (time travel) и автоматическое версионирование, при этом не требуя дополнительной инфраструктуры. Это значит, что вы всегда будете знать, с какой версией данных работала ваша модель, и сможете легко вернуться назад, если что-то пошло не так.

Как начать работать с Lance?

Начать работу с Lance удивительно просто. Проект активно развивается и имеет отличную поддержку экосистемы, включая Apache Arrow, Pandas, Polars, DuckDB, Apache Spark, Ray и другие.

Установка

Всего одна команда:

pip install pylance

Конвертация данных

У вас уже есть данные в Parquet? Отлично! Конвертировать их в Lance можно буквально в две строчки кода:

import lance
import pandas as pd
import pyarrow as pa
import pyarrow.dataset

df = pd.DataFrame({"a": [5], "b": [10]})
uri_parquet = "/tmp/test.parquet"
tbl = pa.Table.from_pandas(df)
pa.dataset.write_dataset(tbl, uri_parquet, format='parquet')

parquet_ds = pa.dataset.dataset(uri_parquet, format='parquet')
lance.write_dataset(parquet_ds, "/tmp/test.lance")

Чтение данных

После конвертации работать с данными так же просто:

dataset = lance.dataset("/tmp/test.lance")
# Теперь `dataset` — это объект PyArrow Dataset, с которым можно работать
# Например, через Pandas:
df = dataset.to_table().to_pandas()
print(df)

# Или через DuckDB:
import duckdb
duckdb.query("SELECT * FROM dataset LIMIT 10").to_df()

Векторный поиск: Пример с SIFT1M

Lance блестяще проявляет себя в задачах векторного поиска. Вот как можно создать индекс и выполнить поиск по миллиону векторов SIFT:

  1. Загрузка и подготовка данных: (Шаги по загрузке sift.tar.gz и конвертации в np.array опустим для краткости, они есть в README)

  2. Конвертация в Lance:

    import lance
    from lance.vector import vec_to_table
    import numpy as np
    import struct
    
    # ... (код для загрузки данных SIFT в `data`)
    
    nvecs = 1000000
    ndims = 128
    with open("sift/sift_base.fvecs", mode="rb") as fobj:
        buf = fobj.read()
        data = np.array(struct.unpack("<128000000f", buf[4 : 4 + 4 * nvecs * ndims])).reshape((nvecs, ndims))
        dd = dict(zip(range(nvecs), data))
    
    table = vec_to_table(dd)
    uri = "vec_data.lance"
    sift1m = lance.write_dataset(table, uri, max_rows_per_group=8192, max_rows_per_file=1024*1024)
    
  3. Создание индекса:

sift1m.create_index("vector", index_type="IVF_PQ", num_partitions=256, # IVF num_sub_vectors=16) # PQ ```

  1. Выполнение поиска:

import duckdb

dataset = lance.dataset(uri)

Пример 100 запросов

sample = duckdb.query("SELECT vector FROM dataset USING SAMPLE 100").to_df() query_vectors = np.array([np.array(x) for x in sample.vector])

Получаем ближайших соседей для каждого запроса

rs = [dataset.to_table(nearest={"column": "vector", "k": 10, "q": q}) for q in query_vectors] ```

Lance в деле: Где он покажет себя лучше всего?

Где же Lance раскроет свой потенциал по максимуму? Вот несколько сценариев:

  • Поисковые системы нового поколения: Если вы создаете поиск, который должен понимать смысл запросов (через векторы), фильтровать по тексту и метаданным одновременно, Lance — ваш выбор.
  • Feature Stores для ML: Для хранения и быстрого доступа к признакам, которые постоянно обновляются и используются для обучения моделей, Lance с его быстрым случайным доступом и эволюцией данных будет незаменим.
  • Управление мультимодальными активами: Если вы работаете с большими коллекциями изображений, видео или аудио, где нужен эффективный поиск по содержимому и метаданным, Lance упростит вам жизнь.
  • Высокопроизводительное ML-обучение: Когда вашим моделям нужен быстрый и эффективный доступ к данным для семплирования или инкрементального обучения, Lance обеспечит необходимую скорость.

Производительность: Цифры говорят сами за себя

Разработчики Lance не просто обещают высокую производительность, они подкрепляют это бенчмарками. Например, для векторного поиска на 1 миллионе 128-мерных векторов SIFT, среднее время отклика составляет менее 1 мс на MacBook Air M2 2023 года. Это впечатляет!

Средняя задержка векторного поиска

Конечно, всегда есть компромисс между точностью (recall) и производительностью, и Lance позволяет тонко настраивать этот баланс:

Recall против задержки

В сравнении с Parquet, Lance показывает себя значительно лучше:

  • Для аналитических запросов Lance в 50-100 раз быстрее, чем чтение необработанных метаданных.
  • Для пакетного случайного доступа Lance в 100 раз быстрее, чем Parquet и даже обычные файлы.

Сравнение производительности Lance с Parquet

Эти цифры наглядно демонстрируют, почему Lance позиционируется как формат, ориентированный именно на AI/ML-нагрузки.

Итог: Ваш новый швейцарский нож для AI-данных?

Lance — это не просто эволюция, это, возможно, революция в том, как мы подходим к хранению и обработке данных для AI/ML. Он берет лучшее от концепции Lakehouse и добавляет критически важные возможности, которые так нужны современным AI-пайплайнам: быстрый случайный доступ, гибридный поиск, нативную поддержку мультимодальных данных и эффективное версионирование.

Если вы устали от компромиссов, когда приходится выбирать между скоростью, гибкостью и функциональностью для ваших AI-проектов, Lance определенно заслуживает вашего внимания. Он может значительно упростить вашу архитектуру данных и ускорить разработку.

Загляните в репозиторий Lance на GitHub, попробуйте Quick Start, и, возможно, Lance станет вашим следующим фаворитом в арсенале инструментов для работы с данными. Уверен, он вас приятно удивит!

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.