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 года.
How to Install Google Scalable Nearest Neighbors (ScaNN) on Mac
Как установить Google Scalable Nearest Neighbors (ScaNN) на Mac
[ python machinelearning til ] · чтение на 3 мин
A few months back, Google shared about Scalable Nearest Neighbors, ScaNN (Paper, Code) for efficient vector similarity search. It seemed to beat the SOTA benchmarks on angular distance (i.e., >2x throughput for a given recall level).
Несколько месяцев назад Google рассказала о Scalable Nearest Neighbors, ScaNN (статья, код) — инструменте для эффективного поиска по векторному сходству. По всей видимости, он превзошёл SOTA-бенчмарки по угловому расстоянию (то есть давал >2x пропускной способности при заданном уровне recall).
Approximate Nearest Neighbors Benchmarks on the GloVe embeddings (dim=100) (source)
Бенчмарки приближённого поиска ближайших соседей на эмбеддингах GloVe (dim=100) (источник)
Recently, I found some time to try it out but was frustrated by how tricky it was to install on a Mac. Here are the steps I took to install it successfully.
Недавно у меня нашлось время попробовать его, но я был раздосадован тем, насколько хитро его устанавливать на Mac. Вот шаги, которые я предпринял, чтобы успешно его установить.
Step-by-step walkthrough
Пошаговое руководство
First, we install the necessary compilers.
Сначала устанавливаем необходимые компиляторы.
brew install bazel
brew install llvm
brew install gcc
brew install bazel brew install llvm brew install gcc
Then, we set up our Python version via pyenv
Затем настраиваем версию Python через pyenv
brew update && brew upgrade pyenv
pyenv --version
> pyenv 1.2.21
pyenv install 3.8.6. # Doesn't work with 3.9 yet
pyenv local 3.8.6
python --version
> Python 3.8.6
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
Now, we create our virtual environment.
Теперь создаём виртуальное окружение.
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
python -m venv .venv source .venv/bin/activate pip install --upgrade pip
ScaNN is part of the google-research repo which is huge. There are more than 200 directories in there and we don’t need all of them. Thus, we’ll do the following to only checkout the ScaNN directory.
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
git clone --depth 1 --filter=blob:none --no-checkout https://github.com/google-research/google-research.git git checkout master -- scann cd scann
Next, we’ll need to install the Python dependencies.
Далее нам нужно установить зависимости Python.
pip install wheel
python configure.py
# There might be complaints about "tensorflow 2.3.1 requires numpy<1.19.0,>=1.16.0, but you'll have numpy 1.19.2 which is incompatible." but it's fine
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.", но это нормально
Several issues prevent a direct installation and we’ll be manually fixing them here.
Несколько проблем мешают установке напрямую, и здесь мы исправим их вручную.
First, we’ll update .bazelrc and .bazel-query.sh. (It’s not absolutely necessary to update .bazel-query.sh but I thought we do it anyway for completeness). We should replace:
Сначала обновим .bazelrc и .bazel-query.sh. (Обновлять .bazel-query.sh совсем не обязательно, но я решил сделать это для полноты.) Нужно заменить:
TF_SHARED_LIBRARY_NAME="ensorflow_framework.2"
TF_SHARED_LIBRARY_NAME="ensorflow_framework.2"
With:
На:
TF_SHARED_LIBRARY_NAME="libtensorflow_framework.2.dylib"
TF_SHARED_LIBRARY_NAME="libtensorflow_framework.2.dylib"
Then, we’ll need to update the C++ imports by replacing (there are four of these):
Затем нужно обновить C++-импорты, заменив (таких четыре):
#include <hash_set>
#include
With:
На:
#include <ext/hash_set>
#include
Now, we can build it via bazel. Instead of using clang-8 as specified, I just used the latest version of clang and it worked fine.
Теперь можно собрать его через 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
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
If it builds successfully, we should see output similar to this.
Если сборка прошла успешно, мы должны увидеть вывод, похожий на этот.
INFO: Elapsed time: 316.366s, Critical Path: 206.32s
INFO: 1066 processes: 319 internal, 747 local.
INFO: Build completed successfully, 1066 total actions
INFO: Elapsed time: 316.366s, Critical Path: 206.32s INFO: 1066 processes: 319 internal, 747 local. INFO: Build completed successfully, 1066 total actions
Then, we build the Python wheel:
Затем собираем Python-wheel:
./bazel-bin/build_pip_pkg
./bazel-bin/build_pip_pkg
And now we can install it:
И теперь можем установить его:
pip install scann-1.1.1-<replace with your package suffix>
pip install scann-1.1.1-<замените на суффикс вашего пакета>
You can test if the installation was successful in Python:
Проверить, что установка прошла успешно, можно в Python:
import scann
scann.scann_ops_pybind.builder()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: builder() missing 3 required positional arguments: 'db', 'num_neighbors', and 'distance_measure'
import scann scann.scann_ops_pybind.builder() Traceback (most recent call last): File "
You should get the error if installation was successful. Here’s a sample demo on using it.
Если установка прошла успешно, вы должны получить эту ошибку. Вот демо-пример его использования.
If you found this useful, please cite this write-up as:
Если этот материал оказался полезным, пожалуйста, цитируйте эту заметку так:
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/.
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/.
or
или
@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/}
}
@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/} }
Join 11,800+ readers getting updates on machine learning, RecSys, LLMs, and engineering.
Присоединяйтесь к 11 800+ читателей, получающих обновления о машинном обучении, RecSys, LLM и инженерии.