GPU 인덱스
Milvus는 특히 처리량이 많고 호출 횟수가 많은 시나리오에서 검색 성능과 효율성을 가속화하기 위해 다양한 GPU 인덱스 유형을 지원합니다. 이 항목에서는 Milvus에서 지원하는 GPU 인덱스 유형, 적합한 사용 사례 및 성능 특성에 대한 개요를 제공합니다. GPU를 사용한 인덱스 구축에 대한 자세한 내용은 GPU를 사용한 인덱스를 참조하세요.
GPU 인덱스를 사용한다고 해서 CPU 인덱스를 사용하는 것보다 지연 시간이 반드시 단축되는 것은 아니라는 점에 유의하세요. 처리량을 완전히 최대화하려면 요청 압력이 매우 높거나 쿼리 벡터의 수가 많아야 합니다.
성능
Milvus의 GPU 지원은 Nvidia RAPIDS 팀에 의해 제공되고 있습니다. 현재 Milvus에서 지원하는 GPU 인덱스 유형은 다음과 같습니다.
GPU_CAGRA
GPU_CAGRA는 GPU에 최적화된 그래프 기반 인덱스로, 추론용 GPU를 사용하여 Milvus GPU 버전을 실행하면 고가의 훈련용 GPU를 사용하는 것보다 비용 효율이 높을 수 있습니다.
인덱스 구축 매개변수
파라미터 설명 기본값 intermediate_graph_degree
가지치기 전 그래프의 정도를 결정하여 리콜 및 구축 시간에 영향을 줍니다. 권장 값은 32
또는64
입니다.128
graph_degree
가지치기 후 그래프의 차수를 설정하여 검색 성능과 리콜에 영향을 줍니다. 이 두 도의 차이가 클수록 빌드 시간이 길어집니다. 이 값은 intermediate_graph_degree의 값보다 작아야 합니다. 64
build_algo
가지치기 전 그래프 생성 알고리즘을 선택합니다. 가능한 값 IVF_PQ
: 더 높은 품질을 제공하지만 빌드 시간이 느립니다.NN_DESCENT
더 빠른 빌드를 제공하지만 잠재적으로 더 낮은 리콜을 제공합니다.IVF_PQ
cache_dataset_on_device
원본 데이터 세트를 GPU 메모리에 캐시할지 여부를 결정합니다. 가능한 값 “true”
: 원본 데이터 세트를 캐시하여 검색 결과를 구체화하여 리콜을 향상시킵니다.“false”
GPU 메모리를 절약하기 위해 원본 데이터셋을 캐시하지 않습니다.“false”
adapt_for_cpu
인덱스 구축에 GPU를 사용할지, 검색에 CPU를 사용할지 결정합니다.
이 파라미터를true
로 설정하려면 검색 요청에ef
파라미터가 있어야 합니다.“false”
검색 매개변수
파라미터 설명 기본값 itopk_size
검색 중에 보관되는 중간 결과의 크기를 결정합니다. 값이 클수록 검색 성능이 저하되는 대신 검색 회수율이 향상될 수 있습니다. 이 값은 최소한 최종 상위 k(한계) 값과 같아야 하며 일반적으로 2의 거듭제곱(예: 16, 32, 64, 128)입니다. Empty search_width
검색 중에 CAGRA 그래프에 포함할 진입점 수를 지정합니다. 이 값을 늘리면 기억력이 향상될 수 있지만 검색 성능에 영향을 줄 수 있습니다(예: 1, 2, 4, 8, 16, 32). Empty min_iterations
/max_iterations
검색 반복 프로세스를 제어합니다. 기본적으로 0
로 설정되어 있으며, CAGRA는itopk_size
및search_width
에 따라 반복 횟수를 자동으로 결정합니다. 이 값을 수동으로 조정하면 성능과 정확도의 균형을 맞추는 데 도움이 될 수 있습니다.0
team_size
GPU에서 메트릭 거리를 계산하는 데 사용되는 CUDA 스레드 수를 지정합니다. 일반적인 값은 2의 거듭제곱에서 최대 32입니다(예: 2, 4, 8, 16, 32). 검색 성능에 약간의 영향을 미칩니다. 기본값은 0
이며, Milvus는 벡터 차원에 따라team_size
을 자동으로 선택합니다.0
ef
쿼리 시간/정확도 절충을 지정합니다. ef
값이 클수록 검색 정확도는 높아지지만 검색 속도는 느려집니다.
인덱스 구축 시adapt_for_cpu
을true
으로 설정한 경우 이 파라미터는 필수입니다.[top_k, int_max]
검색 제한
파라미터 범위 limit
(상위-K)<= 1024 limit
(top-K)<=max(( itopk_size
+ 31)// 32,search_width
) * 32
GPU_IVF_FLAT
IVF_FLAT과 마찬가지로 GPU_IVF_FLAT도 벡터 데이터를 nlist
클러스터 단위로 나눈 다음 대상 입력 벡터와 각 클러스터의 중심 사이의 거리를 비교합니다. 시스템이 쿼리하도록 설정된 클러스터 수에 따라(nprobe
), 목표 입력과 가장 유사한 클러스터에 있는 벡터 간의 비교를 기반으로 유사도 검색 결과가 반환되므로 쿼리 시간이 크게 단축됩니다.
nprobe
을 조정하면 주어진 시나리오에서 정확도와 속도 사이의 이상적인 균형을 찾을 수 있습니다. IVF_FLAT 성능 테스트의 결과는 대상 입력 벡터의 수(nq
)와 검색할 클러스터의 수(nprobe
)가 모두 증가함에 따라 쿼리 시간이 급격히 증가한다는 것을 보여줍니다.
GPU_IVF_FLAT은 가장 기본적인 IVF 인덱스이며, 각 유닛에 저장된 인코딩된 데이터는 원본 데이터와 일치합니다.
검색을 수행할 때, GPU_IVF_FLAT 인덱싱된 컬렉션에 대한 모든 검색에 대해 최대 256까지 top-K를 설정할 수 있다는 점에 유의하세요.
인덱스 구축 매개변수
파라미터 설명 범위 기본값 nlist
클러스터 단위 수 [1, 65536] 128
cache_dataset_on_device
원본 데이터 세트를 GPU 메모리에 캐시할지 여부를 결정합니다. 가능한 값은 다음과 같습니다: “true”
: 원본 데이터 세트를 캐시하여 검색 결과를 세분화하여 리콜을 향상시킵니다.“false”
GPU 메모리를 절약하기 위해 원본 데이터 세트를 캐시하지 않습니다."true"
"flase"
"false"
검색 매개변수
일반 검색
파라미터 설명 범위 기본값 nprobe
쿼리할 단위 수 [1, nlist] 8
검색 제한
파라미터 범위 limit
(상위-K)<= 2048
GPU_IVF_PQ
PQ
(곱 양자화)는 원래의 고차원 벡터 공간을 m
저차원 벡터 공간의 데카르트 곱으로 균일하게 분해한 다음 분해된 저차원 벡터 공간을 정량화합니다. 곱 양자화는 목표 벡터와 모든 단위의 중심 사이의 거리를 계산하는 대신 목표 벡터와 각 저차원 공간의 클러스터링 중심 사이의 거리를 계산할 수 있어 알고리즘의 시간 복잡도와 공간 복잡도를 크게 줄여줍니다.
IVF_PQ는 벡터의 곱을 정량화하기 전에 IVF 인덱스 클러스터링을 수행합니다. 이 인덱스 파일은 IVF_SQ8보다 훨씬 작지만 벡터를 검색하는 동안 정확도가 떨어집니다.
인덱스 구축 파라미터와 검색 파라미터는 Milvus 분포에 따라 다릅니다. 먼저 Milvus 배포를 선택하세요.
검색을 수행할 때, GPU_IVF_FLAT 인덱싱된 컬렉션에 대한 모든 검색에 대해 상위-K를 최대 8192까지 설정할 수 있다는 점에 유의하세요.
인덱스 구축 매개변수
파라미터 설명 범위 기본값 nlist
클러스터 단위 수 [1, 65536] 128
m
제품 양자화 요소의 수입니다, dim mod m or = 0
0
nbits
[선택 사항] 각 저차원 벡터가 저장되는 비트 수입니다. [1, 16] 8
cache_dataset_on_device
원본 데이터 세트를 GPU 메모리에 캐시할지 여부를 결정합니다. 가능한 값 “true”
: 원본 데이터 세트를 캐시하여 검색 결과를 세분화하여 리콜을 향상시킵니다.“false”
GPU 메모리를 절약하기 위해 원본 데이터 세트를 캐시하지 않습니다."true"
"false"
"false"
검색 매개변수
일반 검색
파라미터 설명 범위 기본값 nprobe
쿼리할 단위 수 [1, nlist] 8
검색 제한
파라미터 범위 limit
(상위-K)<= 1024
GPU_BRUTE_FORCE
GPU_BRUTE_FORCE는 각 쿼리를 데이터 세트의 모든 벡터와 비교하여 1의 재현율을 보장함으로써 매우 높은 재현율이 중요한 경우에 맞게 조정됩니다. 인덱스 구축 및 검색 파라미터로 메트릭 유형(metric_type
)과 top-k(limit
)만 필요합니다.
GPU_BRUTE_FORCE의 경우, 추가 인덱스 구축 파라미터나 검색 파라미터가 필요하지 않습니다.
결론
현재 Milvus는 효율적인 검색 작업을 위해 모든 인덱스를 GPU 메모리에 로드합니다. 로드할 수 있는 데이터의 양은 GPU 메모리의 크기에 따라 달라집니다:
- GPU_CAGRA: 메모리 사용량은 원본 벡터 데이터의 약 1.8배입니다.
- GPU_IVF_FLAT 및 GPU_BRUTE_FORCE: 원본 데이터 크기와 동일한 메모리가 필요합니다.
- GPU_IVF_PQ: 압축 파라미터 설정에 따라 더 작은 메모리 공간을 사용합니다.