Aufgabe:
Nach der Bereitstellung einer lokalen 23ai Umgebung sollen nun verschiedene Modell für einen Hybrid Vektor getestet werden.
Wie aber am einfachsten die passenden Modell im „Open Neural Network Exchange (ONNX)„ Format herunterladen?
Dafür wird der Oracle® Machine Learning for Python - OML4Py eingesetzt.
Nach der Installation des Clients können bereits hinterleget Modell heruntergeladen und in die Datenbank importiert werden.
Im ersten Teil wurde ein Hybird Vector mit einem „gefunden“ Model erfolgreich anlegt und getestet.
Dazu dient eine Oracle 23ai podman Container Installation unter Linux ⇒ siehe dazu Oracle Datenbank 23ai Free Edition über ein Container Image unter Linux 9 als Testumgebung für AI Vector Search verwenden
Um ein Model für Vektor Search zu laden, wird ein Model im ONNX Format benötigt.
Für das Handling dieser Modell kann das OML4Py Client Framework von Oracle verwendet werden.
Um später auch die OML4Py Server Komponente zuzugreifen, wird der Instant Client als Oracle Basis Library installiert.
Da wir ein Oracle Linux 9 verwenden kann das gleich über ein Repo erfolgen:
dnf install oracle-instantclient-release-23ai-el9 # minmal dnf install oracle-instantclient-odbc.x86_64 # alles, mit SQL*Plus zum debuggen der Verbindung! dnf install oracle-instantclient-basic oracle-instantclient-odbc oracle-instantclient-sqlplus oracle-instantclient-tools # wo landet das ganze? rpm -ql oracle-instantclient-odbc.x86_64 *** /usr/lib/oracle/23/client64 ***
siehe auch https://yum.oracle.com/repo/OracleLinux/OL9/oracle/instantclient23/x86_64/index.html
!Python 3.12.3 is required to install and use OML4Py 2.0.1 client.!
Version prüfen:
python3 --version
Python 3.9.21
Gibt es für Linux 9 auch ein neueres Python?
siehe ⇒ https://yum.oracle.com/oracle-linux-python.html
dnf repolist yum-config-manager --enable ol9_appstream dnf install python3.12 dnf install python3.12-pip python3.12 --version Python 3.12.5
Version konfigurieren:
alternatives --install /usr/bin/python python /usr/bin/python3.12 10 alternatives --install /usr/bin/python python /usr/bin/python3.9 20 alternatives --config python python --version Python 3.12.5 alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 10 alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 20 alternatives --config python3 python3 --version # falls vertippt # aufräumen und wieder von vorn anfangen .-) # alternatives --remove-all python # alternatives --remove-all python3
PIP upgarde
python3 -m pip install --upgrade pip --no-warn-script-location --root-user-action ignore Requirement already satisfied: pip in /usr/local/lib/python3.12/site-packages (25.0.1)
Notwendendige Libs installieren:
Als root:
dnf install perl-Env libffi-devel openssl openssl-devel tk-devel xz-devel zlib-devel bzip2-devel readline-devel libuuid-devel ncurses-devel
Python Libs installieren:
vi 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.1.post1 numpy==1.26.4 onnxruntime==1.17.0 onnxruntime-extensions==0.10.1 onnx==1.16.0 torch==2.2.0 transformers==4.38.1 sentencepiece==0.2.0
Mit PIP installieren:
pip3.12 install -r requirements.txt
Den Client installieren wir ganz klassisch unter /opt/oracle/products/OML4Py als Oracle User.
Über die Seite https://www.oracle.com/database/technologies/oml4py-downloads.html den OML4Py 2.0.1 Client für die 23ai herunterladen
Über den Link wird man auf edelivery weiter leitet und kann „V1045139-01.zip OML4Py 2.0.1 client for (Linux x86-64), 8.3 MB“ herunterladen
V1045139-01.zip OML4Py 2.0.1 client for (Linux x86-64), 8.3 MB SHA-1 D7C740CDD851A7EDC1BBB9D8D03BBF46BE290C3E SHA-256 0350CB27A2DEF31708813EBB3AD73F6054D2FD1EC4C806556853253C9C2E620C
Wie gewohnt nach dem Download den SHA prüfen ob es wirklich die richtige Datei ist!
su - oracle cd /opt/oracle/ mkdir install cd /opt/oracle/install cp /tmp/V1045139-01.zip . sha1sum V1045139-01.zip d7c740cdd851a7edc1bbb9d8d03bbf46be290c3e V1045139-01.zip unzip V1045139-01.zip Archive: V1045139-01.zip inflating: client/client.pl inflating: client/OML4PInstallShared.pm inflating: client/oml-2.0-cp312-cp312-linux_x86_64.whl extracting: client/oml4py.ver
Installation starten:
Client Verzeichnis anlegen und Pfad auch auf /usr/local/bin setzen (falls nicht eh enthalten):
mkdir -p /opt/oracle/products/OML4Py export PATH=$PATH:/usr/local/bin # am besten gleich mit in die .bash_profile aufnehmen!
1.Versuch
perl -Iclient client/client.pl --help Can't locate File/Copy.pm in @INC (you may need to install the File::Copy module) (@INC contains: client /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at client/OML4PInstallShared.pm line 60. BEGIN failed--compilation aborted at client/OML4PInstallShared.pm line 60. Compilation failed in require at client/client.pl line 32. BEGIN failed--compilation aborted at client/client.pl line 32.
Eine Perl Bibliothek fehlt:
#als root dnf install perl-File-Copy-Recursive-Reduced
2.Versuch
perl -Iclient client/client.pl --help Oracle Machine Learning for Python 2.0 Client. Copyright (c) 2018, 2024 Oracle and/or its affiliates. All rights reserved. Usage: client.pl [OPTION]... Install, upgrade, or uninstall OML4P Client. -i, --install install or upgrade (default) -u, --uninstall uninstall -y never prompt --ask interactive mode (default) --no-embed do not install embedded python functionality --no-deps turn off dependencies checking --target <dir> install client into <dir>
perl -Iclient client/client.pl --target /opt/oracle/products/OML4Py Oracle Machine Learning for Python 2.0 Client. Copyright (c) 2018, 2024 Oracle and/or its affiliates. All rights reserved. Checking platform .................. Pass Checking Python .................... Pass Checking dependencies .............. /opt/oracle/install/check_deps.py:2: DeprecationWarning: pkg_resources is deprecated as an API. See https://en/latest/pkg_resources.html from pkg_resources import WorkingSet, VersionConflict, DistributionNotFound Fail ERROR: Install version 1.26.4 or higher of numpy at client/client.pl line 141.
Darauf achten das zuvor auch alle Pyhton Libs installiert installiert wurden!
3.Versuch
export PATH=$PATH:/usr/local/bin # am besten gleich mit in die .bash_profile aufnehmen! perl -Iclient client/client.pl --target /opt/oracle/products/OML4Py Oracle Machine Learning for Python 2.0 Client. Copyright (c) 2018, 2024 Oracle and/or its affiliates. All rights reserved. Checking platform .................. Pass Checking Python .................... Pass Checking dependencies .............. /opt/oracle/install/check_deps.py:2: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html from pkg_resources import WorkingSet, VersionConflict, DistributionNotFound Pass Checking OML4P version ............. Pass Current configuration Python Version ................... 3.12.5 PYTHONHOME ....................... /usr Existing OML4P module version .... None Installation location ............ /opt/oracle/products/OML4Py Operation ........................ Install/Upgrade Proceed? [yes]yes Processing ./client/oml-2.0-cp312-cp312-linux_x86_64.whl Installing collected packages: oml Successfully installed oml-2.0 Done
Damit ist die Python oml Bibliothek auf der Maschine verfügbar.
Im python3 Interpreter wird die oml Bibliothek importiert und dann können die entsprechenden Klassen aufgerufen werden:
cd /opt/oracle/products/OML4Py # Interpreter starten python3 # Abfragen >>> import oml >>> oml <module 'oml' from '/opt/oracle/products/OML4Py/oml/__init__.py'> >>> oml.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' , 'microsoft/codebert-base' , 'Snowflake/snowflake-arctic-embed-xs' , 'Snowflake/snowflake-arctic-embed-s' , 'Snowflake/snowflake-arctic-embed-m' ]
Über den Interpreter Aufruf kann dann auch das gewünschte Model in unsere Datenbank Import Verzeichnis ( in unseren Fall /opt/oracle/datadump auf dem Host, das Verzeichnis ist zuvor in den 24ai Container gemappt worden und in der 23ai PPB als Directory hinterlegt) im ONNX Format geladen werden.
cd /opt/oracle/products/OML4Py # Interpreter aufrufen python3 # oml Klassen für den Download verwenden >>> from oml.utils import EmbeddingModel, EmbeddingModelConfig >>> em = EmbeddingModel(model_name="sentence-transformers/all-MiniLM-L6-v2") >>> em.export2file("all-MiniLM-L6-v2.onnx", output_dir="/opt/oracle/datadump") /usr/local/lib/python3.12/site-packages/huggingface_hub/file_download.py:797: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`. warnings.warn( tokenizer_config.json: 100%|███████████████████████████████████████████████████████████████████████████████████| 350/350 [00:00<00:00, 1.15MB/s] vocab.txt: 100%|█████████████████████████████████████████████████████████████████████████████████████████████| 232k/232k [00:00<00:00, 3.67MB/s] special_tokens_map.json: 100%|██████████████████████████████████████████████████████████████████████████████████| 112/112 [00:00<00:00, 292kB/s] tokenizer.json: 100%|████████████████████████████████████████████████████████████████████████████████████████| 466k/466k [00:00<00:00, 10.4MB/s] config.json: 100%|█████████████████████████████████████████████████████████████████████████████████████████████| 612/612 [00:00<00:00, 1.52MB/s] model.safetensors: 100%|███████████████████████████████████████████████████████████████████████████████████| 90.9M/90.9M [00:04<00:00, 18.5MB/s] >>> >>> quit()
Was wurde angelegt:
ls -la ls -la /opt/oracle/datadump .. rw-r--r-- 1 oracle oinstall 90621438 Mar 18 21:33 all-MiniLM-L6-v2.onnx.onnx ..
In der PDB als GPI User anmelden und Modell einlesen.
Anmelden:
sqlplus gpi@//10.10.10.118:1521/freepdb1
Model einlesen:
-- löschen falls schon existiert! BEGIN DBMS_VECTOR.DROP_ONNX_MODEL (model_name => 'ALL_MINILM_L6_V2', force => TRUE); END; / --einlesen BEGIN DBMS_VECTOR.LOAD_ONNX_MODEL( directory => 'DATA_EXCHANGE' ,file_name => 'all-MiniLM-L6-v2.onnx.onnx' ,model_name => 'ALL_MINILM_L6_V2' ,metadata => JSON ('{ "function" : "embedding", "embeddingOutput" : "embedding", "input": { "input": ["DATA"] } }') ); END; / SELECT * FROM user_mining_models; ALL_MINILM_L6_V2 EMBEDDING ONNX NATIVE 18.03.2025 20:42 0 90621438 NO
In der PDB als GPI User anmelden und Vector Index mit dem neuen Model anlegen.
Anmelden:
sqlplus gpi@//10.10.10.118:1521/freepdb1
Nun kann versucht werden einen Hybrid Vektor mit dem zuvor geladenen Model ALL_MINILM_L6_V2 anzulegen:
DROP INDEX IDX_HV_TEXTE; INDEX IDX_HV_TEXTE dropped. CREATE HYBRID VECTOR INDEX IDX_HV_TEXTE ON TEXTE (TEXT) PARAMETERS ('MODEL ALL_MINILM_L6_V2'); Hybrid VECTOR created.
Abfragen:
SELECT DBMS_HYBRID_VECTOR.SEARCH( JSON( '{ "hybrid_index_name" : "IDX_HV_TEXTE" , "search_text" : "Katze" } ' ) ) FROM DUAL; [{"rowid":"AAARdvAAAAAAAMLAAC","score":67.05,"vector_score":73.35,"text_score":4,"vector_rank":1,"text_rank":1,"chunk_text":"Die Katze auf dem Dach","chunk_id":"1"} ,{"rowid":"AAARdvAAAAAAAMLAAB","score":65.25,"vector_score":71.38,"text_score":4,"vector_rank":2,"text_rank":1,"chunk_text":"Die liebsten Haustiere sind Katze und Hund","chunk_id":"1"} ,{"rowid":"AAARdvAAAAAAAMLAAA","score":51.86,"vector_score":57.05,"text_score":0,"vector_rank":3,"text_rank":80,"chunk_text":"Ein Hund steht neben der Hütte","chunk_id":"1"}]
Für einen Datenbank Entwickler wird es nun sehr schwierig die Modelle einzuschätzen.
Beim Vergleich von Sentence Transformer Modellen für Vektor Search gibt es mehrere wichtige Metriken und Methoden, um ihre Qualität zu bewerten, wie nDCG, MRR, Recall@k, Geschwindigkeitstests und manuelle Stichproben um die Modelle zu verglichen und vieles mehr. Und zusätzlich zum ganzen … wie verhält sich am Ende das in einer Oracle Datenbank verhält bzgl. Performance und Speicherplatz etc.
D.h. jetzt wird es kompliziert …..
Zumal auch die Text Sprache (Deutsch / Englisch etc.) eine entscheidende Rolle bzgl. der Qualität der, meist in Englisch, trainierten Modelle spielt.
Mehr Informationen dazu: