Pruebe e implante rápidamente soluciones de búsqueda vectorial con el Milvus 2.0 Bootcamp
Con el lanzamiento de Milvus 2.0, el equipo ha renovado el Milvus bootcamp. El nuevo y mejorado bootcamp ofrece guías actualizadas y ejemplos de código más fáciles de seguir para una variedad de casos de uso e implementaciones. Además, esta nueva versión está actualizada para Milvus 2.0, una versión reimaginada de la base de datos vectorial más avanzada del mundo.
Pruebas de estrés de su sistema con conjuntos de datos de referencia de 1M y 100M
El directorio de pruebas comparativas contiene pruebas comparativas de vectores de 1 millón y 100 millones que indican cómo reaccionará su sistema ante conjuntos de datos de diferentes tamaños.
Explore y cree soluciones populares de búsqueda de similitud vectorial
El directorio de soluciones incluye los casos de uso más populares de búsqueda de similitud vectorial. Cada caso de uso contiene una solución de bloc de notas y una solución desplegable en Docker. Los casos de uso incluyen:
- Búsqueda de similitud de imágenes
- Búsqueda de similitudes en vídeo
- Búsqueda de similitudes de audio
- Sistema de recomendación
- Búsqueda molecular
- Sistema de respuesta a preguntas
Despliegue rápido de aplicaciones completas en cualquier sistema
Las soluciones de despliegue rápido son soluciones dockerizadas que permiten a los usuarios desplegar aplicaciones completamente construidas en cualquier sistema. Estas soluciones son ideales para demostraciones breves, pero requieren un trabajo adicional de personalización y comprensión en comparación con los blocs de notas.
Utilice cuadernos de escenarios específicos para desplegar fácilmente aplicaciones preconfiguradas.
Los cuadernos contienen un ejemplo sencillo de despliegue de Milvus para resolver el problema en un caso de uso determinado. Cada uno de los ejemplos puede ejecutarse de principio a fin sin necesidad de gestionar archivos o configuraciones. Además, cada cuaderno es fácil de seguir y modificable, lo que los convierte en archivos base ideales para otros proyectos.
Ejemplo de cuaderno de búsqueda de similitud de imágenes
La búsqueda por similitud de imágenes es una de las ideas centrales que subyacen a muchas tecnologías diferentes, incluidos los coches autónomos que reconocen objetos. Este ejemplo explica cómo construir fácilmente programas de visión por ordenador con Milvus.
Este cuaderno gira en torno a tres cosas:
- Servidor Milvus
- Servidor Redis (para almacenamiento de metadatos)
- Modelo preentrenado Resnet-18.
Paso 1: Descargar los paquetes necesarios
Comience descargando todos los paquetes necesarios para este proyecto. Este cuaderno incluye una tabla con la lista de paquetes a utilizar.
pip install -r requirements.txt
Paso 2: Arranque del servidor
Una vez instalados los paquetes, inicie los servidores y asegúrese de que ambos funcionan correctamente. Asegúrese de seguir las instrucciones correctas para iniciar los servidores Milvus y Redis.
Paso 3: Descargar datos del proyecto
Por defecto, este cuaderno extrae un fragmento de los datos de VOCImage para utilizarlo como ejemplo, pero cualquier directorio con imágenes debería funcionar siempre que siga la estructura de archivos que puede verse en la parte superior del cuaderno.
! gdown "https://drive.google.com/u/1/uc?id=1jdudBiUu41kL-U5lhH3ari_WBRXyedWo&export=download"
! tar -xf 'VOCdevkit.zip'
! rm 'VOCdevkit.zip'
Paso 4: Conectarse a los servidores
En este ejemplo, los servidores se ejecutan en los puertos por defecto en el localhost.
connections.connect(host="127.0.0.1", port=19537)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)
Paso 5: Crear una colección
Después de iniciar los servidores, cree una colección en Milvus para almacenar todos los vectores. En este ejemplo, el tamaño de dimensión se establece en 512, el tamaño de la salida de resnet-18, y la métrica de similitud se establece en la distancia euclidiana (L2). Milvus soporta una variedad de métricas de similitud diferentes.
collection_name = "image_similarity_search"
dim = 512
default_fields = [
schema.FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
schema.FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
default_schema = schema.CollectionSchema(fields=default_fields, description="Image test collection")
collection = Collection(name=collection_name, schema=default_schema)
Paso 6: Construir un índice para la colección
Una vez hecha la colección, construya un índice para ella. En este caso, se utiliza el índice IVF_SQ8. Este índice requiere el parámetro 'nlist', que le dice a Milvus cuántos clusters hacer dentro de cada archivo de datos (segmento). Diferentes índices requieren diferentes parámetros.
default_index = {"index_type": "IVF_SQ8", "params": {"nlist": 2048}, "metric_type": "L2"}
collection.create_index(field_name="vector", index_params=default_index)
collection.load()
Paso 7: Configurar el modelo y el cargador de datos
Una vez construido el índice IVF_SQ8, configure la red neuronal y el cargador de datos. La red neuronal preentrenada pytorch resnet-18 utilizada en este ejemplo carece de su última capa, que comprime los vectores para la clasificación y puede perder información valiosa.
model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))
Es necesario modificar el conjunto de datos y el cargador de datos para que sean capaces de preprocesar y procesar por lotes las imágenes y, al mismo tiempo, proporcionar las rutas de los archivos de las imágenes. Esto puede hacerse con un cargador de datos Torchvision ligeramente modificado. Para el preprocesamiento, las imágenes deben ser recortadas y normalizadas debido a que el modelo resnet-18 ha sido entrenado en un tamaño y rango de valores específicos.
dataset = ImageFolderWithPaths(data_dir, transform=transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]))
dataloader = torch.utils.data.DataLoader(dataset, num_workers=0, batch_si
Paso 8: Insertar vectores en la colección
Una vez configurada la colección, las imágenes pueden procesarse y cargarse en la colección creada. En primer lugar, el cargador de datos extrae las imágenes y las ejecuta a través del modelo resnet-18. Los vectores resultantes se incrustan en la colección. Los vectores resultantes se insertan en Milvus, que devuelve un ID único para cada vector. A continuación, los ID de los vectores y las rutas de los archivos de imagen se insertan como pares clave-valor en el servidor Redis.
steps = len(dataloader)
step = 0
for inputs, labels, paths in dataloader:
with torch.no_grad():
output = encoder(inputs).squeeze()
output = output.numpy()
mr = collection.insert([output.tolist()])
ids = mr.primary_keys
for x in range(len(ids)):
red.set(str(ids[x]), paths[x])
if step%5 == 0:
print("Insert Step: " + str(step) + "/" + str(steps))
step += 1
Paso 9: Realizar una búsqueda de similitud de vectores
Una vez insertados todos los datos en Milvus y Redis, se puede realizar la búsqueda de similitud de vectores. En este ejemplo, se extraen del servidor Redis tres imágenes seleccionadas al azar para realizar una búsqueda de similitud vectorial.
random_ids = [int(red.randomkey()) for x in range(3)]
search_images = [x.decode("utf-8") for x in red.mget(random_ids)]
Estas imágenes pasan primero por el mismo preprocesamiento que se encuentra en el Paso 7 y luego son empujadas a través del modelo resnet-18.
transform_ops = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])
embeddings = [transform_ops(Image.open(x)) for x in search_images]
embeddings = torch.stack(embeddings, dim=0)
with torch.no_grad():
embeddings = encoder(embeddings).squeeze().numpy()
A continuación, las incrustaciones vectoriales resultantes se utilizan para realizar una búsqueda. Primero, establezca los parámetros de búsqueda, incluyendo el nombre de la colección a buscar, nprobe (el número de clusters a buscar), y top_k (el número de vectores devueltos). En este ejemplo, la búsqueda debería ser muy rápida.
search_params = {"metric_type": "L2", "params": {"nprobe": 32}}
start = time.time()
results = collection.search(embeddings, "vector", param=search_params, limit=3, expr=None)
end = time.time() - start
Paso 10: Resultados de la búsqueda de imágenes
Los ID de los vectores devueltos por las consultas se utilizan para encontrar las imágenes correspondientes. A continuación, se utiliza Matplotlib para mostrar los resultados de la búsqueda de imágenes.
pic1.png
pic2.png
pic3.png
Aprenda a desplegar Milvus en diferentes entornos
La sección de despliegue del nuevo bootcamp contiene toda la información para utilizar Milvus en diferentes entornos y configuraciones. Incluye el despliegue de Mishards, el uso de Kubernetes con Milvus, el balanceo de carga y más. Cada entorno tiene una guía detallada paso a paso que explica cómo hacer que Milvus funcione en él.
No sea un extraño
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word