OML4Py: AIベクトル検索のためのONNXおよびHugging Faceの活用 (2024/05/30)
OML4Py: AIベクトル検索のためのONNXおよびHugging Faceの活用 (2024/05/30)
投稿者:Sherry LaMonica | Consulting MTS, AI and Machine Learning, Product Management
Oracle Database 23aiでは、Oracle AI Vector Searchが導入され、Transformerモデルを用いてベクトルを生成し、データベース内で大規模に管理することで、セマンティック類似性検索に革命をもたらします。これにより、ユーザーは意味とコンテキストに基づいて関連情報を見つけることができ、別々のベクトルデータベースにデータを転送する際の煩わしさが解消され、複雑さと運用オーバーヘッドが軽減されます。
OML4Py 2.0以降、クライアントはHugging Faceの事前トレーニング済みTransformerモデルをAI Vector Search用のOpen Neural Network Exchange(ONNX)形式 に変換します。Hugging Faceはディープラーニング用のオープンソースPythonライブラリで、自然言語処理(NLP)、コンピュータービジョン、オーディオなど、数千もの事前トレーニング済みモデルを提供しています。ONNXは、Transformer、分類、回帰など、様々な機械学習モデルを表現するためのオープンフォーマットです。
OML4Pyクライアントは、Hugging Faceリポジトリから事前学習済みモデルをダウンロードし、前処理および後処理を施して拡張し、拡張モデルをONNX形式に変換してデータベース内モデルにロードするかファイルにエクスポートすることで、データベースへの埋め込み生成を効率化します。ONNX形式でロードすると、データベース内のONNXランタイムを使用してAI Vector Search用のベクトル埋め込みをシームレスに生成できます。
OML4Py クライアントと組み合わせることで、AI Vector Search は、Oracle Database でのベクトル埋め込みを活用し、テキスト データ分析、検索機能、機械学習アプリケーションを強化する包括的なソリューションを提供します。
このブログでは、OML4Pyクライアントのインストール手順を概説し、事前構成済みおよびカスタマイズされたモデルをONNX形式に変換する例を示し、そのモデルをOracle Databaseにロードします。これは、オンプレミスまたはクラウド上のOracle DatabaseとAutonomous Databaseに適用されます。
OML4Pyクライアントをインストールする
OML4Py 2.0クライアントはLinux 8 64ビットシステムでサポートされており、Oracle Autonomous Database ServerlessおよびOracle Databaseでサポートされています。以下の手順は、/etc/yum.repos.dにOL8リポジトリが設定されていること、 Autonomous Databaseを使用している場合はウォレットが設定されていること、および必要に応じてプロキシが設定されていることを前提としています。
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. PythonからONNXモデルをデータベースにロードする場合は、Oracle Instant Clientをインストールしてください。ファイルにエクスポートし、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
export LD_LIBRARY_PATH=$HOME/instantclient_23_4:$LD_LIBRARY_PATH
6. PythonおよびOracle Instant Clientの環境変数を定義するenv.shなどの環境ファイルを作成し、各OML4Pyクライアントセッションの前にこれらの環境変数を設定します。または、環境変数定義を.bashrcに追加して、ユーザーがLinuxマシンにログインしたときに定義されるようにします。
# Pythonの環境変数
export PYTHONHOME=$HOME/python
export PATH=$PYTHONHOME/bin:$PATH
export LD_LIBRARY_PATH=$PYTHONHOME/lib:$LD_LIBRARY_PATH
# 注: Pythonを使用してモデルをデータベースにロードする場合は、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のウェブサイトをご覧ください。例えば、all-MiniLM-L6-v2モデル はsentence-transformersライブラリの一部です。このモデルは、文または段落を384次元のベクトル(埋め込み)に変換します。
これら384次元はそれぞれ、文の意味や特徴の特定の側面を捉えています。この稠密なベクトル空間で文を表現することで、類似した文のクラスタリングや、意味が類似する文を探す意味検索など、様々なタスクを実行できます。
Python を使用して ONNX 形式のモデルを生成し、PL/SQL を使用してデータベースにロードします。
Python を使用して、 export2file()を呼び出して、事前構成された all-MiniLM-L6-v2 モデルから ONNX ファイルを生成します。
em = EmbeddingModel(model_name="sentence-transformers/all-MiniLM-L6-v2")
em.export2file("/tmp/models/all-MiniLM-L6", output_dir=".")
これにより、ONNX 形式のモデルがローカル ファイル システムにエクスポートされます。
ls -la all-MiniLM-L6.onnx
-rw-rw-r--。 1 opc opc 90621438 5 月 28 日 16:36 all-MiniLM-L6.onnx
ONNXファイルをデータベースサーバー上のディレクトリに移動し、ファイルシステムとデータベースにインポート用のディレクトリを作成します。必要な権限と付与を適用します。この例では、ORCLPDBというプラガブルデータベースを使用しています。
mkdir -p /tmp/models
sqlplus / as sysdba
alter session set container=ORCLPDB;
-- インポート用の ONNX ファイルを保存するディレクトリ
CREATE DIRECTORY ONNX_IMPORT AS '/tmp/models';
-- OML ユーザーにディレクトリの読み取りおよび書き込み権限を付与します
GRANT READ, WRITE ON DIRECTORY ONNX_IMPORT to OMLUSER;
-- ユーザーがモデルをインポートできるように付与します
GRANT CREATE MINING MODEL TO OMLUSER;
DBMS_VECTOR.LOAD_ONNX_MODELプロシージャを使用して、OMLユーザースキーマにモデルをロードします。この例では、このプロシージャはONNX_IMPORTディレクトリにあるall-MiniLM-L6.onnxという名前のONNXモデルファイルを、ALL_MINILM_L6という名前のモデルとしてデータベースにロードします。
BEGIN
DBMS_VECTOR.LOAD_ONNX_MODEL(
directory => 'ONNX_IMPORT',
file_name => 'all-MiniLM-L6.onnx',
model_name => 'ALL_MINILM_L6');
END;
PL/SQL プロシージャが正常に完了しました。
モデルがデータベースに存在することを確認します。
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=メタデータ、P=解析済み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モデルをデータベースにロードする
DBMS_VECTOR.LOAD_ONNX_MODELでexport2file()を使用する代わりに、Python からモデルを直接データベースにロードすることもできます。この手順では、OML4Py クライアントのインストールセクションに記載されている Oracle Instant クライアントのインストールが必要です。
oml.utilsからomlライブラリとEmbeddingModelをインポートします。
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トークンを使用し、ベクトル距離演算子にはコサイン類似度メトリックを使用します。モデルの最大サイズは1GBで、量子化によりメモリ使用量は1GB未満に削減されます。
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エコシステムとシームレスに統合され、データベースのデータ管理、セキュリティ、スケーラビリティ機能を活用します。
リソース
詳細については、以下を参照してください。
コメント
コメントを投稿