Хранение данных с поддержкой 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
разделяется на четыре отдельных поля, и все они по умолчанию 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
.
Во время работы кластера: динамическая конфигурация
Во время работы кластера можно динамически изменять параметры отображения памяти на уровне коллекции или индекса.
На уровне коллекции отображение памяти применяется ко всем неиндексированным исходным данным в коллекции, исключая первичные ключи, временные метки и идентификаторы строк. Такой подход особенно удобен для комплексного управления большими наборами данных.
Для динамической корректировки настроек отображения памяти в коллекции используйте метод set_properties()
. Здесь вы можете переключать mmap.enabled
между True
и False
по мере необходимости.
# 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
. Здесь вы можете переключать mmap_enabled
между True
или False
по мере необходимости.
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
)
Настройка пути хранения в различных развертываниях
Файлы, отображаемые в памяти, по умолчанию размещаются в каталоге /mmap
внутри localStorage.path
. Вот как настроить этот параметр при различных способах развертывания:
- Для Milvus, установленного с помощью Helm Chart:
# 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
- Для Milvus, установленного с помощью Milvus Operator:
# patch.yaml
spec:
config:
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path
kubectl patch milvus <milvus-name> --patch-file patch.yaml
- Для Milvus, установленного с помощью Docker:
# A new installation script is provided to enable mmap-related settings.
Ограничения
Сопоставление памяти не может быть включено для загруженной коллекции, убедитесь, что коллекция была освобождена перед включением сопоставления памяти.
Сопоставление памяти не поддерживается для индексов класса DiskANN или GPU.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
В каких сценариях рекомендуется включать отображение памяти? Каковы компромиссы после включения этой функции?
Сопоставление памяти рекомендуется при ограниченном объеме памяти или при умеренных требованиях к производительности. Включение этой функции увеличивает пропускную способность для загрузки данных. Например, при конфигурации из 2 процессоров и 8 ГБ памяти включение функции отображения памяти позволяет загрузить в 4 раза больше данных по сравнению с отсутствием этой функции. Влияние на производительность различно:
При достаточном объеме памяти ожидаемая производительность аналогична производительности при использовании только памяти.
При недостатке памяти ожидаемая производительность может снизиться.
Какова связь между конфигурациями на уровне коллекции и на уровне индекса?
Уровень коллекции и уровень индекса не являются всеобъемлющими отношениями, уровень коллекции контролирует, поддерживают ли исходные данные mmap или нет, в то время как уровень индекса предназначен только для векторных индексов.
Существует ли какой-либо рекомендуемый тип индекса для отображения памяти?
Да, для включения mmap рекомендуется HNSW. Мы уже тестировали индексы серий HNSW, IVF_FLAT, IVF_PQ/SQ, производительность индексов серии IVF серьезно упала, в то время как падение производительности при включении mmap для индексов HNSW остается в пределах ожиданий.
Какое локальное хранилище требуется для отображения памяти?
Высококачественный диск повышает производительность, причем предпочтительным вариантом являются диски NVMe.
Можно ли отображать память на скалярные данные?
Картирование памяти можно применять к скалярным данным, но оно не применимо к индексам, построенным на скалярных полях.
Как определяется приоритет для конфигураций отображения памяти на разных уровнях?
В Milvus, когда конфигурации отображения памяти явно определены на нескольких уровнях, конфигурации на уровне индексов и коллекций имеют наивысший приоритет, а затем следуют конфигурации на уровне кластеров.
Если я перейду с Milvus 2.3 и настрою путь к каталогу отображения памяти, что произойдет?
Если вы перешли с Milvus 2.3 и настроили путь к каталогу отображения памяти (
mmapDirPath
), ваша конфигурация будет сохранена, а параметром по умолчанию для включенного отображения памяти (mmapEnabled
) будетtrue
. Важно перенести метаданные, чтобы синхронизировать конфигурацию существующих файлов с отображением памяти. Дополнительные сведения см. в разделе Миграция метаданных.