2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Database 23aiにHuggin Face上のONNXフォーマットでモデルをインポート/Embeddingしてみた

Posted at

はじめに

本記事はOracle 23ai Free版とvectorユーザー(こちらの記事を参考に20分ほどで終わります)の作成が完了していることを前提に書いています。

Oracle Database 23aiを触っていると社内の先輩からお声がけいただきました。
Oracle Database 23aiではONNXフォーマットでエクスポートした学習済みEmbeddingモデルをインポートし、Embeddingに使用することができますよー。

・・・
・・・・
・・・??
(-_-)zzz 読み方わからん

ONNXフォーマットってなんやねん

概要

機械学習モデルを表現するために使用されるフォーマット

  • Open Neural Network eXchangeの略
  • オニキスと読む
  • オープンソースのフォーマット

ONNXができた理由

フレームワークの相互運用性を高めるため

  • モデルの運用は各々の環境に特化しており、別の環境に移すと動作しないことが多々あった
  • じゃあ学習したフォーマット、1回統一した形式に出力してから使えばいいやん!
    といった経緯らしいです。

image.png

ONNX フォーマットにして嬉しい理由

  • いろんな言語/ハードウェアで動かせる
    • 言語:C++, C#, Java, Node.js, Ruby, Pythonなど
    • ハードウェア:CPU, Nvidia GPUのほかAMD GPUやNPU、FPGAも対応
  • 今後ますますONNXの普及が進んでいく可能性大
    • Amazon、Microsoft、FaceBookなど有名企業が協業して開発中

なんとなくわかった気がします。

Oracle Database 23aiにONNXフォーマットでモデルをインポートする理由は?

  • データをDB外に動かさずEmbeddingできる
  • Genarative AIをAPIコールのためユーザーのクレデンシャルを設定しなくて良い
  • APIコール分のネットワークレイテンシーがのらない
  • (条件を満たせば)任意の学習モデルをインポートできる

1. 事前準備

DBユーザ「vector」でログインします。

sqlplus vector/vector@freepdb1

ディレクトリ・オブジェクトを作成、必要な権限を付与します。

CREATE OR REPLACE DIRECTORY VEC_DUMP AS '/home/oracle';
GRANT READ, WRITE ON DIRECTORY VEC_DUMP TO vector;
COMMIT;

2. OML4Pyセットアップ

ONNXフォーマット使用要件

Oracle Databaseに学習済みモデルをONNXフォーマットでimportするには、 OML4Pyを使ったONNXのexportが必要です。(OML4Py以外でexportされたONNXフォーマットはImportできない・・・)

というわけで、OML4Pyをインストールしていきます。

必要なOSパッケージインストール

rpm -qaコマンドでそれぞれの不足パッケージを全て確認します。

sudo su -

rpm -qa perl-Env
rpm -qa libffi-devel
rpm -qa openssl 
rpm -qa openssl-devel
rpm -qa tk-devel
rpm -qa xz-devel
rpm -qa zlib-devel
rpm -qa bzip2-devel
rpm -qa readline-devel
rpm -qa libuuid-devel
rpm -qa ncurses-devel

確認したらyumコマンドで不足しているパッケージをインストールしていきます。

yum install perl-Env libffi-devel tk-devel bzip2-devel readline-devel libuuid-devel ncurses-devel

OML4Pyをインストールするため、Anacondaで仮想環境を管理します。
Anacondaのインストール

mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3

PATHを通して、Anaconda初期セットアップは完了です!

~/miniconda3/bin/conda init bash

ターミナルをもう一度立ち上げると、condaコマンドが使えるようになります!
仮想環境を新規作成します。

conda create -n (任意の仮想環境名) python=(任意のPythonバージョン)

実行したコマンド

conda create -n test python=3.12

仮想環境testのアクティベート

conda activate test
pip install pandas
pip install setuptools
pip install scipy
pip install matplotlib
pip install oracledb
pip install joblib
pip install scikit-learn
pip install numpy
pip install onnxruntime
pip install onnxruntime-extensions
pip install onnx
pip install --extra-index-url "https://download.pytorch.org/whl/cpu" torch
pip install transformers
pip install sentencepiece

Oracle Technology NetworkからOracle Machine Learning for Python をダウンロードページにアクセスし、 [23ai Client]モジュールをローカルにダウンロードします。
image.png

ディレクトリ移動

mkdir oml4py
cd oml4py

scpコマンドなどで↑で作成したディレクトリに先ほどダウンロードしたZIPファイルを移動させます。

unzip oml4py-client-linux-x86_64-2.0.zip
perl -Iclient client/client.pl

Proceed?聞かれるのでYesと答えます。

Successfully installed oml-2.0

Done

OML4Pyのセットアップが完了しました!

3.Huggin Face上のONNXモデルをエクスポートする

Use Guideを参考に手順を踏んでいきます。
まず、Pythonの対話型シェルを起動します。

Python3

Hugging Faceから任意のモデルをダウンロードしてください。
今回は104カ国語に対応しているマルチリンガルモデルgoogle-bert/bert-base-multilingual-casedを使用しました。

注意事項

  • ※Exportモデルのサイズは1GBまで
  • quantize_model=Trueで1GBに調整可能

2 つのクラスEmbeddingModel,EmbeddingModelConfigをインポートします。

from oml.utils import EmbeddingModel, EmbeddingModelConfig

テンプレートからモデルの構成オブジェクトを作成します。

  • text:テンプレートの名前
  • max_seq_length=512:モデルへの入力の最大長トークン数
config = EmbeddingModelConfig.from_template("text",max_seq_length=512,quantize_model=True)

事前定義されているインスタンスの初期化を行います。

  • model_name:ロードする事前トレーニング済みモデルの名前
em = EmbeddingModel(model_name="google-bert/bert-base-multilingual-cased", config=config)
  • 第1引数:ユーザー定義の ONNX モデル名
  • 第2引数:ONNXファイルが保存される出力ディレクトリを指定
    • "."は現在のディレクトリ
em.export2file("bert-base-multilingual-cased",output_dir=".")

oml4pyディレクトリにbert-base-multilingual-cased.onnxというファイルがエクスポートされているはずです!

4.ONNXフォーマットをOracle Database 23aiにインポート

事前準備で作成したVEC_DUMPディレクトリにbert-base-multilingual-cased.onnxを移動させておきます。
まずは、
DBユーザ「vector」でログインします。

sqlplus vector/vector@freepdb1

DBMS_VECTOR.LOAD_ONNX_MODELプロシージャを使用して、エクスポートしたONNXファイルをDBにインポートします。

  • ディレクトリ名 : VEC_DUMP
  • インポートするONNXファイル名 : bert-base-multilingual-cased.onnx
  • 登録する任意のモデル名 : doc_model
  • JSON形式のメタ情報
    • function : embedding (モデルの種類)
    • embeddingOutput : emveddingOutput (生成されたエンベディングを保持するモデル出力)
    • input : モデルの入力マッピングについて説明
EXECUTE DBMS_VECTOR.LOAD_ONNX_MODEL( 'DATA_PUMP_DIR', 'bert-base-multilingual-cased.onnx', 'minilm_model', JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input": {"input": ["DATA"]}}'));

5.インポートしたモデルでEmbeddingしてみる

せっかくマルチリンガルモデルなので、”こんにちは”をベクトル化してみます。

SELECT TO_VECTOR(VECTOR_EMBEDDING(doc_model USING 'こんにちは' as data)) AS embedding;

結果

EMBEDDING
--------------------------------------------------------------------------------
[1.83466617E-002,-4.49530967E-002,3.72901559E-002,1.14019075E-002,1.05774663E-00
2,2.98821665E-002,2.26891469E-002,4.69735526E-002,-5.6950625E-002,9.14487895E-00
3,2.65075881E-002,9.30174813E-002,3.87203395E-002,2.77586859E-002,1.06022535E-00
2,-2.85519883E-002,5.75444959E-002,-2.07790714E-002,-3.01839504E-002,5.22442684E
-002,-6.59843311E-002,8.64373427E-003,3.98213342E-002,2.27618758E-002,1.18214637
E-002,7.86895156E-002,-6.24861009E-002,-4.87056151E-002,3.57667147E-003,-3.91889
773E-002,1.36257557E-003,-3.31115089E-002,1.89379032E-003,-4.13463637E-003,8.255
51888E-006,-6.73396746E-003,-1.36754327E-002,5.08497879E-002,5.99995516E-002,-1.
04993302E-002,-1.41968597E-002,1.8587349E-002,-7.74052751E-004,-2.60757166E-003,
-1.66333839E-002,8.1936596E-004,3.29511464E-002,8.40951875E-003,-1.39681762E-002
,5.94577491E-002,6.20501721E-003,8.87873396E-003,-1.3176783E-002,-9.61824786E-00



EMBEDDING
--------------------------------------------------------------------------------
0441185E-003,-1.79465283E-002,5.06018698E-002,1.10141179E-002,3.07282936E-002,-4
.75509139E-003,1.82689645E-003,4.12070677E-002,-4.29137098E-003,1.27261691E-002,
-1.34949297E-001,1.11087831E-002,-1.00812279E-002,-9.97149795E-002,-6.79327995E-
002,6.30223602E-002,6.57042861E-002,

長いですが、ベクトル化できていることが確認できました!!
追加でONNXモデルを呼び出してベクトル検索もできたらいい…な…(書きます)

参考

大変参考にさせていただきました!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?