추가 최적화 및 기능 확장

최적화의 필요성

Milvus 를 효율적으로 사용하는 경우에도 대규모 데이터셋이나 복잡한 검색 요구사항이 있으면 성능 문제가 발생할 수 있음. 추가 최적화와 기능 확장을 통해 검색 속도와 정확성을 더욱 높이고, 다양한 활용 사례에 맞게 기능을 확장할 수 있음.


추가 최적화

1. 인덱스의 최적화

Milvus 의 인덱스는 검색 속도와 정확성에 직접적인 영향을 미침. 데이터 특성에 따라 적합한 인덱스를 선택하고 매개변수를 조정해야함.

주요 인덱스 유형 :

  1. IVF_FLAT:

    1. 대규모 데이터셋에서 근사 검색을 위해 클러스터링 기반.

    2. nlist 값이 클 수록 정확도가 높아지지만 메모리와 계산량이 증가

index_params = {"index_type": "IVF_FLAT", "metric_type": "COSINE", "params": {"nlist": 128}}
collection.create_index(field_name="embedding", index_params=index_params)
  1. HNSW :

    1. 그래프 기반 인덱스로 고성능 검색 제공

    2. 설정 매개변수:

      1. M : 각 노드의 연결성(값이 클수록 정확도 증가)

      2. efConstruction: 인덱스 생성 시 탐색 깊이

index_params = {"index_type": "HNSW", "metric_type": "COSINE", "params": {"M": 16, "efConstruction": 200}}
collection.create_index(field_name="embedding", index_params=index_params)
  1. IVF_PQ:

    1. IVF_FLAT 보다 더 낮은 메모리를 사용하며, 적정 속도와 정확도를 제공

2. 검색 매개변수 튜닝

검색 시 사용되는 매개변수 nprobe 는 검색 정확도와 속도에 영향을 미침.

  • nprobe"

    • 검색할 클러스터의 개수

    • 값이 클 수록 정확도가 증가하지만, 검색 속도가 느려짐.

    • 예:

search_params = {"metric_type": "COSINE", "params": {"nprobe": 10}}
  • HNSW-sepcific:

    • ef 값으로 검색 깊이를 조정(값이 클 수록 정확도 증가):

search_params = {"metric_type": "COSINE", "params": {"ef": 64}}

3. 하드웨어 최적화

1. 메모리 관리

  • Milvus 는 검색 속도를 위해 메모리를 적극적으로 사용하므로 적절한 메모리 크기를 확보.

  • 사용 가능한 메모리 이상으로 데이터가 클 경우 디스크 기반 검색(SQ8 인덱스)을 고려

2. 멀티 스레드 및 병렬 처리

  • Milvus 는 멀티 스레드를 사용하므로 CPU 와 I/O 리소스를 최대한 활용

3. 분산 설정

  • 클러스터 모드로 Milvus 를 실행하여 성능확장:

    • DataNode 와 QueryNode 를 분리


기능 확장

1. 태그 기반 검색 범위 제한

검색 대상을 특정 태그로 제한하여 성능과 정확도를 향상할 수 있음.

# 태그 기반 필터링
results = collection.search(
    data=[query_vector],
    anns_field="embedding",
    param={"metric_type": "COSINE", "params": {"nprobe": 10}},
    limit=10,
    expr="metadata == 'category-A'"
)

2. 텍스트 기반 검색

Milvus 는 벡터 검색 중심이지만, 텍스트 기반 검색을 위해 ElasticSearch와 결합할 수 있음.

ElasticSearch 와 통합

  1. 텍스트 데이터는 ElasticSearch 에서 인덱싱

  2. Milvus 에서 벡터 검색

  3. 두 결과를 조합하여 최적의 결과 반환.

외부 툴과의 통합

  1. Hugging Face 모델 활용

    1. Tulu3 와 같은 모델을 사용해 입력 텍스트를 벡터로 변환.

from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
model = AutoModel.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")

def get_embedding(text):
    tokens = tokenizer(text, return_tensors="pt")
    outputs = model(**tokens)
    return outputs.last_hidden_state.mean(dim=1).detach().numpy()
  1. API 서비스로 확장

    1. FastAPI 와 Milvus 를 결합하여 검색 API 를 구축

from fastapi import FastAPI
import pymilvus

app = FastAPI()

@app.post("/search")
def search(query: str):
    # 벡터화 및 검색 코드
    pass

평가 및 모니터링

Milvus 의 검색 성능을 주기적으로 평가하고, 문제가 발생한 경우 조정함.

성능 평가

  1. Precision. Recall : 검색 결과의 정확도를 측정

  2. Latency : 검색 속도 측정

모니터링 도구

  • Prometheus 와 Grafana 를 사용하여 Milvus 의 성능 모니터링

Last updated

Was this helpful?