Docker経由でfaiss-gpuを使えるようになった奮闘記。まずは環境構築の部分だけ。
前提環境
ホストマシン:
OS:windows 11 Home 22H2
CPU:Core i7-11700
メモリ:64 GB
VScode:1.81.1
DockerDesktop:4.14.0
コンテナ:
OS:Ubuntu20.04
忙しい人向け
ソースからビルドした結果
https://zenn.dev/yag_ays/articles/65a4154d0dedfa
を参考にビルドしたけど、↓のエラーが出てfaissのimportをすることが出来なかった。恐らくpythonとかパッケージとか諸々の関係だと思うけど、原因を追究するモチベーションが0だったので諦め。
dev-user@04f4ebefb539:/workspaces/llm$ /bin/python3 /workspaces/llm/faiss_test/faiss_test.py
Traceback (most recent call last):
File "/workspaces/llm/faiss_test/faiss_test.py", line 1, in <module>
import faiss
File "/usr/local/lib/python3.8/dist-packages/faiss-1.7.4-py3.8.egg/faiss/__init__.py", line 16, in <module>
from .loader import *
File "/usr/local/lib/python3.8/dist-packages/faiss-1.7.4-py3.8.egg/faiss/loader.py", line 65, in <module>
from .swigfaiss import *
File "/usr/local/lib/python3.8/dist-packages/faiss-1.7.4-py3.8.egg/faiss/swigfaiss.py", line 13, in <module>
from . import _swigfaiss
ImportError: /usr/local/lib/python3.8/dist-packages/faiss-1.7.4-py3.8.egg/faiss/_swigfaiss.so: undefined symbol: _ZN5faiss16IndexIVFFastScan12add_with_idsElPKfPKl
pip install faiss-gpuをした結果
https://github.com/facebookresearch/faiss/blob/main/tutorial/python/1-Flat.py
などCPUを使った処理は出来るものの、
https://github.com/facebookresearch/faiss/blob/main/tutorial/python/4-GPU.py
のGPUを使う処理が出来なかった。
↓のGPUにデータを渡す処理でハングしてしまう。
gpu_index = faiss.index_cpu_to_gpu(gpu_resource, 0, cpu_index)
https://github.com/kyamagu/faiss-wheels/issues/54
https://github.com/Teichlab/bbknn/pull/57
を見るに、コンテナとCUDAの相性が悪そうに見えるが原因は特に追究せず。
公式にも書いてある通り、faissのインストールはconda経由が推奨なのでそれに沿ってやったらうまくいきましたよというお話。試行錯誤に2日ほどかけてたどりつきました。
環境構築OK事例
前提ファイル
DockerFile
#公式のdockerイメージをベースにする。
FROM nvidia/cuda:11.8.0-devel-ubuntu20.04 as base
#apt-get中にタイムゾーンの設定を聞かれる・・・
ENV EBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
SHELL ["/bin/bash", "-c"]
RUN apt update && apt upgrade -y
RUN apt-get update && apt-get install -y \
bzip2 \
git \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
llvm \
libncurses5-dev \
libncursesw5-dev \
xz-utils \
tk-dev \
libffi-dev \
liblzma-dev \
python-openssl \
sudo \
swig \
wget \
cmake \
vim \
zip \
zlib1g-dev \
build-essential \
curl \
unzip \
libffi-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# For CUDA profiling, TensorFlow requires CUPTI.
ARG USERNAME=dev-user
ARG GROUPNAME=dev-user
ARG UID=1000
ARG GID=1000
ARG PASSWORD=dev-user
#追加したユーザでsudoを使えるようにする
RUN groupadd -g $GID $GROUPNAME && \
useradd -m -s /bin/bash -u $UID -g $GID $USERNAME && \
adduser dev-user sudo && \
echo $USERNAME:$PASSWORD | chpasswd && \
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
#rootのパスワードがわからないのでパスワードを変更
RUN echo "root:root" | chpasswd
requirements.txt
tokenizers>=0.13.2
prompt_toolkit
numpy
rwkv
transformers
accelerate
sentencepiece
colorama
llama-cpp-python
qdrant-client
sentence-transformers
langchain
VSCode上でのコンテナ開発環境の作り方はこちらをご参考。
環境構築開始
まずは、Anacondaをインストール。
https://www.anaconda.com/download
にアクセスして下にスクロールするとインストーラーがあるので、Linuxの64Bitインストーラーをダウンロード。(一番上のやつ)

ダウンロードしてきたシェルを実行してAnacondaをインストール。
明確にyesと打ち込まないとインストールできない。つまり、Enterキーおしっぱだと一生インストールできないので注意。
The following packages listed on https://www.anaconda.com/cryptography are included in the repository accessible through Anaconda Distribution that relate to cryptography.
Last updated February 25, 2022
Do you accept the license terms? [yes|no]
[no] >>> yes
~~~~(中略)~~~~
modified /home/dev-user/.bashrc
==> For changes to take effect, close and re-open your current shell. <==
If you'd prefer that conda's base environment not be activated on startup,
set the auto_activate_base parameter to false:
conda config --set auto_activate_base false
Thank you for installing Anaconda3!
インストール後にconfigまで設定してくれるのがいいですね。
source /home/dev-user/.bashrc
でcondaコマンドなどを使えるようにしておく。
condaの仮想環境を作る。faissは公式によるとpython3.8~3.10までをサポートしているらく、Pythonのバージョンをちゃんと指定をしないとデフォルトでPython3.11がインストールされてしまうので注意する。(numpyとかpandasは別に書かなくてもいい。)
conda create --name test python=3.10.6 pandas numpy
動作確認も大丈夫。python拡張機能をインストールしている場合は、インタープリターをconda仮想環境のpythonにすることを忘れずに。
(base) dev-user@c3e96eda4c64:~$ conda activate llm
(llm) dev-user@c3e96eda4c64:~$
requirements.txtをpipでインストールする。
ここまでで、前回やったqdrant-llama2の組み合わせは動作することを確認。
本命のfaiss-gpuをインストール。
conda install -c conda-forge faiss-gpu
公式githubのtutorialにあるプログラムを実行。
https://github.com/facebookresearch/faiss/blob/main/tutorial/python/1-Flat.py → OK
https://github.com/facebookresearch/faiss/blob/main/tutorial/python/2-IVFFlat.py → OK
https://github.com/facebookresearch/faiss/blob/main/tutorial/python/3-IVFPQ.py → OK
https://github.com/facebookresearch/faiss/blob/main/tutorial/python/4-GPU.py → OK
https://github.com/facebookresearch/faiss/blob/main/tutorial/python/5-Multiple-GPUs.py → OK
GPUもちゃんと使うことが出来ました。
次は実際に触ってみるぞー。