GPU를 사용한 색인
이 가이드에서는 처리량이 많고 호출 횟수가 많은 시나리오에서 검색 성능을 크게 향상시킬 수 있는 Milvus에서 GPU를 지원하는 인덱스를 구축하는 단계를 간략하게 설명합니다. Milvus에서 지원하는 GPU 인덱스 유형에 대한 자세한 내용은 GPU 인덱스를 참조하세요.
GPU 메모리 제어를 위한 Milvus 설정 구성하기
Milvus는 글로벌 그래픽 메모리 풀을 사용하여 GPU 메모리를 할당합니다.
Milvus 설정 파일에서 initMemSize
및 maxMemSize
두 개의 파라미터를 지원합니다. 풀 크기는 처음에 initMemSize
로 설정되며, 이 한도를 초과하면 maxMemSize
으로 자동 확장됩니다.
기본값 initMemSize
은 Milvus 시작 시 사용 가능한 GPU 메모리의 1/2이며, 기본값 maxMemSize
은 사용 가능한 모든 GPU 메모리와 동일합니다.
Milvus 2.4.1(2.4.1 버전 포함)까지 Milvus는 통합 GPU 메모리 풀을 사용했습니다. 2.4.1(버전 2.4.1 포함) 이전 버전에서는 두 값을 모두 0으로 설정하는 것이 권장되었습니다.
gpu:
initMemSize: 0 #set the initial memory pool size.
maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
Milvus 2.4.1 이후부터는 검색 중 임시 GPU 데이터에만 GPU 메모리 풀이 사용됩니다. 따라서 2048과 4096으로 설정하는 것이 좋습니다.
gpu:
initMemSize: 2048 #set the initial memory pool size.
maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
인덱스 구축
다음 예제는 다양한 유형의 GPU 인덱스를 구축하는 방법을 보여줍니다.
인덱스 매개변수 준비하기
GPU 인덱스 파라미터를 설정할 때 index_type, metric_type, params를 정의합니다:
index_type(문자열): 벡터 검색을 가속화하는 데 사용되는 인덱스 유형입니다. 유효한 옵션으로는 GPU_CAGRA, GPU_IVF_FLAT, GPU_IVF_PQ, GPU_BRUTE_FORCE가 있습니다.
metric_type(문자열): 벡터의 유사성을 측정하는 데 사용되는 메트릭 유형입니다. 유효한 옵션은 IP와 L2입니다.
params(딕셔너리): 인덱스별 빌딩 매개변수입니다. 이 매개변수에 유효한 옵션은 인덱스 유형에 따라 다릅니다.
다음은 다양한 인덱스 유형에 대한 구성 예시입니다:
GPU_CAGRA 인덱스
index_params = { "metric_type": "L2", "index_type": "GPU_CAGRA", "params": { 'intermediate_graph_degree': 64, 'graph_degree': 32 } }
가능한 매개변수 옵션은 다음과 같습니다:
intermediate_graph_degree(int): 가지치기 전 그래프의 정도를 결정하여 리콜 및 빌드 시간에 영향을 줍니다. 권장 값은 32 또는 64입니다.
graph_degree(int): 가지치기 후 그래프의 정도를 설정하여 검색 성능과 리콜에 영향을 줍니다. 일반적으로 intermediate_graph_degree의 절반입니다. 이 두 도의 차이가 클수록 빌드 시간이 길어집니다. 이 값은 intermediate_graph_degree의 값보다 작아야 합니다.
build_algo(문자열): 가지치기 전 그래프 생성 알고리즘을 선택합니다. 가능한 옵션은 다음과 같습니다:
IVF_PQ: 더 높은 품질을 제공하지만 빌드 시간이 느립니다.
NN_DESCENT: 더 빠른 빌드를 제공하지만 잠재적으로 더 낮은 리콜을 제공합니다.
캐시_데이터셋_온_장치(문자열, "true" | "false"): 원본 데이터셋을 GPU 메모리에 캐시할지 여부를 결정합니다. 이 값을 "true" 로 설정하면 검색 결과를 세분화하여 리콜을 향상시키고, "false" 로 설정하면 GPU 메모리를 절약합니다.
GPU_IVF_FLAT 또는 GPU_IVF_PQ 인덱스
index_params = { "metric_type": "L2", "index_type": "GPU_IVF_FLAT", # Or GPU_IVF_PQ "params": { "nlist": 1024 } }
GPU_BRUTE_FORCE 인덱스
index_params = { 'index_type': 'GPU_BRUTE_FORCE', 'metric_type': 'L2', 'params': {} }
추가 파라미터 구성이 필요하지 않습니다.
인덱스 빌드
index_params에서 인덱스 파라미터를 구성한 후, 인덱스를 빌드하기 위해 create_index()
메서드를 호출하여 인덱스를 빌드합니다.
# Get an existing collection
collection = Collection("YOUR_COLLECTION_NAME")
collection.create_index(
field_name="vector", # Name of the vector field on which an index is built
index_params=index_params
)
검색
GPU 인덱스를 구축했으면 다음 단계는 검색을 수행하기 전에 검색 매개변수를 준비하는 것입니다.
검색 매개변수 준비하기
다음은 다양한 인덱스 유형에 대한 구성 예시입니다:
GPU_BRUTE_FORCE 인덱스
search_params = { "metric_type": "L2", "params": {} }
추가 파라미터 구성은 필요하지 않습니다.
GPU_CAGRA 인덱스
search_params = { "metric_type": "L2", "params": { "itopk_size": 128, "search_width": 4, "min_iterations": 0, "max_iterations": 0, "team_size": 0 } }
주요 검색 매개변수는 다음과 같습니다:
itopk_size: 검색 중에 보관되는 중간 결과의 크기를 결정합니다. 값이 클수록 검색 성능이 저하되는 대신 회상률이 향상될 수 있습니다. 이 값은 최소한 최종 상위 k(한계) 값과 같아야 하며 일반적으로 2의 거듭제곱입니다(예: 16, 32, 64, 128).
search_width: 검색 중 CAGRA 그래프에 들어가는 진입점 수를 지정합니다. 이 값을 높이면 검색 회수율은 향상될 수 있지만 검색 성능에 영향을 줄 수 있습니다.
MIN_ITERATIONS / MAX_ITERATIONS: 이 매개변수는 검색 반복 프로세스를 제어합니다. 기본적으로 이 값은 0으로 설정되어 있으며, CAGRA는 itopk_size 및 search_width에 따라 반복 횟수를 자동으로 결정합니다. 이 값을 수동으로 조정하면 성능과 정확도의 균형을 맞추는 데 도움이 될 수 있습니다.
team_size: GPU에서 메트릭 거리를 계산하는 데 사용되는 CUDA 스레드 수를 지정합니다. 일반적인 값은 2의 거듭제곱에서 최대 32입니다(예: 2, 4, 8, 16, 32). 검색 성능에 약간의 영향을 미칩니다. 기본값은 0이며, Milvus는 벡터 차원에 따라 자동으로 team_size를 선택합니다.
GPU_IVF_FLAT 또는 GPU_IVF_PQ 인덱스
search_params = { "metric_type": "L2", "params": {"nprobe": 10} }
이 두 인덱스 유형에 대한 검색 매개변수는 IVF_FLAT 및 IVF_PQ에서 사용되는 것과 유사합니다. 자세한 내용은 벡터 유사도 검색 수행을 참조하세요.
검색 수행
벡터 유사도 검색을 수행하려면 search()
메서드를 사용하여 GPU 인덱스에서 벡터 유사도 검색을 수행합니다.
# Load data into memory
collection.load()
collection.search(
data=[[query_vector]], # Your query vector
anns_field="vector", # Name of the vector field
param=search_params,
limit=100 # Number of the results to return
)
제한 사항
GPU 인덱스를 사용할 때는 특정 제약 조건에 유의해야 합니다:
GPU_IVF_FLAT의 경우, 제한의 최대값은 1024입니다.
GPU_IVF_PQ 및 GPU_CAGRA의 경우, 제한의 최대값은 1024입니다.
GPU_BRUTE_FORCE에 대한 제한은 설정되어 있지 않지만 잠재적인 성능 문제를 피하기 위해 4096을 초과하지 않는 것이 좋습니다.
현재 GPU 인덱스는 COSINE 거리를 지원하지 않습니다. COSINE 거리가 필요한 경우 먼저 데이터를 정규화한 다음 내부 곱(IP) 거리를 대체로 사용할 수 있습니다.
GPU 인덱스에 대한 로드 OOM 보호는 완전히 지원되지 않으며, 너무 많은 데이터는 QueryNode 충돌을 일으킬 수 있습니다.
FAQ
GPU 인덱스는 언제 사용하는 것이 적절하나요?
GPU 인덱스는 특히 높은 처리량이나 높은 리콜이 필요한 상황에서 유용합니다. 예를 들어, 대규모 배치를 처리할 때 GPU 인덱싱의 처리량은 CPU 인덱싱의 처리량을 100배까지 능가할 수 있습니다. 배치 규모가 작은 시나리오에서는 여전히 성능 면에서 GPU 인덱싱이 CPU 인덱싱을 크게 앞섭니다. 또한, 빠른 데이터 삽입이 요구되는 경우, GPU를 통합하면 인덱스 구축 프로세스의 속도를 크게 높일 수 있습니다.
CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT, GPU_BRUTE_FORCE와 같은 GPU 인덱스는 어떤 시나리오에 가장 적합할까요?
CAGRA 인덱스는 더 많은 메모리를 사용하지만 향상된 성능을 요구하는 시나리오에 이상적입니다. 메모리 보존이 우선시되는 환경에서는 GPU_IVF_PQ 인덱스가 스토리지 요구 사항을 최소화하는 데 도움이 될 수 있지만, 정밀도 손실이 더 높습니다. GPU_IVF_FLAT 인덱스는 성능과 메모리 사용량 사이의 절충점을 제공하는 균형 잡힌 옵션으로 사용됩니다. 마지막으로 GPU_BRUTE_FORCE 인덱스는 철저한 검색 작업을 위해 설계되었으며, 순회 검색을 수행하여 1의 리콜률을 보장합니다.