제품 FAQ
Milvus의 가격은 얼마인가요?
Milvus는 100% 무료 오픈소스 프로젝트입니다.
제작 또는 배포 목적으로 Milvus를 사용할 때는 Apache 라이선스 2.0을 준수하시기 바랍니다.
Milvus의 개발사인 Zilliz는 자체 분산 인스턴스를 구축 및 유지 관리하고 싶지 않은 사용자를 위해 완전 관리형 클라우드 버전의 플랫폼도 제공합니다. Zilliz Cloud는 자동으로 데이터 안정성을 유지하며 사용자가 사용한 만큼만 비용을 지불할 수 있습니다.
Milvus는 비 x86 아키텍처를 지원하나요?
Milvus는 x86이 아닌 플랫폼에서는 설치하거나 실행할 수 없습니다.
Milvus를 실행하려면 CPU가 다음 명령어 세트 중 하나를 지원해야 합니다: SSE4.2, AVX, AVX2, AVX512. 이들은 모두 x86 전용 SIMD 명령어 세트입니다.
Milvus는 데이터를 어디에 저장하나요?
Milvus는 삽입된 데이터와 메타데이터라는 두 가지 유형의 데이터를 처리합니다.
벡터 데이터, 스칼라 데이터, 컬렉션별 스키마 등 삽입된 데이터는 증분 로그 형태로 영구 저장소에 저장됩니다. Milvus는 MinIO, AWS S3, 구글 클라우드 스토리지 (GCS), 애저 블롭 스토리지, 알리바바 클라우드 OSS, 텐센트 클라우드 오브젝트 스토리지 (COS) 등 여러 오브젝트 스토리지 백엔드를 지원합니다.
메타데이터는 Milvus 내에서 생성됩니다. 각 Milvus 모듈에는 etcd에 저장되는 자체 메타데이터가 있습니다.
etcd에 벡터 데이터가 없는 이유는 무엇인가요?
etcd는 Milvus 모듈 메타데이터를 저장하고, MinIO는 엔티티를 저장합니다.
Milvus는 데이터 삽입과 검색을 동시에 지원하나요?
예. 삽입 작업과 쿼리 작업은 상호 독립적인 두 개의 개별 모듈에서 처리됩니다. 클라이언트 관점에서 삽입 작업은 삽입된 데이터가 메시지 큐에 들어가면 완료됩니다. 그러나 삽입된 데이터는 쿼리 노드에 로드될 때까지 검색할 수 없습니다. 세그먼트 크기가 인덱스 구축 임계값(기본값 512MB)에 도달하지 않으면 Milvus는 무차별 대입 검색을 사용하며 쿼리 성능이 저하될 수 있습니다.
기본 키가 중복된 벡터를 Milvus에 삽입할 수 있나요?
예. Milvus는 벡터 기본 키가 중복되는지 여부를 확인하지 않습니다.
기본 키가 중복된 벡터가 삽입되면 Milvus는 이를 업데이트 작업으로 처리하나요?
아니요. Milvus는 현재 업데이트 작업을 지원하지 않으며 엔티티 기본 키가 중복되는지 확인하지 않습니다. 엔티티 기본 키가 고유한지 확인할 책임은 사용자에게 있으며, 그렇지 않은 경우 Milvus에 기본 키가 중복된 엔티티가 여러 개 포함될 수 있습니다.
이 경우 쿼리 시 어떤 데이터 사본이 반환될지는 알 수 없습니다. 이 제한은 향후 릴리스에서 수정될 예정입니다.
자체 정의된 엔티티 기본 키의 최대 길이는 어떻게 되나요?
엔티티 기본 키는 음수가 아닌 64비트 정수여야 합니다.
삽입 작업당 추가할 수 있는 최대 데이터 양은 얼마입니까?
삽입 작업의 크기는 1,024MB를 초과하지 않아야 합니다. 이것은 gRPC에 의해 부과된 제한입니다.
특정 파티션에서 검색할 때 수집 크기가 쿼리 성능에 영향을 주나요?
아니요. 검색할 파티션을 지정하면 Milvus는 지정된 파티션만 검색합니다.
검색을 위해 파티션을 지정할 때 Milvus는 전체 컬렉션을 로드해야 하나요?
검색에 필요한 데이터에 따라 다릅니다. 검색 결과에 표시될 가능성이 있는 모든 파티션은 검색 전에 로드해야 합니다.
- 예를 들어 특정 파티션만 검색하려는 경우 모든 파티션을 로드할 필요는 없습니다.
load_partition()
을 호출하여 원하는 파티션을 로드한 다음search()
메서드 호출에서 파티션을 지정합니다. - 모든 파티션을 검색하려면
load_collection()
을 호출하여 모든 파티션을 포함한 전체 컬렉션을 로드합니다. - 검색 전에 컬렉션 또는 특정 파티션을 로드하지 못하면 Milvus는 오류를 반환합니다.
벡터를 삽입한 후 인덱스를 생성할 수 있나요?
예. 이전에 create_index()
에 의해 컬렉션에 대한 인덱스가 생성된 경우, Milvus는 이후에 삽입된 벡터에 대한 인덱스를 자동으로 생성합니다. 그러나 새로 삽입된 벡터가 전체 세그먼트를 채우고 새로 생성된 인덱스 파일이 이전 인덱스 파일과 분리될 때까지 Milvus는 인덱스를 생성하지 않습니다.
FLAT 인덱스와 IVF_FLAT 인덱스는 어떻게 다른가요?
IVF_FLAT 인덱스는 벡터 공간을 목록 클러스터로 나눕니다. 기본 목록 값인 16,384에서 Milvus는 대상 벡터와 모든 16,384개 클러스터의 중심점 사이의 거리를 비교하여 가장 가까운 프로브 클러스터를 반환합니다. 그런 다음 Milvus는 대상 벡터와 선택한 클러스터의 벡터 사이의 거리를 비교하여 가장 가까운 벡터를 얻습니다. IVF_FLAT과 달리 FLAT은 대상 벡터와 다른 모든 벡터 사이의 거리를 직접 비교합니다.
벡터의 총 수가 대략 nlist와 같을 때 계산 요구 사항과 검색 성능 측면에서 IVF_FLAT과 FLAT 사이에는 거의 차이가 없습니다. 그러나 벡터의 수가 nlist를 두 배 이상 초과하면 IVF_FLAT이 성능 우위를 보이기 시작합니다.
자세한 내용은 벡터 인덱스를 참조하세요.
Milvus는 데이터를 어떻게 플러시하나요?
Milvus는 삽입된 데이터가 메시지 큐에 수집되면 성공을 반환합니다. 그러나 데이터는 아직 디스크에 플러시되지 않습니다. 그러면 Milvus의 데이터 노드는 메시지 큐에 있는 데이터를 증분 로그로서 영구 저장소에 기록합니다. flush()
이 호출되면 데이터 노드는 메시지 큐의 모든 데이터를 즉시 영구 저장소에 강제로 씁니다.
정규화란 무엇인가요? 정규화가 필요한 이유는 무엇인가요?
정규화는 벡터의 규범이 1이 되도록 벡터를 변환하는 과정을 말합니다. 벡터 유사성을 계산하기 위해 내적 곱을 사용하는 경우 벡터를 정규화해야 합니다. 정규화 후 내적 곱은 코사인 유사도와 같습니다.
자세한 내용은 위키백과를 참조하세요.
유클리드 거리(L2)와 내적 곱(IP)이 서로 다른 결과를 반환하는 이유는 무엇인가요?
정규화된 벡터의 경우, 유클리드 거리(L2)는 수학적으로 내적 곱(IP)과 동일합니다. 이러한 유사성 메트릭이 서로 다른 결과를 반환하는 경우 벡터가 정규화되었는지 확인하세요.
Milvus에서 컬렉션과 파티션의 총 개수에 제한이 있나요?
예. Milvus 인스턴스에서 최대 65,535개의 컬렉션을 생성할 수 있습니다. 기존 컬렉션의 수를 계산할 때 Milvus는 샤드 및 파티션이 포함된 모든 컬렉션을 계산합니다.
예를 들어, 이미 100개의 컬렉션을 만들었고 그 중 60개 컬렉션에 2개의 샤드와 4개의 파티션이 있고 나머지 40개 컬렉션에 1개의 샤드와 12개의 파티션이 있다고 가정해 보겠습니다. 현재 컬렉션 수는 다음과 같이 계산할 수 있습니다:
60 * 2 * 4 + 40 * 1 * 12 = 960
topk
벡터를 검색할 때 왜 k보다 적은 수의 벡터가 표시되나요?
Milvus가 지원하는 인덱스 중 IVF_FLAT과 IVF_SQ8은 k-평균 클러스터링 방식을 구현합니다. 데이터 공간을 nlist
클러스터로 나누고 삽입된 벡터를 이 클러스터에 분산시킵니다. 그런 다음 Milvus는 nprobe
가장 가까운 클러스터를 선택하고 대상 벡터와 선택한 클러스터의 모든 벡터 사이의 거리를 비교하여 최종 결과를 반환합니다.
nlist
과 topk
이 크고 nprobe 가 작은 경우 nprobe 클러스터의 벡터 수가 k
보다 적을 수 있습니다. 따라서 topk
가장 가까운 벡터를 검색하면 반환되는 벡터 수가 k
보다 적을 수 있습니다.
이를 방지하려면 nprobe
을 더 크게, nlist
과 k
을 더 작게 설정해 보세요.
자세한 내용은 벡터 색인을 참조하세요.
Milvus에서 지원되는 최대 벡터 크기는 얼마인가요?
Milvus는 기본적으로 최대 32,768개의 차원으로 벡터를 관리할 수 있습니다. Proxy.maxDimension
값을 늘려 더 큰 차원의 벡터를 허용할 수 있습니다.
Milvus는 Apple M1 CPU를 지원하나요?
현재 Milvus 릴리스는 Apple M1 CPU를 직접 지원하지 않습니다. Milvus 2.3 이후에는 ARM64 아키텍처용 Docker 이미지를 제공합니다.
Milvus는 기본 키 필드에서 어떤 데이터 유형을 지원하나요?
현재 릴리스에서 Milvus는 INT64와 문자열을 모두 지원합니다.
Milvus는 확장 가능한가요?
예. Kubernetes의 헬름 차트를 통해 여러 노드가 있는 Milvus 클러스터를 배포할 수 있습니다. 자세한 지침은 스케일 가이드를 참조하세요.
성장 세그먼트와 봉인된 세그먼트는 무엇인가요?
검색 요청이 오면 Milvus는 증분 데이터와 과거 데이터를 모두 검색합니다. 증분 데이터는 최근 업데이트이며, 증가하는 세그먼트에 저장되어 객체 스토리지에 유지될 임계값에 도달하기 전에 메모리에 버퍼링되어 보다 효율적인 인덱스가 구축되는 반면, 기록 데이터는 오래 전에 업데이트된 데이터입니다. 이 데이터는 오브젝트 스토리지에 보존된 봉인된 세그먼트에 있습니다. 증분 데이터와 기록 데이터가 함께 검색을 위한 전체 데이터 세트를 구성합니다. 이러한 설계 덕분에 Milvus에 수집된 모든 데이터를 즉시 검색할 수 있습니다. Milvus Distributed의 경우, 방금 수집된 레코드가 검색 결과에 표시되는 시점을 결정하는 더 복잡한 요소들이 있습니다. 일관성 수준에서 이에 대한 자세한 뉘앙스를 알아보세요.
Milvus는 동시 검색이 가능한가요?
네. 동일한 컬렉션에 대한 쿼리의 경우, Milvus는 증분 데이터와 기록 데이터를 동시에 검색합니다. 그러나 서로 다른 컬렉션에 대한 쿼리는 순차적으로 수행됩니다. 기록 데이터는 매우 방대한 데이터 세트가 될 수 있지만, 기록 데이터에 대한 검색은 상대적으로 더 많은 시간이 소요되며 기본적으로 연속적으로 수행됩니다.
해당 컬렉션이 삭제된 후에도 MinIO의 데이터가 남아있는 이유는 무엇인가요?
MinIO의 데이터는 데이터 롤백의 편의를 위해 일정 기간 동안 유지되도록 설계되었습니다.
Milvus는 Pulsar 이외의 메시지 엔진을 지원하나요?
네. Milvus 2.1.0에서는 Kafka가 지원됩니다.
검색과 쿼리의 차이점은 무엇인가요?
Milvus에서 벡터 유사도 검색은 유사도 계산과 벡터 인덱스 가속을 기반으로 벡터를 검색합니다. 벡터 유사도 검색과 달리, 벡터 쿼리는 부울 표현식을 기반으로 스칼라 필터링을 통해 벡터를 검색합니다. 부울 표현식은 스칼라 필드 또는 기본 키 필드를 필터링하고 필터와 일치하는 모든 결과를 검색합니다. 쿼리에는 유사성 메트릭이나 벡터 인덱스가 포함되지 않습니다.
Milvus에서 실수 벡터 값의 정밀도가 소수점 이하 7자리인 이유는 무엇인가요?
Milvus는 벡터를 Float32 배열로 저장하는 것을 지원합니다. Float32 값의 정밀도는 소수점 이하 7자리입니다. 1.3476964684980388 같은 Float64 값의 경우에도 Milvus는 1.347696으로 저장합니다. 따라서 Milvus에서 이러한 벡터를 검색하면 Float64 값의 정밀도가 손실됩니다.
Milvus는 벡터 데이터 유형과 정밀도를 어떻게 처리하나요?
Milvus는 Binary, Float32, Float16 및 BFloat16 벡터 유형을 지원합니다.
- 바이너리 벡터: 이진 데이터는 이미지 처리와 정보 검색에 사용되는 0과 1의 시퀀스로 저장합니다.
- Float32 벡터: 소수점 이하 7자리 정도의 정밀도를 가진 기본 저장소입니다. Float64 값도 Float32 정밀도로 저장되므로 검색 시 정밀도 손실이 발생할 수 있습니다.
- Float16 및 BFloat16 벡터: 정밀도와 메모리 사용량이 감소합니다. Float16은 대역폭과 저장 공간이 제한된 애플리케이션에 적합하며, BFloat16은 정확도에 큰 영향을 주지 않으면서 계산 요구 사항을 줄이기 위해 딥 러닝에서 일반적으로 사용되는 범위와 효율성의 균형을 맞추는 데 적합합니다.
Milvus는 스칼라 또는 벡터 필드에 대한 기본값 지정을 지원하나요?
현재 Milvus 2.4.x는 스칼라 또는 벡터 필드에 대한 기본값 지정을 지원하지 않습니다. 이 기능은 향후 릴리스에 추가될 예정입니다.
Milvus에서 데이터를 삭제하면 저장 공간이 바로 해제되나요?
아니요, Milvus에서 데이터를 삭제하면 저장 공간이 즉시 해제되지 않습니다. 데이터를 삭제하면 엔티티가 '논리적으로 삭제됨'으로 표시되지만 실제 공간은 즉시 해제되지 않을 수 있습니다. 그 이유는 다음과 같습니다:
- 압축: Milvus는 백그라운드에서 데이터를 자동으로 압축합니다. 이 프로세스는 작은 데이터 세그먼트를 큰 데이터 세그먼트로 병합하고 논리적으로 삭제된 데이터(삭제 표시된 엔티티) 또는 TTL(Time-To-Live)을 초과한 데이터를 제거합니다. 그러나 압축은 새로운 세그먼트를 생성하는 동시에 이전 세그먼트를 "삭제됨"으로 표시합니다.
- 가비지 컬렉션: 가비지 컬렉션(GC)이라는 별도의 프로세스가 주기적으로 이러한 '삭제된' 세그먼트를 제거하여 해당 세그먼트가 차지하고 있던 스토리지 공간을 확보합니다. 이렇게 하면 저장 공간을 효율적으로 사용할 수 있지만 삭제와 공간 확보 사이에 약간의 지연이 발생할 수 있습니다.
플러시를 기다리지 않고 작업 후 즉시 삽입, 삭제 또는 업서트된 데이터를 볼 수 있나요?
예. Milvus에서는 스토리지-컴퓨팅 분리 아키텍처로 인해 데이터 가시성이 플러시 작업과 직접적으로 연결되지 않습니다. 일관성 수준을 사용하여 데이터 가독성을 관리할 수 있습니다.
일관성 수준을 선택할 때는 일관성과 성능 간의 장단점을 고려하세요. 즉각적인 가시성이 필요한 작업의 경우 '강력' 일관성 수준을 사용하세요. 더 빠른 쓰기를 원한다면 약한 일관성(데이터가 즉시 표시되지 않을 수 있음)을 우선순위로 정하세요. 자세한 내용은 일관성을 참조하세요.
파티션 키 기능을 활성화한 후 Milvus에서 num_partitions
의 기본값은 무엇이며 그 이유는 무엇인가요?
파티션 키 기능이 활성화되면 Milvus에서 num_partitions
의 기본값은 16
으로 설정됩니다. 이 기본값은 안정성 및 성능상의 이유로 선택됩니다. 필요에 따라 create_collection
함수에서 num_partitions
값을 지정하여 조정할 수 있습니다.
스칼라 필터링 표현식의 최대 길이 제한이 있나요?
예. 스칼라 필터링 표현식의 최대 길이는 milvus.yaml
구성 파일에 정의된 RPC 전송 제한에 의해 제한됩니다. 특히 이 제한은 프록시 섹션 아래의 serverMaxRecvSize
매개변수에 의해 설정됩니다:
proxy:
grpc:
serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
기본적으로 각 RPC 요청의 최대 크기는 64MB입니다. 따라서 필터링 표현식의 길이가 이 제한보다 작아야 성공적으로 처리할 수 있습니다.
대량 벡터 검색을 수행할 때 한 번에 몇 개의 벡터를 지정할 수 있나요? 제한이 있나요?
예, 대량 벡터 검색에 지정할 수 있는 벡터의 수는 milvus.yaml
구성 파일에 정의된 대로 RPC 전송 크기에 의해 제한됩니다. 이 제한은 프록시 섹션 아래의 serverMaxRecvSize
매개변수에 의해 결정됩니다:
proxy:
grpc:
serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
기본적으로 각 RPC 요청의 최대 크기는 64MB입니다. 따라서 성공적으로 실행하려면 차원 데이터와 메타데이터를 포함한 입력 벡터의 총 크기가 이 제한보다 작아야 합니다.
아직 질문이 있으신가요?
언제든지 문의하세요:
- GitHub에서 Milvus를 확인하세요. 질문을 제기하고, 아이디어를 공유하고, 다른 사람들을 도울 수 있습니다.
- Slack 커뮤니티에 가입하여 지원을 찾고 오픈 소스 커뮤니티에 참여하세요.