newsmode
search
Меню
arrow_back Назад

How to Install Google Scalable Nearest Neighbors (ScaNN) on Mac

auto_awesomeКраткое саммари

Юджин Ян описывает, как установить библиотеку Google Scalable Nearest Neighbors (ScaNN) на Mac — инструмент для эффективного поиска по векторному сходству, который, по данным Google, более чем вдвое превосходит SOTA-бенчмарки по пропускной способности при заданном уровне recall на угловом расстоянии. Автор столкнулся с трудностями при установке и приводит пошаговое руководство. Шаги включают установку компиляторов (bazel, llvm, gcc) через brew, настройку Python 3.8.6 через pyenv, создание виртуального окружения и частичный checkout только каталога scann из большого репозитория google-research. Далее нужно вручную исправить несколько проблем: обновить TF_SHARED_LIBRARY_NAME в .bazelrc на libtensorflow_framework.2.dylib и заменить C++ импорты <hash_set> на <ext/hash_set>. После сборки через bazel и создания Python-wheel пакет устанавливается через pip, а успешность установки проверяется импортом scann в Python. Статья опубликована в октябре 2020 года.

Как установить Google Scalable Nearest Neighbors (ScaNN) на Mac

[ python machinelearning til ] · чтение на 3 мин

Несколько месяцев назад Google рассказала о Scalable Nearest Neighbors, ScaNN (статья, код) — инструменте для эффективного поиска по векторному сходству. По всей видимости, он превзошёл SOTA-бенчмарки по угловому расстоянию (то есть давал >2x пропускной способности при заданном уровне recall).

Бенчмарки приближённого поиска ближайших соседей на эмбеддингах GloVe (dim=100) (источник)

Недавно у меня нашлось время попробовать его, но я был раздосадован тем, насколько хитро его устанавливать на Mac. Вот шаги, которые я предпринял, чтобы успешно его установить.

Пошаговое руководство

Сначала устанавливаем необходимые компиляторы.

brew install bazel brew install llvm brew install gcc

Затем настраиваем версию Python через pyenv

brew update && brew upgrade pyenv pyenv --version > pyenv 1.2.21 pyenv install 3.8.6. # Пока не работает с 3.9 pyenv local 3.8.6 python --version > Python 3.8.6

Теперь создаём виртуальное окружение.

python -m venv .venv source .venv/bin/activate pip install --upgrade pip

ScaNN является частью репозитория google-research, который огромен. Там более 200 каталогов, и нам нужны не все они. Поэтому мы сделаем следующее, чтобы выгрузить только каталог ScaNN.

git clone --depth 1 --filter=blob:none --no-checkout https://github.com/google-research/google-research.git git checkout master -- scann cd scann

Далее нам нужно установить зависимости Python.

pip install wheel python configure.py # Могут появиться жалобы вроде "tensorflow 2.3.1 requires numpy<1.19.0,>=1.16.0, but you'll have numpy 1.19.2 which is incompatible.", но это нормально

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

Сначала обновим .bazelrc и .bazel-query.sh. (Обновлять .bazel-query.sh совсем не обязательно, но я решил сделать это для полноты.) Нужно заменить:

TF_SHARED_LIBRARY_NAME="ensorflow_framework.2"

На:

TF_SHARED_LIBRARY_NAME="libtensorflow_framework.2.dylib"

Затем нужно обновить C++-импорты, заменив (таких четыре):

#include

На:

#include

Теперь можно собрать его через bazel. Вместо указанного clang-8 я просто использовал последнюю версию clang, и всё прекрасно сработало.

CC=/usr/local/opt/llvm/bin/clang CXX=/usr/local/opt/gcc/bin/gcc bazel build -c opt --copt=-mavx2 --copt=-mfma --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" --cxxopt="-std=c++17" --copt=-fsized-deallocation --copt=-w :build_pip_pkg

Если сборка прошла успешно, мы должны увидеть вывод, похожий на этот.

INFO: Elapsed time: 316.366s, Critical Path: 206.32s INFO: 1066 processes: 319 internal, 747 local. INFO: Build completed successfully, 1066 total actions

Затем собираем Python-wheel:

./bazel-bin/build_pip_pkg

И теперь можем установить его:

pip install scann-1.1.1-<замените на суффикс вашего пакета>

Проверить, что установка прошла успешно, можно в Python:

import scann scann.scann_ops_pybind.builder() Traceback (most recent call last): File "", line 1, in TypeError: builder() missing 3 required positional arguments: 'db', 'num_neighbors', and 'distance_measure'

Если установка прошла успешно, вы должны получить эту ошибку. Вот демо-пример его использования.

Если этот материал оказался полезным, пожалуйста, цитируйте эту заметку так:

Yan, Ziyou. (Oct 2020). How to Install Google Scalable Nearest Neighbors (ScaNN) on Mac. eugeneyan.com. https://eugeneyan.com/writing/how-to-install-scann-on-mac/.

или

@article{yan2020scann, title = {How to Install Google Scalable Nearest Neighbors (ScaNN) on Mac}, author = {Yan, Ziyou}, journal = {eugeneyan.com}, year = {2020}, month = {Oct}, url = {https://eugeneyan.com/writing/how-to-install-scann-on-mac/} }



Присоединяйтесь к 11 800+ читателей, получающих обновления о машинном обучении, RecSys, LLM и инженерии.