milvus-logo
LFAI
홈페이지
  • 관리 가이드
    • 스토리지 최적화

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.mmapEnabledtrue 으로 설정되어 있는 경우 새로 추가된 구성은 현재 true 으로 설정됩니다. queryNode.mmap.mmapEnabledfalse 으로 설정된 경우 , 새 구성이 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.enabledTrue 또는 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 이 됩니다. 메타데이터를 마이그레이션하여 기존 메모리 매핑 파일의 구성을 동기화하는 것이 중요합니다. 자세한 내용은 메타데이터 마이그레이션을 참조하세요.

번역DeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?