MMap 지원 데이터 스토리지
Milvus에서는 메모리 매핑 파일을 사용하면 파일 내용을 메모리에 직접 매핑할 수 있습니다. 이 기능은 특히 사용 가능한 메모리가 부족하지만 완전한 데이터 로딩이 불가능한 상황에서 메모리 효율성을 향상시킵니다. 이 최적화 메커니즘은 특정 한도까지 성능을 보장하면서 데이터 용량을 늘릴 수 있지만, 데이터 양이 메모리를 너무 많이 초과하면 검색 및 쿼리 성능이 심각하게 저하될 수 있으므로 이 기능을 적절하게 켜거나 끄도록 선택하세요.
메모리 매핑 구성
Milvus 2.4부터는 배포 전에 정적 구성 파일을 유연하게 조정하여 전체 클러스터의 기본 메모리 매핑 설정을 구성할 수 있습니다. 또한, 클러스터와 인덱스 수준 모두에서 메모리 매핑 설정을 미세 조정하기 위해 매개변수를 동적으로 변경할 수 있는 옵션도 있습니다. 향후 업데이트에서는 필드 수준 구성을 포함하도록 메모리 매핑 기능을 확장할 예정입니다.
클러스터 배포 전: 전역 구성
클러스터를 배포하기 전에 클러스터 수준 설정으로 전체 클러스터에 메모리 매핑을 적용합니다. 이렇게 하면 모든 새 개체가 자동으로 이러한 구성을 따르게 됩니다. 이러한 설정을 수정하려면 클러스터를 다시 시작해야 적용된다는 점에 유의하세요.
클러스터의 메모리 매핑 설정을 조정하려면 configs/milvus.yaml
파일을 편집하세요. 이 파일에서 기본적으로 메모리 매핑을 사용할지 여부를 지정하고 메모리 매핑된 파일을 저장할 디렉터리 경로를 결정할 수 있습니다. 경로(mmapDirPath
)를 지정하지 않으면 시스템은 기본적으로 메모리 매핑된 파일을 {localStorage.path}/mmap
에 저장합니다. 자세한 내용은 로컬 저장소 관련 구성을 참조하세요.
# This parameter was set in configs/milvus.yaml
...
queryNode:
mmap:
# Set memory mapping property for whole cluster
mmapEnabled: false | true
# Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default.
mmapDirPath: any/valid/path
....
2.4.10
이후 구성 queryNode.mmap.mmapEnabled
은 아래 4개의 개별 필드로 분할되며, 모든 기본값은 false
입니다:
queryNode.mmap.vectorField
는 벡터 데이터가 mmap인지 여부를 제어합니다;queryNode.mmap.vectorIndex
는 벡터 인덱스가 mmap인지 여부를 제어합니다;queryNode.mmap.scalarField
는 스칼라 데이터가 mmap인지 여부를 제어합니다;queryNode.mmap.scalarIndex
는 스칼라 인덱스가 mmap인지 여부를 제어합니다;
# This parameter was set in configs/milvus.yaml
...
queryNode:
mmap:
vectorField: false # Enable mmap for loading vector data
vectorIndex: false # Enable mmap for loading vector index
scalarField: false # Enable mmap for loading scalar data
scalarIndex: false # Enable mmap for loading scalar index
....
또한 벡터 인덱스와 벡터 데이터 mmap만 컬렉션에 대해 개별적으로 켜고 끌 수 있지만 다른 것들은 켜고 끌 수 없습니다.
호환성: 원래 구성 queryNode.mmap.mmapEnabled
이 true
으로 설정되어 있는 경우 새로 추가된 구성은 현재 true
으로 설정됩니다. queryNode.mmap.mmapEnabled
이 false
으로 설정된 경우 , 새 구성이 true
으로 설정된 경우 최종 값은 true
이 됩니다.
클러스터 운영 중: 동적 구성
클러스터 런타임 중에 컬렉션 또는 인덱스 수준에서 메모리 매핑 설정을 동적으로 조정할 수 있습니다.
컬렉션 수준에서 메모리 매핑은 기본 키, 타임스탬프, 행 ID를 제외한 컬렉션 내의 인덱싱되지 않은 모든 원시 데이터에 적용됩니다. 이 접근 방식은 특히 대규모 데이터 세트의 포괄적인 관리에 적합합니다.
컬렉션 내에서 메모리 매핑 설정을 동적으로 조정하려면 set_properties()
방법을 활용하세요. 여기에서 필요에 따라 True
또는 False
사이에서 mmap.enabled
을 전환할 수 있습니다.
# Get existing collection
collection = Collection("test_collection") # Replace with your collection name
# Set memory mapping property to True or Flase
collection.set_properties({'mmap.enabled': True})
컬렉션 내의 메모리 매핑 설정인 2.4.10
이후에는 add_field
방법을 활용하세요. 여기에서 필요에 따라 True
또는 False
사이에서 mmap_enabled
을 전환할 수 있습니다.
schema = MilvusClient.create_schema()
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)
인덱스 수준 설정의 경우 다른 데이터 유형에 영향을 주지 않고 벡터 인덱스에 메모리 매핑을 특별히 적용할 수 있습니다. 이 기능은 벡터 검색에 최적화된 성능이 필요한 컬렉션에 매우 유용합니다.
컬렉션 내의 인덱스에 대해 메모리 매핑을 활성화 또는 비활성화하려면 alter_index()
메서드를 호출하여 index_name
에 대상 인덱스 이름을 지정하고 mmap.enabled
를 True
또는 False
로 설정합니다.
collection.alter_index(
index_name="vector_index", # Replace with your vector index name
extra_params={"mmap.enabled": True} # Enable memory mapping for index
)
다양한 배포에서 저장 경로 사용자 지정
메모리 매핑된 파일은 기본적으로 localStorage.path
내의 /mmap
디렉터리로 설정된다. 다음은 다양한 배포 방법에서 이 설정을 사용자 정의하는 방법이다:
- 헬름 차트를 사용하여 설치한 Milvus의 경우:
# new-values.yaml
extraConfigFiles:
user.yaml: |+
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
- 밀버스 오퍼레이터를 사용하여 설치한 밀버스의 경우:
# patch.yaml
spec:
config:
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path
kubectl patch milvus <milvus-name> --patch-file patch.yaml
- 도커를 사용하여 설치한 Milvus의 경우:
# A new installation script is provided to enable mmap-related settings.
제한
로드된 컬렉션에 대해서는 메모리 매핑을 활성화할 수 없으므로 메모리 매핑을 활성화하기 전에 컬렉션이 릴리스되었는지 확인하세요.
DiskANN 또는 GPU 클래스 인덱스에는 메모리 매핑이 지원되지 않습니다.
FAQ
어떤 시나리오에서 메모리 매핑을 활성화하는 것이 좋나요? 이 기능을 활성화하면 어떤 장단점이 있나요?
메모리 매핑은 메모리가 제한되어 있거나 성능 요구 사항이 보통인 경우에 사용하는 것이 좋습니다. 이 기능을 활성화하면 데이터 로딩 용량이 증가합니다. 예를 들어 CPU 2개와 8GB 메모리로 구성된 경우 메모리 매핑을 활성화하면 활성화하지 않을 때보다 최대 4배 더 많은 데이터를 로드할 수 있습니다. 성능에 미치는 영향은 다양합니다:
메모리가 충분한 경우 예상되는 성능은 메모리만 사용할 때와 비슷합니다.
메모리가 부족하면 예상 성능이 저하될 수 있습니다.
컬렉션 수준과 인덱스 수준 구성의 관계는 무엇인가요?
컬렉션 수준과 인덱스 수준은 포괄적인 관계가 아니며, 컬렉션 수준은 원본 데이터의 MMAP 사용 여부를 제어하는 반면 인덱스 수준은 벡터 인덱스 전용입니다.
메모리 매핑에 권장되는 인덱스 유형이 있나요?
예, mmap 활성화에는 HNSW가 권장됩니다. 이전에 HNSW, IVF_FLAT, IVF_PQ/SQ 시리즈 인덱스를 테스트한 결과, IVF 시리즈 인덱스의 성능은 심각하게 떨어졌지만 HNSW 인덱스의 경우 mmap을 켜도 성능 하락은 예상 범위 내에 있었습니다.
메모리 매핑에는 어떤 종류의 로컬 스토리지가 필요하나요?
고품질 디스크가 성능을 향상시키며, NVMe 드라이브가 선호되는 옵션입니다.
스칼라 데이터를 메모리 매핑할 수 있나요?
메모리 매핑은 스칼라 데이터에 적용할 수 있지만, 스칼라 필드에 구축된 인덱스에는 적용되지 않습니다.
여러 수준에서 메모리 매핑 구성의 우선 순위는 어떻게 결정되나요?
Milvus에서 메모리 매핑 구성이 여러 수준에 걸쳐 명시적으로 정의된 경우, 인덱스 수준과 컬렉션 수준 구성이 가장 높은 우선순위를 공유하고 그 다음으로는 클러스터 수준 구성이 그 뒤를 따릅니다.
Milvus 2.3에서 업그레이드하면서 메모리 매핑 디렉터리 경로를 구성한 경우 어떻게 되나요?
Milvus 2.3에서 업그레이드하면서 메모리 매핑 디렉터리 경로(
mmapDirPath
)를 구성한 경우 해당 구성이 유지되며 메모리 매핑 활성화 기본 설정(mmapEnabled
)은true
이 됩니다. 메타데이터를 마이그레이션하여 기존 메모리 매핑 파일의 구성을 동기화하는 것이 중요합니다. 자세한 내용은 메타데이터 마이그레이션을 참조하세요.