Milvus와 FiftyOne으로 비전 검색 수행하기
FiftyOne은 고품질 데이터 세트와 컴퓨터 비전 모델을 구축하기 위한 오픈 소스 도구입니다. 이 가이드는 Milvus의 유사도 검색 기능을 FiftyOne에 통합하여 자체 데이터 세트에서 비전 검색을 수행할 수 있도록 도와줍니다.
FiftyOne은 Python에서 프로그래밍 방식으로 또는 앱에서 포인트 앤 클릭을 통해 Milvus 컬렉션을 생성하고, 벡터를 업로드하고, 유사도 쿼리를 실행할 수 있는 API를 제공합니다. 이 페이지의 데모는 프로그래밍 방식의 통합에 중점을 두고 있습니다.
전제 조건
시작하기 전에 다음이 준비되어 있는지 확인하세요:
설치 요구 사항
이 예제에서는 pymilvus
및 fiftyone
을 사용하겠습니다. 다음 명령을 실행하여 설치할 수 있습니다:
python3 -m pip install pymilvus fiftyone torch torchvision
기본 레시피
Milvus를 사용하여 FiftyOne 데이터 세트에 유사성 인덱스를 생성하고 이를 사용하여 데이터를 쿼리하는 기본 워크플로는 다음과 같습니다:
- 데이터 세트를 FiftyOne에 로드합니다.
- 데이터 세트의 샘플 또는 패치에 대한 벡터 임베딩을 계산하거나 임베딩 생성에 사용할 모델을 선택합니다.
- 밀버스 임베딩을 생성하려면
compute_similarity()
매개변수backend="milvus"
를 설정하고 원하는brain_key
을 지정하여 데이터 세트의 샘플 또는 개체 패치에 대한 Milvus 유사성 지수를 생성합니다. - 이 Milvus 유사성 인덱스를 사용하여 데이터를 쿼리할 때
sort_by_similarity()
. - 원하는 경우 인덱스를 삭제합니다.
절차
아래 예는 위의 워크플로우를 보여줍니다.
1. FiftyOne에 데이터 세트를 로드하고 샘플에 대한 임베딩을 계산합니다.
다음 코드는 FiftyOne에서 제공하는 샘플 이미지 세트를 사용하여 통합을 시연합니다. 이 문서를 참조하여 자신만의 이미지 세트를 준비할 수 있습니다.
import fiftyone as fo
import fiftyone.brain as fob
import fiftyone.zoo as foz
# Step 1: Load your data into FiftyOne
dataset = foz.load_zoo_dataset("quickstart")
# Steps 2 and 3: Compute embeddings and create a similarity index
milvus_index = fob.compute_similarity(
dataset,
brain_key="milvus_index",
backend="milvus",
)
2. 비전 유사도 검색 수행
이제 Milvus 유사성 지수를 사용하여 데이터 세트에서 비전 유사성 검색을 수행할 수 있습니다.
# Step 4: Query your data
query = dataset.first().id # query by sample ID
view = dataset.sort_by_similarity(
query,
brain_key="milvus_index",
k=10, # limit to 10 most similar samples
)
# Step 5 (optional): Cleanup
# Delete the Milvus collection
milvus_index.cleanup()
# Delete run record from FiftyOne
dataset.delete_brain_run("milvus_index")
3. 인덱스 삭제하기
Milvus 유사도 인덱스가 더 이상 필요하지 않은 경우 다음 코드를 사용하여 삭제할 수 있습니다:
# Step 5: Delete the index
milvus_index.delete()
Milvus 백엔드 사용
기본적으로 compute_similarity()
또는 sort_by_similarity()
을 호출하면 스클레인 백엔드가 사용됩니다.
Milvus 백엔드를 사용하려면 선택적 백엔드 매개변수인 compute_similarity()
를 "milvus"
로 설정하면 됩니다:
import fiftyone.brain as fob
fob.compute_similarity(..., backend="milvus", ...)
또는 다음 환경 변수를 설정하여 Milvus 백엔드를 사용하도록 FiftyOne을 영구적으로 구성할 수 있습니다:
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
또는 ~/.fiftyone/brain_config.json
에 위치한 뇌 구성의 default_similarity_backend
파라미터를 설정하여 설정할 수 있습니다:
{
"default_similarity_backend": "milvus"
}
인증
사용자 지정 Milvus 서버를 사용하는 경우 다양한 방법으로 자격 증명을 제공할 수 있습니다.
환경 변수(권장)
Milvus 자격 증명을 구성하는 권장 방법은 아래 표시된 환경 변수에 저장하는 것이며, 이 변수는 Milvus에 연결될 때마다 FiftyOne에서 자동으로 액세스합니다.
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX
# also available if necessary
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX
피프티원 브레인 설정
~/.fiftyone/brain_config.json
에 위치한 뇌 구성에 자격 증명을 저장할 수도 있습니다:
{
"similarity_backends": {
"milvus": {
"uri": "XXXXXX",
"user": "XXXXXX",
"password": "XXXXXX",
# also available if necessary
"secure": true,
"token": "XXXXXX",
"db_name": "XXXXXX",
"client_key_path": "XXXXXX",
"client_pem_path": "XXXXXX",
"ca_pem_path": "XXXXXX",
"server_pem_path": "XXXXXX",
"server_name": "XXXXXX"
}
}
}
이 파일은 생성할 때까지 존재하지 않는다는 점에 유의하세요.
키워드 인수
다음과 같은 메서드를 호출할 때마다 Milvus 자격 증명을 키워드 인자로 수동으로 제공할 수 있습니다. compute_similarity()
와 같은 메서드를 호출할 때마다 키워드 인자로 Milvus 자격 증명을 수동으로 제공할 수 있습니다:
import fiftyone.brain as fob
milvus_index = fob.compute_similarity(
...
backend="milvus",
brain_key="milvus_index",
uri="XXXXXX",
user="XXXXXX",
password="XXXXXX",
# also available if necessary
secure=True,
token="XXXXXX",
db_name="XXXXXX",
client_key_path="XXXXXX",
client_pem_path="XXXXXX",
ca_pem_path="XXXXXX",
server_pem_path="XXXXXX",
server_name="XXXXXX",
)
이 전략을 사용하는 경우 나중에 인덱스를 로드할 때 다음을 통해 자격 증명을 수동으로 제공해야 합니다. load_brain_results()
:
milvus_index = dataset.load_brain_results(
"milvus_index",
uri="XXXXXX",
user="XXXXXX",
password="XXXXXX",
# also available if necessary
secure=True,
token="XXXXXX",
db_name="XXXXXX",
client_key_path="XXXXXX",
client_pem_path="XXXXXX",
ca_pem_path="XXXXXX",
server_pem_path="XXXXXX",
server_name="XXXXXX",
)
Milvus 구성 매개변수
Milvus 백엔드는 유사도 쿼리를 사용자 정의하는 데 사용할 수 있는 다양한 쿼리 매개변수를 지원합니다. 이러한 매개변수는 다음과 같습니다:
collection_name(없음): 사용하거나 생성할 Milvus 컬렉션의 이름입니다. 아무것도 제공되지 않으면 새 컬렉션이 생성됩니다.
metric ("dotproduct"): 새 인덱스를 생성할 때 사용할 임베딩 거리 메트릭입니다. 지원되는 값은 (
"dotproduct"
,"euclidean"
)일관성_레벨 ("세션"): 사용할 일관성 수준입니다. 지원되는 값은 (
"Strong"
,"Session"
,"Bounded"
,"Eventually"
)입니다.
이러한 매개변수에 대한 자세한 내용은 Milvus 인증 문서 및 Milvus 일관성 수준 문서를 참조하세요.
이전 섹션에서 설명한 전략 중 하나를 통해 이러한 매개변수를 지정할 수 있습니다. 다음은 사용 가능한 모든 파라미터를 포함하는 브레인 구성의 예입니다:
{
"similarity_backends": {
"milvus": {
"collection_name": "your_collection",
"metric": "dotproduct",
"consistency_level": "Strong"
}
}
}
그러나 일반적으로 이러한 매개 변수는 compute_similarity()
에 직접 전달하여 특정 새 인덱스를 구성합니다:
milvus_index = fob.compute_similarity(
...
backend="milvus",
brain_key="milvus_index",
collection_name="your_collection",
metric="dotproduct",
consistency_level="Strong",
)
브레인 런 관리
FiftyOne은 브레인 런을 관리하는 데 사용할 수 있는 다양한 방법을 제공합니다.
예를 들어 list_brain_runs()
를 호출하여 데이터 세트에서 사용 가능한 브레인 키를 확인할 수 있습니다:
import fiftyone.brain as fob
# List all brain runs
dataset.list_brain_runs()
# Only list similarity runs
dataset.list_brain_runs(type=fob.Similarity)
# Only list specific similarity runs
dataset.list_brain_runs(
type=fob.Similarity,
patches_field="ground_truth",
supports_prompts=True,
)
또는 get_brain_info()
를 사용하여 브레인 런의 구성에 대한 정보를 검색할 수 있습니다:
info = dataset.get_brain_info(brain_key)
print(info)
사용 load_brain_results()
를 사용하여 SimilarityIndex
인스턴스를 로드할 때 사용합니다.
다음을 사용할 수 있습니다. rename_brain_run()
을 사용하여 기존 유사도 결과 실행과 연결된 브레인 키의 이름을 바꿀 수 있습니다:
dataset.rename_brain_run(brain_key, new_brain_key)
마지막으로 delete_brain_run()
을 사용하여 브레인 런을 삭제할 수 있습니다:
dataset.delete_brain_run(brain_key)
호출 delete_brain_run()
을 호출하면 FiftyOne 데이터 세트에서 브레인 런의 레코드만 삭제되며, 연결된 Milvus 컬렉션은 삭제되지 않으며, 다음과 같이 할 수 있습니다:
# Delete the Milvus collection
milvus_index = dataset.load_brain_results(brain_key)
milvus_index.cleanup()
Milvus 백엔드를 사용하는 FiftyOne 데이터 세트의 일반적인 벡터 검색 워크플로에 대해서는 여기에서 예제를 참조하세요.