들어가며
앞에 글들을 따라 오셨다면 ORACLE23 ai설치와 OML4Py 설치를 끝내셨을겁니다.
사전 학습된 오픈 소스 임베딩 모델이나 자체 임베딩 모델을 사용하여 Oracle Database 외부에서 벡터 임베딩을 생성할 수 있지만, Open Neural Network Exchange(ONNX) 표준과 호환되는 경우 해당 모델을 Oracle Database로 직접 가져올 수도 있습니다.
오라클에서 제공하는 머신러닝용 패키지인 OML4Py를 사용하여 ONNX 형식에 Embedding Model을 ORACLE DB에 로딩하는 방법을 알아보겠습니다.
Model Load
1. 모델을 관리할 스키마 생성
필요에 따라 모델을 관리할 스키마를 생성합니다. 저는 데이터 영역과 모델영역에 서비스 구분을 위해 ONN이라는 스키마를 생성하여 진행하겠습니다.
cd $ORACLE_HOME/oml4py/server
sqlplus / as sysdba
alter session set container=freepdb1;
CREATE TABLESPACE TS_ONN DATAFILE '/u01/oracle/FREE/FREEPDB1/ts_onn_1.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE 30G EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
@pyquser.sql ONN TS_ONN TEMP unlimited pyqadmin
참고: 23ai부터 create tablespace 시 bigfile이 default값입니다.
Starting with Oracle Database 23ai, BIGFILE functionality is the default for SYSAUX, SYSTEM, and USER tablespaces.
2. DB에 Directory object 생성
OS에 있는 Model을 DB안으로 가져오기 위해 Directory Object를 생성합니다.
sqlplus / as sysdba
alter session set container=freepdb1;
SQL> alter session set container=freepdb1;
grant read,write on directory MODEL_DIR to ONN;
3. 사전구성된 Model 확인
오라클에서 테스트한 모델을 확인 할 수 있습니다. Free버전이므로 아래에 모델 중 한국어 지원이 되는 'sentence-transformers/distiluse-base-multilingual-cased-v2' 모델을 사용하였습니다.
#명령어
python3
>>> from oml.utils import EmbeddingModel
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'
4. ONNX형식 Embedding Model 다운로드
폐쇄망의 경우 파일을 직접 받아서 서버에 업로드 해야합니다. 업로드 위치는 생성한 디렉토리로 해주세요.
#명령어
python3
>>> from oml.utils import EmbeddingModel
>>> em = EmbeddingModel(model_name="sentence-transformers/distiluse-base-multilingual-cased-v2")
>>> em.export2file("distiluse-base-multilingual-cased-v2",output_dir="./")
/opt/oracle/product/23ai/dbhomeFree/python/lib/python3.12/site-packages/transformers/models/distilbert/modeling_distilbert.py:215: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect.
mask, torch.tensor(torch.finfo(scores.dtype).min)
5. Embedding Model Load
임베딩 모델을 DB에 로드 합니다.
#명령어
sqlplus / as sysdba
alter session set container=freepdb1;
#모델디렉토리:MODEL_DIR
#모델파일:distiluse-base-multilingual-cased-v2.onnx
#스키마.모델명(원하는대로 입력가능):ONN.distiluse_base_multilingual_cased_v2
begin
DBMS_VECTOR.LOAD_ONNX_MODEL('MODEL_DIR','distiluse-base-multilingual-cased-v2.onnx','ONN.distiluse_base_multilingual_cased_v2',
JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input":{"input": ["DATA"]}}'));
end;
6. Model Load 확인
select * from DBA_MINING_MODELS;
OWNER MODEL_NAME MINING_FUNCTION ALGORITHM ALGORITHM_TYPE CREATION_DATE BUILD_DURATION MODEL_SIZE PARTITIONED
----- ------------------------------------ --------------- --------- -------------- ------------------- --------------- ------------ -----------
ONN DISTILUSE_BASE_MULTILINGUAL_CASED_V2 EMBEDDING ONNX NATIVE 2024/08/09 17:17:47 0 540045499 NO
'ORACLE 23ai' 카테고리의 다른 글
Oracle Vector Index1-HNSW (2) | 2024.09.19 |
---|---|
ORACLE 23ai RAG(증강검색) 실습 (4) | 2024.09.19 |
Embedding (1) | 2024.08.28 |
RAG(검색 증강 생성)이란 (0) | 2024.08.26 |