2.9에서 도입됨
사용자 정의 모델을 로컬에서 사용하려면 OpenSearch 클러스터에 업로드할 수 있습니다.
OpenSearch 2.6부터 OpenSearch는 로컬 텍스트 임베딩 모델을 지원합니다.
OpenSearch 2.11부터 OpenSearch는 로컬 스파스 인코딩 모델을 지원합니다.
OpenSearch 2.12부터 OpenSearch는 로컬 크로스 인코더 모델을 지원합니다.
OpenSearch 2.13부터 OpenSearch는 로컬 질문 답변 모델을 지원합니다.
CentOS 7 운영 체제에서 로컬 모델 실행은 지원되지 않습니다. 또한 모든 로컬 모델이 모든 하드웨어와 운영 체제에서 실행될 수 있는 것은 아닙니다.
모든 모델에 대해 모델 zip 파일 내에 토크나이저 JSON 파일을 제공해야 합니다.
스파스 인코딩 모델의 경우 ML Commons가 스파스 벡터를 후처리할 수 있도록 출력 형식이 {"output":<sparse_vector>}인지 확인하십시오.
자체 데이터셋에서 스파스 모델을 파인튜닝하는 경우 자체 스파스 토크나이저 모델을 사용할 수도 있습니다. 쿼리에서 토크나이저 모델을 사용할 때 쿼리 성능이 향상되므로 토크나이저 모델 zip 파일에 자체 IDF JSON 파일을 제공하는 것이 좋습니다. 또는 MSMARCO에서 OpenSearch가 제공하는 일반적인 IDF를 사용할 수 있습니다. IDF 파일이 제공되지 않으면 각 토큰의 기본 가중치가 1로 설정되어 스파스 신경 검색 성능에 영향을 줄 수 있습니다.
OpenSearch에서 모델을 사용하려면 모델을 이식 가능한 형식으로 내보내야 합니다. 버전 2.5부터 OpenSearch는 TorchScript 및 ONNX 형식만 지원합니다.
OpenSearch에 업로드하기 전에 모델 파일을 zip으로 저장해야 합니다. ML Commons가 모델을 업로드할 수 있도록 하려면 업로드하기 전에 TorchScript 파일을 압축하십시오. 예제를 보려면 TorchScript 모델 파일을 다운로드하십시오.
또한 모델을 등록할 때 제공해야 하는 모델 zip 파일에 대한 SHA256 체크섬을 계산해야 합니다. 예를 들어 UNIX에서는 다음 명령을 사용하여 체크섬을 얻으십시오:
shasum -a 256 sentence-transformers_paraphrase-mpnet-base-v2-1.0.0-onnx.zip
대부분의 딥러닝 모델은 100MB보다 크므로 단일 문서에 맞추기 어렵습니다. OpenSearch는 모델 파일을 더 작은 청크로 분할하여 모델 인덱스에 저장합니다. OpenSearch 클러스터에 ML 또는 데이터 노드를 할당할 때 ML 추론을 수행할 때 충분한 메모리를 확보할 수 있도록 ML 노드의 크기를 올바르게 지정해야 합니다.
OpenSearch에 사용자 정의 모델을 업로드하려면 OpenSearch 클러스터 외부에서 준비해야 합니다. Hugging Face의 사전 훈련된 모델을 사용하거나 필요에 따라 새 모델을 훈련할 수 있습니다.
이 예제는 전용 ML 노드가 없는 간단한 설정을 사용하며 비ML 노드에서 모델 실행을 허용합니다.
전용 ML 노드가 있는 클러스터에서는 성능 향상을 위해 "only_run_on_ml_node": "true"를 지정하십시오. 자세한 내용은 ML Commons 클러스터 설정을 참조하십시오.
이 기본 로컬 설정이 작동하도록 하려면 다음 클러스터 설정을 지정하십시오:
PUT _cluster/settings
{
"persistent": {
"plugins.ml_commons.allow_registering_model_via_url": "true",
"plugins.ml_commons.only_run_on_ml_node": "false",
"plugins.ml_commons.model_access_control_enabled": "true",
"plugins.ml_commons.native_memory_threshold": "99"
}
}
모델을 등록하려면 다음 옵션이 있습니다:
model_group_id를 사용하여 기존 모델 그룹에 모델 버전을 등록할 수 있습니다.model_group_id를 사용하지 않으면 ML Commons가 새 모델 그룹으로 모델을 생성합니다.모델 그룹을 등록하려면 다음 요청을 보내십시오:
POST /_plugins/_ml/model_groups/_register
{
"name": "local_model_group",
"description": "A model group for local models"
}
응답에는 이 모델 그룹에 모델을 등록하는 데 사용할 모델 그룹 ID가 포함됩니다:
{
"model_group_id": "wlcnb4kBJ1eYAeTMHlV6",
"status": "CREATED"
}
모델 그룹에 대한 자세한 내용은 모델 접근 제어를 참조하십시오.
1단계에서 생성한 모델 그룹에 로컬 모델을 등록하려면 모델 등록 API 요청을 보내십시오. 모델 등록 API 매개변수에 대한 설명은 모델 등록을 참조하십시오.
function_name은 모델 타입에 해당합니다. 텍스트 임베딩 모델의 경우 이 매개변수를 TEXT_EMBEDDING으로 설정하십시오. 스파스 인코딩 모델의 경우 이 매개변수를 SPARSE_ENCODING 또는 SPARSE_TOKENIZE로 설정하십시오. 크로스 인코더 모델의 경우 이 매개변수를 TEXT_SIMILARITY로 설정하십시오. 질문 답변 모델의 경우 이 매개변수를 QUESTION_ANSWERING으로 설정하십시오. 이 예제에서는 텍스트 임베딩 모델을 등록하므로 function_name을 TEXT_EMBEDDING으로 설정합니다.
1단계의 모델 그룹 ID를 제공하고 다음 요청을 보내십시오:
POST /_plugins/_ml/models/_register
{
"name": "huggingface/sentence-transformers/msmarco-distilbert-base-tas-b",
"version": "1.0.1",
"model_group_id": "wlcnb4kBJ1eYAeTMHlV6",
"description": "This is a port of the DistilBert TAS-B Model to sentence-transformers model: It maps sentences & paragraphs to a 768 dimensional dense vector space and is optimized for the task of semantic search.",
"function_name": "TEXT_EMBEDDING",
"model_format": "TORCH_SCRIPT",
"model_content_size_in_bytes": 266352827,
"model_content_hash_value": "acdc81b652b83121f914c5912ae27c0fca8fabf270e6f191ace6979a19830413",
"model_config": {
"model_type": "distilbert",
"embedding_dimension": 768,
"framework_type": "sentence_transformers",
"all_config": "{\"_name_or_path\":\"old_models/msmarco-distilbert-base-tas-b/0_Transformer\",\"activation\":\"gelu\",\"architectures\":[\"DistilBertModel\"],\"attention_dropout\":0.1,\"dim\":768,\"dropout\":0.1,\"hidden_dim\":3072,\"initializer_range\":0.02,\"max_position_embeddings\":512,\"model_type\":\"distilbert\",\"n_heads\":12,\"n_layers\":6,\"pad_token_id\":0,\"qa_dropout\":0.1,\"seq_classif_dropout\":0.2,\"sinusoidal_pos_embds\":false,\"tie_weights_\":true,\"transformers_version\":\"4.7.0\",\"vocab_size\":30522}"
},
"created_time": 1676073973126,
"url": "https://artifacts.opensearch.org/models/ml-models/huggingface/sentence-transformers/msmarco-distilbert-base-tas-b/1.0.1/torch_script/sentence-transformers_msmarco-distilbert-base-tas-b-1.0.1-torch_script.zip"
}
OpenSearch 대시보드에서는 all_config 필드 내용을 삼중 따옴표(""")로 감싸면 필드 내의 따옴표가 자동으로 이스케이프되고 가독성이 향상됩니다:
POST /_plugins/_ml/models/_register
{
"name": "huggingface/sentence-transformers/msmarco-distilbert-base-tas-b",
"version": "1.0.1",
"model_group_id": "wlcnb4kBJ1eYAeTMHlV6",
"description": "This is a port of the DistilBert TAS-B Model to sentence-transformers model: It maps sentences & paragraphs to a 768 dimensional dense vector space and is optimized for the task of semantic search.",
"function_name": "TEXT_EMBEDDING",
"model_format": "TORCH_SCRIPT",
"model_content_size_in_bytes": 266352827,
"model_content_hash_value": "acdc81b652b83121f914c5912ae27c0fca8fabf270e6f191ace6979a19830413",
"model_config": {
"model_type": "distilbert",
"embedding_dimension": 768,
"framework_type": "sentence_transformers",
"all_config": """{"_name_or_path":"old_models/msmarco-distilbert-base-tas-b/0_Transformer","activation":"gelu","architectures":["DistilBertModel"],"attention_dropout":0.1,"dim":768,"dropout":0.1,"hidden_dim":3072,"initializer_range":0.02,"max_position_embeddings":512,"model_type":"distilbert","n_heads":12,"n_layers":6,"pad_token_id":0,"qa_dropout":0.1,"seq_classif_dropout":0.2,"sinusoidal_pos_embds":false,"tie_weights_":true,"transformers_version":"4.7.0","vocab_size":30522}"""
},
"created_time": 1676073973126,
"url": "https://artifacts.opensearch.org/models/ml-models/huggingface/sentence-transformers/msmarco-distilbert-base-tas-b/1.0.1/torch_script/sentence-transformers_msmarco-distilbert-base-tas-b-1.0.1-torch_script.zip"
}
OpenSearch는 등록 작업의 작업 ID를 반환합니다:
{
"task_id": "cVeMb4kBJ1eYAeTMFFgj",
"status": "CREATED"
}
작업 상태를 확인하려면 작업 ID를 작업 가져오기에 제공하십시오:
GET /_plugins/_ml/tasks/cVeMb4kBJ1eYAeTMFFgj
작업이 완료되면 상태가 COMPLETED로 변경됩니다:
{
"model_id": "cleMb4kBJ1eYAeTMFFg4",
"task_type": "REGISTER_MODEL",
"function_name": "TEXT_EMBEDDING",
"state": "COMPLETED",
"worker_node": [
"XPcXLV7RQoi5m8NI_jEOVQ"
],
"create_time": 1689793598499,
"last_update_time": 1689793598530,
"is_async": false
}
모델을 배포하는 데 필요하므로 반환된 model_id를 기록해 두십시오.
배포 작업은 모델 인덱스에서 모델의 청크를 읽은 다음 메모리에 로드할 모델 인스턴스를 생성합니다. 모델이 클수록 모델이 더 많은 청크로 분할되고 모델이 메모리에 로드되는 데 더 오래 걸립니다.
등록된 모델을 배포하려면 다음 요청에서 3단계의 모델 ID를 제공하십시오:
POST /_plugins/_ml/models/cleMb4kBJ1eYAeTMFFg4/_deploy
응답에는 배포 작업의 상태를 확인하는 데 사용할 수 있는 작업 ID가 포함됩니다:
{
"task_id": "vVePb4kBJ1eYAeTM7ljG",
"status": "CREATED"
}
이전 단계와 마찬가지로 작업 API를 호출하여 작업 상태를 확인하십시오:
GET /_plugins/_ml/tasks/vVePb4kBJ1eYAeTM7ljG
작업이 완료되면 상태가 COMPLETED로 변경됩니다:
{
"model_id": "cleMb4kBJ1eYAeTMFFg4",
"task_type": "DEPLOY_MODEL",
"function_name": "TEXT_EMBEDDING",
"state": "COMPLETED",
"worker_node": [
"n-72khvBTBi3bnIIR8FTTw"
],
"create_time": 1689793851077,
"last_update_time": 1689793851101,
"is_async": true
}
클러스터나 노드가 재시작되면 모델을 다시 배포해야 합니다. 자동 재배포 설정 방법을 알아보려면 자동 재배포 활성화를 참조하십시오.
예측 API를 사용하여 모델을 테스트하십시오.
텍스트 임베딩 모델의 경우 다음 요청을 보내십시오:
POST /_plugins/_ml/_predict/text_embedding/cleMb4kBJ1eYAeTMFFg4
{
"text_docs":[ "today is sunny"],
"return_number": true,
"target_response": ["sentence_embedding"]
}
응답에는 제공된 문장에 대한 텍스트 임베딩이 포함됩니다:
{
"inference_results" : [
{
"output" : [
{
"name" : "sentence_embedding",
"data_type" : "FLOAT32",
"shape" : [
768
],
"data" : [
0.25517133,
-0.28009856,
0.48519906,
...
]
}
]
}
]
}
스파스 인코딩 모델의 경우 다음 요청을 보내십시오:
POST /_plugins/_ml/_predict/sparse_encoding/cleMb4kBJ1eYAeTMFFg4
{
"text_docs":[ "today is sunny"]
}
응답에는 토큰과 가중치가 포함됩니다:
{
"inference_results": [
{
"output": [
{
"name": "output",
"dataAsMap": {
"response": [
{
"saturday": 0.48336542,
"week": 0.1034762,
"mood": 0.09698499,
"sunshine": 0.5738209,
"bright": 0.1756877,
...
}
}
}
}
}
벡터 검색에 모델을 사용하는 방법을 알아보려면 AI 검색 방법을 참조하십시오.
질문 답변 모델은 주어진 맥락에서 질문에 대한 답변을 추출합니다. ML Commons는 텍스트 형식의 맥락을 지원합니다.
질문 답변 모델을 등록하려면 다음 형식으로 요청을 보내십시오. function_name을 QUESTION_ANSWERING으로 지정하십시오:
POST /_plugins/_ml/models/_register
{
"name": "question_answering",
"version": "1.0.0",
"function_name": "QUESTION_ANSWERING",
"description": "test model",
"model_format": "TORCH_SCRIPT",
"model_group_id": "lN4AP40BKolAMNtR4KJ5",
"model_content_hash_value": "e837c8fc05fd58a6e2e8383b319257f9c3859dfb3edc89b26badfaf8a4405ff6",
"model_config": {
"model_type": "bert",
"framework_type": "huggingface_transformers"
},
"url": "https://github.com/opensearch-project/ml-commons/blob/main/ml-algorithms/src/test/resources/org/opensearch/ml/engine/algorithms/question_answering/question_answering_pt.zip?raw=true"
}
그런 다음 모델을 배포하는 요청을 보내십시오:
POST _plugins/_ml/models/<model_id>/_deploy
질문 답변 모델을 테스트하려면 다음 요청을 보내십시오. 질문과 답변이 생성될 관련 맥락이 필요합니다:
POST /_plugins/_ml/_predict/question_answering/<model_id>
{
"question": "Where do I live?"
"context": "My name is John. I live in New York"
}
응답은 맥락을 기반으로 한 답변을 제공합니다:
{
"inference_results": [
{
"output": [
{
"result": "New York"
}
}
}