OML4Py: AI Vector SearchにONNXとHugging Faceを活用 (2024/05/31)
OML4Py: AI Vector SearchにONNXとHugging Faceを活用 (2024/05/31)
投稿者:Sherry LaMonica
Oracle Database 23aiでは、Oracle AI Vector Searchが導入され、トランスフォーマ・モデルを使用してベクターを生成し、データベース内で大規模に管理することで、セマンティック類似性検索に革命をもたらしました。これにより、ユーザーは、意味とコンテキストに基づいて関連情報を見つけられるようになり、データを別のベクトル・データベースに転送する問題点をなくし、複雑さと運用上のオーバーヘッドを削減できます。
OML4Py 2.0以降、クライアントは、事前トレーニング済のトランスフォーマ・モデルをHugging FaceからAI Vector Search用のOpen Neural Network Exchange (ONNX)形式に変換します。Hugging FaceはディープラーニングのためのオープンソースのPythonライブラリで、自然言語処理(NLP)、コンピュータビジョン、オーディオなどのための何千もの事前トレーニング済みモデルを提供しています。ONNXは、トランスフォーマー、分類、回帰などの様々な機械学習モデルを表すためのオープン形式です。
OML4Pyクライアントは、Hugging Faceリポジトリから事前トレーニング済モデルをダウンロードし、前処理および後処理ステップで拡張し、拡張モデルをONNX形式に変換し、それをデータベース内モデルにロードするか、ファイルにエクスポートすることで、データベースに生成を埋め込むためのパスを合理化します。ONNX形式でロードされると、データベース内のONNXランタイムをシームレスに使用して、AI Vector Searchのベクトル埋込みを生成できます。
AI Vector Searchは、OML4Pyクライアントと組み合わせて、Oracle Databaseでベクトル埋め込みを活用し、テキストデータ分析、検索機能、機械学習アプリケーションを拡張するための包括的なソリューションを提供します。
このブログでは、OML4Pyクライアントをインストールするステップの概要、事前構成済およびカスタマイズされたモデルをONNX形式に変換する例、およびモデルをOracle Databaseにロードするステップについて説明します。これは、オンプレミスまたはクラウドおよびAutonomous Database上のOracle Databaseに適用されます。
OML4Pyクライアントをインストール
OML4Py 2.0クライアントは、Linux 8 64ビット・システムでサポートされており、Oracle Autonomous Database ServerlessおよびOracle Databasesでサポートされています。次の手順では、/etc/yum.repos.dでOL8リポジトリを構成し、Autonomous Databaseを使用している場合はWalletを構成し、必要に応じてプロキシが設定されていることを前提としています。
1.Pythonのインストール
sudo yum install libffi-devel openssl openssl-devel tk-devel
xz-devel zlib-devel bzip2-devel readline-devel libuuid-devel
ncurses-devel libaio
mkdir -p $HOME/python
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
tar -xvzf Python-3.12.0.tgz --strip-components=1 -C /home/$USER/python
cd $HOME/python
./configure --prefix=$HOME/python
make clean; make
make altinstall
2.Pythonの変数を設定します: PYTHONHOME、PATHおよびLD_LIBRARY_PATH
export PYTHONHOME=$HOME/python
export PATH=$PYTHONHOME/bin:$PATH
export LD_LIBRARY_PATH=$PYTHONHOME/lib:$LD_LIBRARY_PATH
3.python3およびpip3のシンボリックリンクの作成
cd $HOME/python/bin
ln -s python3.12 python3
ln -s pip3.12 pip3
4.ONNXモデルをPythonからデータベースにロードする場合は、Oracle Instantクライアントをインストールします。ファイルにエクスポートし、DBMS_VECTOR.LOAD_ONNX_MODELを使用してモデルをデータベースにロードする場合は、このステップとステップ5をスキップし、ステップ6の環境変数にあるノートを参照してください。
cd $HOME
wget https://download.oracle.com/otn_software/linux/instantclient/2340000/instantclient-basic-linux.x64-23.4.0.24.05.zip
unzip instantclient-basic-linux.x64-23.4.0.24.05.zip
5.Oracle Instant Clientの変数LD_LIBRARY_PATHを設定
export LD_LIBRARY_PATH=$HOME/instantclient_23_4:$LD_LIBRARY_PATH
6.PythonおよびOracle Instantクライアント環境変数を定義するenv.shなどの環境ファイルを作成し、各OML4Pyクライアント・セッションの前にこれらの環境変数をソースとします。または、環境変数定義を.bashrcに追加して、ユーザーがLinuxマシンにログインしたときに定義されるようにします。
# Environment variables for Python
export PYTHONHOME=$HOME/python
export PATH=$PYTHONHOME/bin:$PATH
export LD_LIBRARY_PATH=$PYTHONHOME/lib:$LD_LIBRARY_PATH
# Note: If Python is used to load models to the database, set this environment variable for the Oracle Instant Client.
export LD_LIBRARY_PATH=$HOME/instantclient_23_4:$LD_LIBRARY_PATH
7. 必要なサード・パーティ・パッケージを含むrequirements.txtという名前のファイルを作成
--extra-index-url https://download.pytorch.org/whl/cpu
pandas==2.1.1
setuptools==68.0.0
scipy==1.12.0
matplotlib==3.8.4
oracledb==2.2.0
scikit-learn==1.4.1post1
numpy==1.26.4
onnxruntime==1.17.0
onnxruntime-extensions==0.10.1
onnx==1.16.0
torch==2.2.0+cpu
transformers==4.38.1
sentencepiece==0.2.0
8.pip3をアップグレードし、requirements.txtにパッケージをインストール
pip3 install --upgrade pip
pip3 install -r requirements.txt
9. OML4Pyクライアントをインストール
OML4Py 2.0クライアントをダウンロードし、Linuxクライアントにアップロード
unzip oml4py-client-linux-x86_64-2.0.zip
pip3 install client/oml-2.0-cp312-cp312-linux_x86_64.whl
10. Pythonを起動し、omlパッケージをインポート
$ python3
Python 3.12.0 (main, May 28 2024, 16:09:11) [GCC 8.5.0 20210514 (Red Hat 8.5.0-20.0.3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import oml
データベースへの事前トレーニング済埋込みモデルのロード
OML4Pyクライアントは、テキストベース・モデルの共通構成を含む、テンプレートと呼ばれる組込みプロパティ構成を提供します。これらの構成では、前処理および後処理ステップに加え、サポートされている言語および適用可能な距離メトリックを指定します。テンプレートには、事前トレーニング済モデルのデフォルト構成が含まれており、特定のユースケースのカスタム構成を作成するように変更できます。OML4Pyは、これらのモデルをONNX形式に簡単に変換し、必要なすべてのトークン化および後処理ステップを簡単に管理します。結果のONNXパイプラインは、PythonからOracle Database 23aiインスタンスにロードされるか、またはモデルをファイルにエクスポートして、DBMS_VECTOR.LOAD_ONNX_MODELプロシージャを使用してデータベースにロードすることによってロードされます。
埋込みモデル・クラスをインポートし、使用可能な事前構成済モデルを表示します。
from oml.utils import EmbeddingModel, EmbeddingModelConfig
EmbeddingModelConfig.show_preconfigured()
['sentence-transformers/all-mpnet-base-v2',
'sentence-transformers/all-MiniLM-L6-v2',
'sentence-transformers/multi-qa-MiniLM-L6-cos-v1',
'ProsusAI/finbert',
'medicalai/ClinicalBERT',
'sentence-transformers/distiluse-base-multilingual-cased-v2',
'sentence-transformers/all-MiniLM-L12-v2',
'BAAI/bge-small-en-v1.5',
'BAAI/bge-base-en-v1.5',
'taylorAI/bge-micro-v2',
'intfloat/e5-small-v2',
'intfloat/e5-base-v2',
'prajjwal1/bert-tiny',
'thenlper/gte-base',
'thenlper/gte-small',
'TaylorAI/gte-tiny',
'infgrad/stella-base-en-v2',
'sentence-transformers/paraphrase-multilingual-mpnet-base-v2',
'intfloat/multilingual-e5-base',
'intfloat/multilingual-e5-small',
'sentence-transformers/stsb-xlm-r-multilingual']
このリストのモデルの詳細は、HuggingFace Webサイトを参照してください。たとえば、all-MiniLM-L6-v2モデルは、センテンス・トランスフォーマ・ライブラリの一部です。このモデルは、文または段落を取り、埋め込みと呼ばれる384次元ベクトルに変換します。
これらの384次元はそれぞれ、文の意味または特性の特定の側面をキャプチャします。この密度のベクター空間で文を表すことで、類似する文をクラスタリングしたり、類似する意味を持つ文を探すセマンティック検索を行うなど、様々なタスクを実行できます。
Pythonを使用してONNX形式モデルを生成し、PL/SQLを使用してデータベースにロード
Pythonを使用して、export2file()を起動し、事前構成済のオールMiniLM-L6-v2モデルからONNXファイルを生成します。
em = EmbeddingModel(model_name="sentence-transformers/all-MiniLM-L6-v2")
em.export2file("all-MiniLM-L6", output_dir=".")
これにより、ONNX形式モデルがローカル・ファイル・システムにエクスポートされます。
ls -la all-MiniLM-L6.onnx
-rw-rw-r--. 1 opc opc 90621438 May 28 16:36 all-MiniLM-L6.onnx
ONNXファイルをデータベース・サーバー上のディレクトリに移動し、ファイル・システムおよびデータベースにインポート用のディレクトリを作成します。必要な権限および権限を適用します。この例では、ORCLPDBという名前のプラガブル・データベースを使用しています。
mkir -p /tmp/models
sqlplus / as sysdba
alter session set container=ORCLPDB;
-- directory to store ONNX files for import
CREATE DIRECTORY ONNX_IMPORT AS '/tmp/models';
-- grant your OML user read and write permissions on the directory
GRANT READ, WRITE ON DIRECTORY ONNX_IMPORT to OMLUSER;
-- grant to allow user to import the model
GRANT CREATE MINING MODEL TO OMLUSER;
DBMS_VECTOR.LOAD_ONNX_MODELプロシージャを使用して、OMLユーザー・スキーマにモデルをロードします。この例では、all-MiniLM-L6.ONNXモデル・ファイルという名前のONNXモデル・ファイルを、ONNX_IMPORTディレクトリからALL_MINILM_L6という名前のモデルとしてデータベースにロードします。
BEGIN
DBMS_VECTOR.LOAD_ONNX_MODEL(
directory => 'ONNX_IMPORT',
file_name => 'all-MiniLM-L6-v2.onnx',
model_name => 'ALL_MINILM_L6');
END;
PL/SQL procedure successfully completed.
モデルがデータベースに存在することを確認します。
SELECT MODEL_NAME, ALGORITHM, MINING_FUNCTION
FROM USER_MINING_MODELS
WHERE MODEL_NAME='ALL_MINILM_L6';
--------------------------------------------------------------------------
MODEL_NAME ALGORITHM MINING_FUNCTION
--------------------------------------------------------------------------
ALL_MINILM_L6 ONNX EMBEDDING
各モデルで暗黙的に使用可能になるのは、関連するモデル詳細ビューであり、システム提供のドキュメントとして機能します。これには、モデル設定と、アルゴリズム固有にできるその他のコンテンツが含まれます。モデルALL_MINILM_L6の場合、次の問合せを使用してモデル・ビューのセットを取得できます。
SELECT VIEW_NAME, VIEW_TYPE
FROM USER_MINING_MODEL_VIEWS
WHERE MODEL_NAME='ALL_MINILM_L6'
ORDER BY VIEW_NAME;
----------------------------------------------------
VIEW_NAME VIEW_TYPE
-----------------------------------------------------
DM$VJALL_MINILM_L6 ONNX Metadata Information
DM$VMALL_MINILM_L6 ONNX Model Information
DM$VPALL_MINILM_L6 ONNX Parsing Information
各モデル・ビューには一意の名前があります。"DM$V"はモデル・ビュー接頭辞で、それに含まれる情報のタイプを示す文字(J=JSON、M=Metadata、P=parsed JSONなど)の後にモデル名が続きます。
ONNXモデル情報ビューを問い合せると、ONNXモデルを生成したツールの名前、グラフ名とバージョン、モデル入力マッピング、および出力ベクトル情報がディメンションとタイプとともに表示されます。
SELECT * FROM DM$VMALL_MINILM_L6;
--------------------------------------------------------------------------
NAME VALUE
--------------------------------------------------------------------------
Producer Name onnx.compose.merge_models
Graph Name tokenizer_main_graph
Graph Description Graph combining tokenizer and main_graph tokenizer
main_graph Version 1
Input[0] input:string[?]
Output[0] embedding:float32[?,384]
6 rows selected.
VECTOR_EMBEDDING SQLスコアリング関数を使用して、埋込みベクターを生成します。部分的な出力を次に示します。
SELECT VECTOR_EMBEDDING(ALL_MINILM_L6 USING 'RES' as DATA) AS embedding;
EMBEDDING
--------------------------------------------------------------------------------
[-1.16423041E-001,1.54331913E-002,-4.69262972E-002,7.1672732E-003,3.5023436E-002
,-4.02988493E-002,1.84127204E-002,6.48672804E-002,1.49925603E-002,1.20538445E-00
2,-3.54219265E-002,-9.51012298E-002,-2.08232403E-002,4.99225557E-002,-1.86311286
E-002,-2.62796637E-002,-3.2601878E-002,5.22731915E-002,-9.84884799E-002,9.467907
95E-004,4.39537093E-002,1.06041664E-002,2.93337256E-002,-4.25205268E-002,-2.5767
...
...
PythonからデータベースへのONNXモデルのロード
export2file()をDBMS_VECTOR.LOAD_ONNX_MODELとともに使用するかわりに、モデルをPythonからデータベースに直接ロードします。このステップでは、OML4Pyクライアントのインストールの項の説明に従って、Oracle Instantクライアントをインストールする必要があります。
omlライブラリおよびEmbeddingModelをoml.utilsからインポートします。
import oml
from oml.utils import EmbeddingModel
オンプレミスのOracle Databaseの埋込みモードをfalseに設定します。これは、Oracleではサポートされていないか、必須ではありません。
Autonomous Database.
oml.core.methods.__embed__ = False
データベース接続を作成します。資格証明およびデータベース環境と一致するように、次のパラメータを更新します。
# Oracle Database
oml.connect("<user>", "<password>", port=<port number>
host="<hostname>", service_name="<service name>")
# Oracle Autonomous Database
oml.connect(user="<user>", password="<password>", dsn="myadb_low")
事前構成済モデルをデータベースにロードします(注意: このステップは、DBMS_VECTOR.LOAD_ONNX_MODELを使用することと同じです)。
em = EmbeddingModel(model_name="sentence-transformers/all-MiniLM-L6-v2")
em.export2db("ALL_MINILM_L6")
インポートすると、モデルとそのビューを前述のように問い合せることができ、PythonまたはSQLから埋込みを生成できます。
import oracledb
cr = oml.cursor()
data = cr.execute("select vector_embedding(ALL_MINILM_L6 using 'RES' as DATA)AS embedding from dual")
data.fetchall()
[(array('f', [-0.11642304062843323, 0.015433191321790218, -0.04692629724740982, 0.007167273201048374,
0.035023435950279236, -0.04029884934425354, 0.018412720412015915,
0.0648672804236412, 0.014992560259997845, 0.012053844518959522,
-0.03542192652821541, -0.09510122984647751, -0.020823240280151367,
0.049922555685043335, -0.01863112859427929, -0.026279663667082787,
-0.03260187804698944, 0.05227319151163101, -0.09848847985267639,
0.0009467907948419452, 0.04395370930433273, 0.01060416642576456,
0.029333725571632385, -0.04252052679657936, -0.025767622515559196,
-0.03291202709078789, -0.053170595318078995, 0.07415973395109177,
0.0082617262378335,
...
...
SELECT VECTOR_EMBEDDING(ALL_MINILM_L6 USING 'RES' as DATA) AS embedding;
EMBEDDING
--------------------------------------------------------------------------------
[-1.16423041E-001,1.54331913E-002,-4.69262972E-002,7.1672732E-003,3.5023436E-002
,-4.02988493E-002,1.84127204E-002,6.48672804E-002,1.49925603E-002,1.20538445E-00
2,-3.54219265E-002,-9.51012298E-002,-2.08232403E-002,4.99225557E-002,-1.86311286
E-002,-2.62796637E-002,-3.2601878E-002,5.22731915E-002,-9.84884799E-002,9.467907
95E-004,4.39537093E-002,1.06041664E-002,2.93337256E-002,-4.25205268E-002,-2.5767
...
...
カスタム・モデル構成の作成
デフォルト構成に加えて、ユーザーは、OML4Pyに付属するテキスト・テンプレートを使用してカスタム構成を柔軟に作成することもできます。カスタム構成は、次に示すようにconfigパラメータで指定されます。この場合、モデルへの入力として最大256個のトークンを使用し、ベクトル距離演算子のCosine類似度メトリックを使用します。最大モデル・サイズは1 GBで、量子化はメモリー・フットプリントを1 GB未満に減らします。
from oml.utils import EmbeddingModel, EmbeddingModelConfig
config = EmbeddingModelConfig.from_template("text", max_seq_length=256, distance_metrics=["COSINE"], quantize_model=True)
em = EmbeddingModel(model_name="sentence-transformers/all-MiniLM-L6-v2", config=config)
em.export2db("ALL_MINILM_L6")
カスタム構成で定義できるプロパティの完全なリストは、『OML4Pyユーザーズ・ガイド』の「プロパティ」表を参照してください。事前構成済モデルでは、これらのプロパティが特定の値に設定されています。
VECTOR_EMBEDDINGによって生成された埋込みをデータベース表に格納して、AI Vector Searchを有効にできます。データ管理、セキュリティ、スケーラビリティのためのデータベースの機能を活用して、Oracleエコシステムとシームレスに統合します。
リソース
詳細は、次を参照してください。
コメント
コメントを投稿