В чем хранить вектора (эмбендинги) для быстрого сравнения?
Собственно вопрос, в чем хранить вектора лиц, созданные facenet'ом состоящие из 512 вершин, для того что бы их можно было быстр сравнивать. Вектор представляет собой массив, изначально пробовали хранить в postgresql, тип поля cube - но скорость поиска не устраивает. Векторов 50к - и по ним сравнение занимает полторы минуты, это очень долго. Потом пробовали хранить вектора в json, скорость увеличилась, поиск стал занимать 12 секунд, но всё равно это очень долго. Много времени занимает именно само преобразование строки в массив, так вот вопрос, в чем хранить вектор, что бы python сразу получал массив. Или может быть какой нибудь другой метод посоветуете.
Если вкратце, то поиск по HNSW-индексу из 500к векторов будет укладываться в 5 миллисекунд. Библиотеку лучше взять faiss, она поприличнее написана, чем оригинальный nmslib. У обеих есть Python-биндинги.
Использовали faiss для другого проекта, насколько я понимаю он может обрабатывать только вектора из 128 вершин, а у нас 512. Тем более у него свой метод поиска, а нам нужно оставить наш, потому как наш метод созданный на основе facenet, ищет лучше чем faiss
Александр Туркин, вы видимо путаете что-то. faiss - это библиотека для построения индексов на векторах произвольных размерностей, как строятся вектора не имеет ровным счётом никакого значения (это к слову о facenet), расстояния между ними нужно как-то измерять, это тоже параметр индекса.
https://github.com/facebookresearch/faiss/blob/323...
Здесь реализованы L2 и InnerProduct, если вам нужна какая-то своя метрика, то вы вполне можете её дописать, это не возбраняется, поскольку лицензия BSD. Но зачем она вам?
Попробуйте в оперативке хранить, numpy-массивами. Плюс есть структура KD Tree, позволяющая искать ближайших соседей вектора по K-мерному линейному пространству. Ускорит поиск.
6 ГБ - большое количество оперативы?
В любом случае поиск упрётся в скорость вычисления расстояния между векторами, а значит платить придётся за CPU/GPU.