Warm Up
Milvus 2.6.4+와 호환돼요.
Warm Up은 Tiered Storage를 보완해 세그먼트가 쿼리 가능해지기 전에 선택한 필드나 인덱스를 캐시에 미리 로드해요. 클러스터, 컬렉션, 개별 필드/인덱스 수준에서 워밍업을 구성할 수 있어 처음 쿼리의 지연 시간과 리소스 사용을 세밀하게 제어할 수 있어요.
출처: Milvus 문서
본문
왜 워밍업이 필요한가요? (Why warm up)
Tiered Storage의 Lazy Load는 처음에 메타데이터만 로드해 효율성을 개선해요. 하지만 필요한 청크나 인덱스를 원격 저장소에서 가져와야 하므로 콜드 데이터에 대한 첫 쿼리에 지연이 발생할 수 있어요.
Warm Up은 세그먼트 초기화 중에 중요한 데이터를 사전에 캐싱해 이 문제를 해결해요.
특히 다음 경우에 유용해요.
- 특정 스칼라 인덱스가 필터 조건에 자주 사용될 때
- 벡터 인덱스가 검색 성능에 필수적이라 즉시 준비되어야 할 때
- QueryNode 재시작이나 새 세그먼트 로드 후 콜드 스타트 지연이 허용되지 않을 때
반대로 Warm Up은 자주 쿼리되지 않는 필드나 인덱스에는 권장되지 않아요. Warm Up을 비활성화하면 세그먼트 로드 시간이 짧아지고 캐시 공간이 절약돼요. 큰 벡터 필드나 중요하지 않은 스칼라 필드에 이상적이에요.
구성 수준 (Configuration levels)
| 수준 | 범위 | 구성 방법 | 우선순위 |
|---|---|---|---|
| Field/Index | 단일 필드 또는 인덱스 | SDK 메서드: - add_field()- alter_collection_field()- add_index()- alter_index_properties() |
Highest |
| Collection | 컬렉션의 모든 필드/인덱스 | SDK 메서드: - create_collection()- alter_collection_properties() |
Medium |
| Cluster | 클러스터의 모든 컬렉션 | milvus.yaml 설정 파일 |
Lowest (default) |
재정의 동작:
- 필드에 자체 워밍업 설정이 있으면 그 설정이 컬렉션 수준 및 클러스터 수준 설정보다 우선해요.
- 필드 또는 인덱스 수준 설정이 없으면 컬렉션 수준 설정이 적용돼요.
- 필드/인덱스 수준과 컬렉션 수준 설정이 모두 없으면 클러스터 수준이 적용돼요.
- alter 연산을 사용할 때는 가장 최근의 alter 값이 적용돼요.
클러스터 수준 워밍업 구성 (Configure warmup at cluster level)
클러스터 수준 워밍업은 Milvus 설정 파일 milvus.yaml에서 구성하며 클러스터의 모든 컬렉션에 적용돼요. 이것이 기본값의 기준이 돼요.
각 대상 타입은 두 가지 설정을 지원해요.
| Warmup 설정 | 설명 | 일반적인 시나리오 |
|---|---|---|
sync |
세그먼트가 쿼리 가능해지기 전에 미리 로드해요. 로드 시간이 약간 늘지만 첫 쿼리는 지연이 없어요. | 즉시 사용 가능해야 하는 성능에 중요한 데이터에 사용해요. 예: 고빈도 스칼라 인덱스 또는 검색에 사용되는 핵심 벡터 인덱스. |
disable |
사전 로드를 건너뛰어요. 세그먼트가 더 빨리 쿼리 가능해지지만 첫 쿼리는 필요에 따라 로드가 트리거될 수 있어요. | 자주 접근하지 않거나 큰 데이터에 사용해요. 예: 원본 벡터 필드 또는 중요하지 않은 스칼라 필드. |
예시 YAML:
queryNode:
segcore:
tieredStorage:
warmup:
# options: sync, disable.
# Specifies the timing for warming up the Tiered Storage cache.
# - `sync`: data will be loaded into the cache before a segment is considered loaded.
# - `disable`: data will not be proactively loaded into the cache, and loaded only if needed by search/query tasks.
# Defaults to `sync`, except for vector field which defaults to `disable`.
scalarField: sync
scalarIndex: sync
vectorField: disable # cache warmup for vector field raw data is by default disabled.
vectorIndex: sync
| 파라미터 | Warmup 설정 | 설명 | 권장 사용 사례 |
|---|---|---|---|
scalarField |
sync | disable |
스칼라 필드 데이터를 사전 로드할지 제어해요. | 스칼라 필드가 작고 필터에서 자주 접근될 때만 sync를 사용해요. 그렇지 않으면 로드 시간을 줄이기 위해 disable을 사용해요. |
scalarIndex |
sync | disable |
스칼라 인덱스를 사전 로드할지 제어해요. | 빈번한 필터 조건 또는 범위 쿼리에 포함되는 스칼라 인덱스는 sync를 사용해요. |
vectorField |
sync | disable |
벡터 필드 데이터를 사전 로드할지 제어해요. | 일반적으로 무거운 캐시 사용을 피하기 위해 disable을 사용해요. 검색 후 원본 벡터를 즉시 가져와야 할 때만 sync를 활성화해요(예: 벡터 리콜이 있는 유사도 결과). |
vectorIndex |
sync | disable |
벡터 인덱스를 사전 로드할지 제어해요. | 검색 지연에 중요한 벡터 인덱스는 sync를 사용해요. 배치나 저빈도 워크로드에서는 더 빠른 세그먼트 준비를 위해 disable을 사용해요. |
컬렉션 수준 워밍업 구성 (Configure warmup at collection level)
Milvus 2.6.11+와 호환돼요.
컬렉션 수준 워밍업은 특정 컬렉션에 대해 클러스터 기본값을 재정의할 수 있게 해 줘요. 컬렉션이 클러스터 전체 기준선과 다른 접근 패턴을 가질 때 유용해요.
컬렉션 생성 시 워밍업 설정
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
client.create_collection(
collection_name="my_collection",
schema=schema,
properties={
"warmup.scalarField": "sync",
"warmup.scalarIndex": "sync",
"warmup.vectorField": "disable",
"warmup.vectorIndex": "sync"
}
)
기존 컬렉션에서 워밍업 설정 변경
먼저 load()를 호출하기 전에 컬렉션 속성을 변경해야 해요. 로드된 컬렉션을 변경하면 오류가 반환돼요. 워밍업 설정 변경은 다음에 컬렉션을 로드할 때 적용돼요.
client.alter_collection_properties(
collection_name="my_collection",
properties={
"warmup.vectorIndex": "disable",
"warmup.scalarField": "sync"
}
)
속성 참조:
| 속성 | Warmup 설정 | 설명 |
|---|---|---|
warmup.scalarField |
sync | disable |
컬렉션의 모든 스칼라 필드에 대한 워밍업 설정이에요. |
warmup.scalarIndex |
sync | disable |
컬렉션의 모든 스칼라 인덱스에 대한 워밍업 설정이에요. |
warmup.vectorField |
sync | disable |
컬렉션의 모든 벡터 필드에 대한 워밍업 설정이에요. |
warmup.vectorIndex |
sync | disable |
컬렉션의 모든 벡터 인덱스에 대한 워밍업 설정이에요. |
필드 수준 워밍업 구성 (Configure warmup at field level)
Milvus 2.6.11+와 호환돼요.
필드 수준 워밍업은 가장 세밀한 단위로, 개별 필드의 워밍업 동작을 제어할 수 있게 해 줘요. 특정 필드가 고유한 접근 패턴을 가질 때 유용해요.
필드 수준 워밍업은 필드 원본 데이터에만 적용되며 해당 필드의 인덱스에는 적용되지 않아요. 인덱스 워밍업을 구성하려면 인덱스 수준 구성을 사용해요.
필드 생성 시 워밍업 설정
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema()
schema.add_field(
field_name="id",
datatype=DataType.INT64,
is_primary=True
)
schema.add_field(
field_name="category",
datatype=DataType.VARCHAR,
max_length=128,
warmup="sync" # Preload this field at load time
)
schema.add_field(
field_name="embedding",
datatype=DataType.FLOAT_VECTOR,
dim=768,
warmup="disable" # Do not preload vector raw data
)
기존 필드에서 워밍업 설정 변경
먼저 load()를 호출하기 전에 필드 설정을 변경해야 해요. 로드된 컬렉션의 필드를 변경하면 오류가 반환돼요. 워밍업 설정 변경은 다음에 컬렉션을 로드할 때 적용돼요.
client.alter_collection_field(
collection_name="my_collection",
field_name="category",
field_params={"warmup": "sync"}
)
인덱스 수준 워밍업 구성 (Configure warmup at index level)
Milvus 2.6.11+와 호환돼요.
인덱스 수준 워밍업은 기본 필드의 워밍업 설정과 독립적으로 개별 인덱스의 사전 로드를 제어할 수 있게 해 줘요.
인덱스 생성 시 워밍업 설정
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
index_params = client.prepare_index_params()
index_params.add_index(
field_name="embedding",
index_type="HNSW",
metric_type="COSINE",
params={
"M": 16,
"efConstruction": 256,
"warmup": "sync" # Preload this index at load time
}
)
index_params.add_index(
field_name="category",
index_type="AUTOINDEX",
params={"warmup": "disable"} # Do not preload this index
)
client.create_index(
collection_name="my_collection",
index_params=index_params
)
기존 인덱스에서 워밍업 설정 변경
먼저 load()를 호출하기 전에 인덱스 설정을 변경해야 해요. 로드된 컬렉션의 인덱스를 변경하면 오류가 반환돼요. 워밍업 설정 변경은 다음에 컬렉션을 로드할 때 적용돼요.
client.alter_index_properties(
collection_name="my_collection",
index_name="embedding",
properties={"warmup": "sync"}
)
워밍업 동작 참조 (Warmup behavior reference)
다음 표는 세그먼트 수명주기의 각 단계에서 워밍업 동작을 요약해요.
| Warmup 설정 | 로드 단계 | 검색/쿼리 단계 | 릴리즈 단계 |
|---|---|---|---|
sync |
데이터가 로컬 저장소로 로드돼요. 대상(디스크 또는 메모리)은 mmap 설정에 따라 달라져요. | 쿼리가 로컬 캐시를 직접 조회해요. | 로컬 캐시 데이터가 지워져요. |
disable |
데이터가 로컬 저장소로 로드되지 않아요. | 데이터가 객체 저장소에서 필요에 따라 가져와지고, mmap 설정에 따라 로컬로 캐시돼요. | 로컬 캐시 데이터가 지워져요. |
mmap과의 상호작용:
| Warmup 설정 | Mmap 활성화 | 데이터 위치 |
|---|---|---|
sync |
true |
로컬 디스크 (localStorage.path/cache/...) |
sync |
false |
로컬 메모리 |
disable |
true |
최초 접근 시 로컬 디스크로 가져옴 |
disable |
false |
최초 접근 시 로컬 메모리로 가져옴 |
로컬 캐시 디렉터리 구조(mmap 활성화 시):
| 데이터 타입 | 디렉터리 경로 |
|---|---|
| Scalar/Vector 필드 데이터 | localStorage.path/cache//local_chunk/... |
| Scalar/Vector 인덱스 파일 | localStorage.path/cache//local_chunk/index_files/... |
모범 사례 (Best practices)
Warm Up은 초기 로드에만 영향을 줘요. 캐시된 데이터가 나중에 퇴출되면 다음 쿼리가 필요에 따라 다시 로드해요.
sync를 과도하게 사용하지 마세요. 너무 많은 필드를 사전 로드하면 로드 시간과 캐시 압력이 늘어나요.- 보수적으로 시작해요. 자주 접근되는 필드와 인덱스에만 Warm Up을 활성화해요.
- 쿼리 지연과 캐시 메트릭을 모니터링하고 필요에 따라 사전 로드를 확장해요.
- 혼합 워크로드에서는 성능에 민감한 컬렉션에
sync를, 용량 중심 컬렉션에disable을 적용해요.
더 알아보기 (Learn more)
- Tiered Storage — Tiered Storage와 Lazy Load 개념
- Milvus 공식 문서 — 상세 참고 자료