Google의 ScaNN(Scalable Nearest Neighbors)을 Mac에 설치하는 방법

7604 단어
몇 달 전에 Google은 효율적인 벡터 유사성 검색을 위해 Scalable Nearest Neighbors, ScaNN ( Paper , Code )에 대해 공유했습니다. 각도 거리에서 SOTA 벤치마크를 능가하는 것 같습니다(즉, 주어진 리콜 수준에 대해 >2x 처리량).


GloVe 임베딩에 대한 ANN 벤치마크(dim=100) ( source )

최근에 시도해 볼 시간을 찾았지만 Mac에 설치하는 것이 얼마나 까다로워서 좌절했습니다. 성공적으로 설치하기 위해 취한 단계는 다음과 같습니다.

단계별 연습



먼저 필요한 컴파일러를 설치합니다.

brew install bazel
brew install llvm
brew install gcc


그런 다음 pyenv를 통해 Python 버전을 설정합니다.

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


이제 가상 환경을 만듭니다.

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

ScaNN는 거대한 google-research repo의 일부입니다. 거기에는 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
# 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


몇 가지 문제로 인해 직접 설치가 불가능하며 여기서 수동으로 수정하겠습니다.

먼저 .bazelrc.bazel-query.sh를 업데이트합니다. (업데이트.bazel-query.sh가 반드시 필요한 것은 아니지만 완전성을 위해 업데이트를 한다고 생각했습니다.) 다음을 교체해야 합니다.

TF_SHARED_LIBRARY_NAME="ensorflow_framework.2"


와 함께:

TF_SHARED_LIBRARY_NAME="libtensorflow_framework.2.dylib"


그런 다음 다음을 교체하여 C++ 가져오기를 업데이트해야 합니다(이 중 4개가 있음).

#include <hash_set>


와 함께:

#include <ext/hash_set>


이제 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 휠을 빌드합니다.

./bazel-bin/build_pip_pkg


이제 설치할 수 있습니다.

pip install scann-1.1.1-<replace with your package suffix>


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'


설치에 성공하면 오류가 표시됩니다. 다음은 sample demo on using it 입니다.

좋은 웹페이지 즐겨찾기