Milvus 클러스터 및 K8 시작하기
소개
Milvus는 대규모 임베딩 벡터를 저장, 색인, 관리하는 것을 목표로 하는 분산형 벡터 데이터베이스입니다. 수조 개의 벡터를 효율적으로 색인하고 검색할 수 있는 Milvus는 AI 및 머신 러닝 워크로드를 위한 최고의 선택입니다.
반면에 Kubernetes(K8s)는 컨테이너화된 애플리케이션을 관리하고 확장하는 데 탁월합니다. 자동 확장, 자가 복구, 로드 밸런싱과 같은 기능을 제공하며, 이는 프로덕션 환경에서 고가용성과 성능을 유지하는 데 매우 중요합니다.
왜 함께 사용해야 할까요?
K8은 워크로드에 따라 Milvus 클러스터를 자동으로 확장할 수 있습니다. 데이터가 증가하거나 쿼리 수가 증가하면 K8은 더 많은 Milvus 인스턴스를 스핀업하여 부하를 처리함으로써 애플리케이션의 응답성을 유지할 수 있습니다.
K8의 뛰어난 기능 중 하나는 수평적 확장이 가능하기 때문에 Milvus 클러스터를 손쉽게 확장할 수 있다는 점입니다. 데이터 세트가 증가함에 따라 K8s는 이러한 증가를 손쉽게 수용하여 간단하고 효율적인 솔루션이 됩니다.
또한, 쿼리 처리 기능도 K8s를 통해 수평적으로 확장할 수 있습니다. 쿼리 부하가 증가하면 K8은 더 많은 Milvus 인스턴스를 배포하여 늘어난 유사도 검색 쿼리를 처리할 수 있으므로 부하가 많은 상황에서도 지연 시간이 짧은 응답을 보장합니다.
전제 조건 및 K8 설정하기
전제 조건
도커 - 시스템에 도커가 설치되어 있는지 확인합니다.
Kubernetes - Kubernetes 클러스터를 준비합니다. 로컬 개발의 경우
minikube
, 프로덕션 환경의 경우 클라우드 제공업체의 Kubernetes 서비스를 사용할 수 있습니다.Helm - Kubernetes 애플리케이션을 관리하는 데 도움이 되는 Kubernetes용 패키지 매니저인 Helm을 설치하며, 그 방법은 https://milvus.io/docs/install_cluster-helm.md 에서 설명서를 확인할 수 있습니다.
Kubectl - 애플리케이션을 배포하고, 클러스터 리소스를 검사 및 관리하고, 로그를 보기 위해 Kubernetes 클러스터와 상호 작용하기 위한 명령줄 도구인
kubectl
를 설치합니다.
K8 설정
K8s 클러스터를 실행하는 데 필요한 모든 것을 설치한 후 minikube
를 사용하여 클러스터를 시작하세요:
minikube start
를 사용하여 K8s 클러스터의 상태를 확인합니다:
kubectl cluster-info
K8s에 Milvus 배포하기
이 배포에서는 전체 분산 기능을 활용하기 위해 클러스터 모드에서 Milvus를 선택합니다. 설치 프로세스를 간소화하기 위해 Helm을 사용할 것입니다.
1. 헬름 설치 명령어
helm install my-milvus milvus/milvus --set pulsar.enabled=false --set kafka.enabled=true
이 명령은 Kafka를 활성화하고 Pulsar를 비활성화한 상태에서 K8s 클러스터에 Milvus를 설치합니다. Kafka는 Milvus 내에서 메시징 시스템 역할을 하며 서로 다른 구성 요소 간의 데이터 스트리밍을 처리합니다. Pulsar를 비활성화하고 Kafka를 활성화하면 특정 메시징 기본 설정 및 요구 사항에 맞게 배포가 조정됩니다.
2. 포트 포워딩
로컬 컴퓨터에서 Milvus에 액세스하려면 포트 포워딩을 생성하세요: kubectl port-forward svc/my-milvus 27017:19530
.
이 명령은 Milvus 서비스 svc/my-milvus
의 포트 19530
를 로컬 컴퓨터의 동일한 포트에 매핑하여 로컬 도구를 사용하여 Milvus에 연결할 수 있도록 합니다. 로컬 포트를 지정하지 않은 채로 두면( :19530
), K8에서 사용 가능한 포트를 할당하여 동적으로 만듭니다. 이 방법을 선택하는 경우 할당된 로컬 포트를 기억해 두세요.
3. 배포 확인:
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-milvus-datacoord-595b996bd4-zprpd 1/1 Running 0 85m
my-milvus-datanode-d9d555785-47nkt 1/1 Running 0 85m
my-milvus-etcd-0 1/1 Running 0 84m
my-milvus-etcd-1 1/1 Running 0 85m
my-milvus-etcd-2 1/1 Running 0 85m
my-milvus-indexcoord-65bc68968c-6jg6q 1/1 Running 0 85m
my-milvus-indexnode-54586f55d-z9vx4 1/1 Running 0 85m
my-milvus-kafka-0 1/1 Running 0 85m
my-milvus-kafka-1 1/1 Running 0 85m
my-milvus-kafka-2 1/1 Running 0 85m
my-milvus-minio-0 1/1 Running 0 96m
my-milvus-minio-1 1/1 Running 0 96m
my-milvus-minio-2 1/1 Running 0 96m
my-milvus-minio-3 1/1 Running 0 96m
my-milvus-proxy-76bb7d497f-sqwvd 1/1 Running 0 85m
my-milvus-querycoord-6f4c7b7598-b6twj 1/1 Running 0 85m
my-milvus-querynode-677bdf485b-ktc6m 1/1 Running 0 85m
my-milvus-rootcoord-7498fddfd8-v5zw8 1/1 Running 0 85m
my-milvus-zookeeper-0 1/1 Running 0 85m
my-milvus-zookeeper-1 1/1 Running 0 85m
my-milvus-zookeeper-2 1/1 Running 0 85m
위의 출력과 유사한 파드 목록이 표시되어야 하며 모두 실행 중 상태여야 합니다. 이는 Milvus 클러스터가 작동 중임을 나타냅니다. 특히 READY
열 아래에서 1/1을 찾아보세요. 이는 각 파드가 완전히 준비되어 실행 중임을 의미합니다. 실행 중 상태가 아닌 파드가 있는 경우, 성공적인 배포를 위해 추가 조사가 필요할 수 있습니다.
Milvus 클러스터가 배포되고 모든 구성 요소가 실행 중임을 확인했으면 이제 데이터 수집 및 색인 작업을 진행할 준비가 되었습니다. 여기에는 Milvus 인스턴스에 연결하고, 컬렉션을 만들고, 검색 및 검색을 위한 벡터를 삽입하는 작업이 포함됩니다.
데이터 수집 및 인덱싱
Milvus 클러스터에서 데이터 수집 및 색인 작업을 시작하려면 pymilvus SDK를 사용하겠습니다. 두 가지 설치 옵션이 있습니다:
기본 SDK:
pip install pymilvus
서식 있는 텍스트 임베딩 및 고급 모델용:
pip install pymilvus[model]
클러스터에 데이터를 삽입할 때는 pymilvus
를 사용하여 SDK만 설치하거나 pip install pymilvus
또는 리치 텍스트 임베딩을 추출하려는 경우 PyMilvus Models
를 설치하여 pip install pymilvus[model]
를 사용할 수 있습니다.
컬렉션 연결 및 생성하기:
먼저, 앞서 전달한 포트를 사용하여 Milvus 인스턴스에 연결합니다. URI가 K8에서 할당된 로컬 포트와 일치하는지 확인합니다:
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://127.0.0.1:52070",
)
client.create_collection(collection_name="quick_setup", dimension=5)
dimension=5
매개변수는 이 컬렉션의 벡터 크기를 정의하며, 벡터 검색 기능에 필수적입니다.
데이터 삽입
다음은 각 벡터가 항목을 나타내고 색상 필드가 설명 속성을 추가하는 초기 데이터 집합을 삽입하는 방법입니다:
data=[
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},
{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},
{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},
{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},
{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},
{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},
{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},
{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},
{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}
]
res = client.insert(
collection_name="quick_setup",
data=data
)
print(res)
제공된 코드는 빠른 설정 방식으로 컬렉션을 만들었다고 가정합니다. 위 코드에서 볼 수 있듯이,
삽입할 데이터는 사전 목록으로 구성되며, 각 사전은 엔티티라고 하는 데이터 레코드를 나타냅니다.
각 사전에는 색상이라는 스키마에 정의되지 않은 필드가 포함되어 있습니다.
각 사전에는 사전 정의된 필드와 동적 필드에 해당하는 키가 모두 포함되어 있습니다.
더 많은 데이터 삽입
colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = [ {
"id": i,
"vector": [ random.uniform(-1, 1) for _ in range(5) ],
"color": f"{random.choice(colors)}_{str(random.randint(1000, 9999))}"
} for i in range(1000) ]
res = client.insert(
collection_name="quick_setup",
data=data[10:]
)
print(res)
유사성 검색
컬렉션을 채운 후 유사도 검색을 수행하여 쿼리 벡터에 가까운 벡터를 찾을 수 있습니다. 쿼리 벡터 변수의 값은 부동 소수점의 하위 목록이 포함된 목록입니다. 하위 목록은 5차원의 벡터 임베딩을 나타냅니다.
query_vectors = [
[0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648]
]
res = client.search(
collection_name="quick_setup", # target collection
data=query_vectors, # query vectors
limit=3, # number of returned entities
)
print(res)
이 쿼리는 쿼리 벡터와 가장 유사한 상위 3개의 벡터를 검색하여 Milvus의 강력한 검색 기능을 보여줍니다.
K8s에서 Milvus 제거하기
이 튜토리얼을 완료했으면 다음을 사용하여 K8s 클러스터에서 Milvus를 제거하세요:helm uninstall my-milvus
.
이 명령은 my-milvus
릴리스에 배포된 모든 Milvus 구성 요소를 제거하여 클러스터 리소스를 확보합니다.
결론
Kubernetes 클러스터에 Milvus를 배포하면 AI 및 머신 러닝 워크로드를 처리하는 데 있어 벡터 데이터베이스의 확장성과 유연성을 확인할 수 있습니다. 이 튜토리얼을 통해 헬름으로 Milvus를 설정하고, 컬렉션을 생성하고, 데이터 수집 및 유사도 검색을 수행하는 기본 사항을 배웠습니다.
헬름을 사용하여 Kubernetes 클러스터에 Milvus를 설치하는 것은 간단합니다. 더 큰 데이터 세트나 더 집약적인 워크로드를 위해 Milvus 클러스터를 확장하는 방법에 대해 자세히 알아보려면, 저희 문서( https://milvus.io/docs/scaleout.md)에서 자세한 지침을 확인하세요 .
Github에서 코드를 확인하고, Milvus를 살펴보고, 다양한 구성과 사용 사례를 실험해보고, Discord에 참여하여 커뮤니티와 경험을 공유해 보세요.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word