How to Install Google Scalable Nearest Neighbors (ScaNN) on Mac
Юджин Ян описывает, как установить библиотеку 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 "
Если установка прошла успешно, вы должны получить эту ошибку. Вот демо-пример его использования.
Если этот материал оказался полезным, пожалуйста, цитируйте эту заметку так:
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 и инженерии.