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 года.

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

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

[ python machinelearning til ] · 3 min read

[ 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 "", line 1, in TypeError: builder() missing 3 required positional arguments: 'db', 'num_neighbors', and 'distance_measure'

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 и инженерии.