DifyからXinferenceを利用するための環境構築手順
はじめに
この記事では、Dify上でモデルプロバイダーとして利用するXinference(Xoribits)のローカル環境へのインストールについての手順について解説します。
後続作業として、今回構築したXinferenceをDifyから利用するための設定を行う手順も必要ですが、こちらは今後別途記事化する予定です。
Difyとは
Difyとは生成AIアプリケーションを開発およびサービスとして公開するためのプラットフォームサービスです。Difyではードでアプリケーションを開発できるため、プログラムコードを組けるメンバーが少ない状況でも生成AIアプリケーションを組織やチームに提供できるようになります。
また、 DifyはローカルLLMを含む多数のモデルプロバイダー(OpenAIのGPTやGoogleのGemini、Ollamaなど)を選択・利用することができます。
Difyの利用方法は公式としては、
- Difyの開発元であるlangGenius社が有償サービスとして提供するSaaS版
- 公開されているGithubからソースコードをcloneして自分のローカル環境で稼働させるコミュニティ版
の2種類があります。
今回はコミュニティ版を自社サーバー内でDockerコンテナとして稼働させる環境を構築する状況を想定しています。
Xinferenceとは
Xinference(またはxorbits)とは、ローカルLLMを実行するためのプラットフォームです。
Xinference自体をローカル環境にインストールして使用します。
Xinference内に様々なLLMをインストールすることにより、ローカル環境に閉じた環境でLLMを実行することができるようになります。
当環境では、Difyで様々なローカルLLMを使用できるようにするために、Xinferenceを通じてローカルLLMを使用します。
なぜXinferenceを使用するのか
DifyではRAGの仕組みを簡単に構築できる機能も備えています。RAGの検索精度向上テクニックの一つとしてリランキングやハイブリッド検索という仕組みあるのですが、Difyでこれらを行うためにはそれに対応したモデルプロバイダーを選択する必要があります。その選択肢の一つとしてXinferenceがあるため、今回Xinferenceを利用することとしました。
Difyのモデルプロバイダーリストはこちら
前提およびなぜこの手順になったのか
改めて、ここでいうローカル環境とは、Difyが動作するVMのことを指しています。
前提1:Google CloudのCOSを利用している
Difyが動作するVMとしてGoogle Compute Engineを利用し、かつGoogle CloudのContainer Optimized OS(COS)で稼働していることを前提としています。
前提2:インターネット上のリポジトリへのアクセス
今回の環境構築のためには、ローカル環境からDockerHubやHuggingface等のインターネット上のリポジトリにアクセスできる必要があります。
制約1:COSの仕様
OS内ではaptやpip等のパッケージマネージャの利用は推奨されていません。
そのためPythonのバージョンアップをすることができません。
COSではPython3.6がインストールされていますが、こちらは古いため、新しめのサービスは動作しないことが多いです。
制約2:Xinferenceの仕様
基本的にはPythonで実行されます。
Dockerコンテナで利用する方法もありますが、そのためにはVMにGPUが必要です。当環境ではGPUを利用することが出来ないため、Dockerコンテナで稼働させない手順を採用しました。
解決策
制約1,2を踏まえて、Python3.11 slimイメージをベースにしてdockerコンテナを作成し、その中でXinferenceを起動することとしました。
手順
前置きが長くなりましたが、ここからは実際にXinferenceをインストールおよび起動するための手順です。
Xinference作業用ディレクトリを作成し、そこに移動する
mkdir /mnt/stateful_partition/Xinference
cd /mnt/stateful_partition/Xinference
Xinference起動とLLM起動用のシェルスクリプトを作成する
vi start.sh
このシェルスクリプトはこの後作成するコンテナの起動のタイミングで同時に実行したい処理を記述します。
もしxinferenceで実行させたいLLMがある場合は、このスクリプトに処理を追加してください。今回の例では、bge-reranker-v2-m3を導入しています。
なお、途中のsleep 120は、Xinferenceの起動直後にlauchを実行してしまうとエラーになってしまうため、それを防止するために120秒待ってからlauchを実行するようにしています。
また、最後にwaitコマンドを実行することによりこのstart.shで実行した内容がプロセス終了せず、そのままサーバーを起動したままにすることを実現しています。
# /start.sh
#!/bin/bash
/usr/local/bin/xinference-local --host 0.0.0.0 --port 9997 &
sleep 120
/usr/local/bin/xinference launch --model-name bge-reranker-v2-m3 --model-type rerank
wait
Dockerfileを作成する
vi Dockerfile
Dockerfileの内容
FROM python:3.11-slim
# インストールに必要なパッケージを指定
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
libffi-dev \
libssl-dev \
zlib1g-dev \
libncurses5-dev \
libgdbm-dev \
libnss3-dev \
libpam-dev \
python3-dev \
python3-pip \
git \
&& \
rm -rf /var/lib/apt/lists/*
# pipでxinferenceをインストール
RUN pip install xinference[all]
# xinferenceが使用する環境変数を設定
ENV XINFERENCE_HOME=/models
# モデルやログを格納するフォルダをコンテナ内に作成。このフォルダはコンテナバインドにより永続化させる。
RUN mkdir -p /models
COPY start.sh /start.sh
RUN chmod +x /start.sh
# CMD に start.sh を指定
ENTRYPOINT ["bash", "/start.sh"]
Dockerfileを元にdockerイメージをビルドする
docker image build --tag xinference:V1 .
参考
docker image hisotry <イメージ名>コマンドにより、dockerイメージで何が追加されたかを確認できます。
dockerイメージが想定どおり作成されたことを確認する
docker image ls xinference:V1
ビルドしたdockerイメージを元にコンテナを起動する
--restart=alwaysオプションをつけているので、VM起動時にコンテナも一緒に起動する挙動となります。
したがってこのコマンドは最初の1回実行するだけでよくなります。
--neworkオプションの引数はDifyが動作するコンテナと同じdockerネットワークグループを指定しています。これによりDifyとXinferenceがネットワークグループ内で通信できるようになります。
--volumeオプションでは、ローカル環境とdockerコンテナ内のボリュームをバインドしています。今回はdockerコンテナ内では/modelsというディレクトリを指定しています。ここは任意のディレクトリで構いませんが、Dockerfileで指定しているENV XINFERENCE_HOME=/modelsとは合わせる必要があります。
docker container run -d --restart=always --name xinference-container --volume /mnt/stateful_partition/Xinference/models:/models --network docker_default xinference:V1
コンテナが起動されたことを確認する
docker container ls
xinferenceの動作確認
xinferenceの動作確認やインストールおよび稼働しているLLMを調べるときには、xinference-containerの中に入ってください。
コンテナの中にログインして操作する
docker exec -it xinference-container /bin/bash
起動中のモデルの確認
xinference list
その他の操作については以下のドキュメントを参照
後続作業
これでXinference環境の作成と起動は終了です。この後は、Dify側でモデルプロバイダーとしてXinferenceを指定する作業を経るとDifyでXinferenceを利用できるようになります。
この手順は別記事で解説したいと思います。
Discussion