OML4Py: AI Vector SearchにONNXとHugging Faceを活用 (2024/05/31)

OML4Py: AI Vector SearchにONNXとHugging Faceを活用 (2024/05/31)

https://blogs.oracle.com/machinelearning/post/oml4py-leveraging-onnx-and-hugging-face-for-advanced-ai-vector-search

投稿者: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エコシステムとシームレスに統合します。


リソース



詳細は、次を参照してください。

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle APEXのInteractive Gridで、Oracle Formsと比較して、重複行の検証を制御/通過させる方法 (2022/07/21)

Oracle APEX 24.1の一般提供の発表 (2024/06/17)