🚀 Essayez Zilliz Cloud, la version entièrement gérée de Milvus, gratuitement—découvrez des performances 10x plus rapides ! Essayez maintenant>>

milvus-logo
LFAI
  • Home
  • Blog
  • Tester et déployer rapidement des solutions de recherche vectorielle avec le Bootcamp Milvus 2.0

Tester et déployer rapidement des solutions de recherche vectorielle avec le Bootcamp Milvus 2.0

  • Engineering
July 15, 2021
milvus

Avec la sortie de Milvus 2.0, l'équipe a réorganisé le camp d'entraînement Milvus. Le nouveau bootcamp amélioré propose des guides mis à jour et des exemples de code plus faciles à suivre pour une variété de cas d'utilisation et de déploiements. En outre, cette nouvelle version est mise à jour pour Milvus 2.0, une version réimaginée de la base de données vectorielles la plus avancée au monde.

Testez votre système contre des ensembles de données de référence de 1M et 100M

Le répertoire de référence contient des tests de référence de 1 million et 100 millions de vecteurs qui indiquent comment votre système réagira à des ensembles de données de tailles différentes.


Le répertoire des solutions comprend les cas d'utilisation les plus populaires en matière de recherche de similarités vectorielles. Chaque cas d'utilisation contient une solution notebook et une solution déployable sur docker. Les cas d'utilisation incluent :


Déployer rapidement une application complète sur n'importe quel système

Les solutions de déploiement rapide sont des solutions dockerisées qui permettent aux utilisateurs de déployer des applications entièrement construites sur n'importe quel système. Ces solutions sont idéales pour de brèves démonstrations, mais nécessitent un travail supplémentaire de personnalisation et de compréhension par rapport aux notebooks.


Utiliser des notebooks spécifiques à un scénario pour déployer facilement des applications préconfigurées

Les carnets contiennent un exemple simple de déploiement de Milvus pour résoudre le problème dans un cas d'utilisation donné. Chacun des exemples peut être exécuté du début à la fin sans qu'il soit nécessaire de gérer des fichiers ou des configurations. Chaque notebook est également facile à suivre et modifiable, ce qui en fait des fichiers de base idéaux pour d'autres projets.


Exemple de cahier de recherche de similarités d'images

La recherche de similitudes d'images est l'une des idées fondamentales qui sous-tendent de nombreuses technologies, notamment la reconnaissance d'objets par les voitures autonomes. Cet exemple explique comment construire facilement des programmes de vision artificielle avec Milvus.

Ce bloc-notes s'articule autour de trois éléments :

  • le serveur Milvus
  • Serveur Redis (pour le stockage des métadonnées)
  • Le modèle Resnet-18 pré-entraîné.

Étape 1 : Télécharger les paquets nécessaires

Commencez par télécharger tous les paquets nécessaires à ce projet. Ce carnet comprend un tableau listant les paquets à utiliser.

pip install -r requirements.txt

Étape 2 : Démarrage du serveur

Une fois les paquets installés, démarrez les serveurs et assurez-vous qu'ils fonctionnent correctement. Veillez à suivre les instructions correctes pour le démarrage des serveurs Milvus et Redis.

Étape 3 : Téléchargement des données du projet

Par défaut, ce bloc-notes extrait un extrait des données VOCImage pour l'utiliser comme exemple, mais n'importe quel répertoire contenant des images devrait fonctionner tant qu'il suit la structure de fichier visible en haut du bloc-notes.

! gdown "https://drive.google.com/u/1/uc?id=1jdudBiUu41kL-U5lhH3ari_WBRXyedWo&export=download"
! tar -xf 'VOCdevkit.zip'
! rm 'VOCdevkit.zip'

Étape 4 : Connexion aux serveurs

Dans cet exemple, les serveurs fonctionnent sur les ports par défaut de l'hôte local.

connections.connect(host="127.0.0.1", port=19537)
red = redis.Redis(host = '127.0.0.1', port=6379, db=0)

Étape 5 : Créer une collection

Après avoir démarré les serveurs, créez une collection dans Milvus pour stocker tous les vecteurs. Dans cet exemple, la taille des dimensions est fixée à 512, soit la taille de la sortie resnet-18, et la métrique de similarité est fixée à la distance euclidienne (L2). Milvus prend en charge un grand nombre de métriques de similarité différentes.

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)

Étape 6 : Création d'un index pour la collection

Une fois la collection constituée, créez un index pour celle-ci. Dans ce cas, l'index IVF_SQ8 est utilisé. Cet index nécessite le paramètre 'nlist', qui indique à Milvus le nombre de clusters à créer dans chaque fichier de données (segment). Différents indices nécessitent différents paramètres.

default_index = {"index_type": "IVF_SQ8", "params": {"nlist": 2048}, "metric_type": "L2"}
collection.create_index(field_name="vector", index_params=default_index)
collection.load()

Étape 7 : configuration du modèle et du chargeur de données

Une fois l'indice IVF_SQ8 construit, configurez le réseau neuronal et le chargeur de données. Le réseau neuronal pytorch resnet-18 pré-entraîné utilisé dans cet exemple est dépourvu de sa dernière couche, qui compresse les vecteurs pour la classification et peut perdre des informations précieuses.

model = torch.hub.load('pytorch/vision:v0.9.0', 'resnet18', pretrained=True)
encoder = torch.nn.Sequential(*(list(model.children())[:-1]))

L'ensemble de données et le chargeur de données doivent être modifiés de manière à pouvoir prétraiter et mettre en lots les images tout en fournissant les chemins d'accès aux fichiers des images. Cela peut être fait avec un chargeur de données torchvision légèrement modifié. Pour le prétraitement, les images doivent être recadrées et normalisées car le modèle resnet-18 a été entraîné sur une taille et une plage de valeurs spécifiques.

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

Étape 8 : Insérer des vecteurs dans la collection

Une fois la collection configurée, les images peuvent être traitées et chargées dans la collection créée. Les images sont d'abord extraites par le dataloader et traitées par le modèle resnet-18. Les encastrements vectoriels résultants sont ensuite insérés dans Milvus, qui renvoie un identifiant unique pour chaque vecteur. Les ID des vecteurs et les chemins d'accès aux fichiers d'images sont ensuite insérés sous forme de paires clé-valeur dans le serveur 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

Une fois toutes les données insérées dans Milvus et Redis, la recherche de similarité vectorielle proprement dite peut être effectuée. Pour cet exemple, trois images sélectionnées au hasard sont extraites du serveur Redis pour une recherche de similarité vectorielle.

random_ids = [int(red.randomkey()) for x in range(3)]
search_images = [x.decode("utf-8") for x in red.mget(random_ids)]

Ces images subissent d'abord le même prétraitement qu'à l'étape 7 et sont ensuite passées par le modèle 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()

Les vecteurs intégrés qui en résultent sont ensuite utilisés pour effectuer une recherche. Tout d'abord, définissez les paramètres de recherche, y compris le nom de la collection à rechercher, nprobe (le nombre de grappes à rechercher) et top_k (le nombre de vecteurs renvoyés). Dans cet exemple, la recherche devrait être très rapide.

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

Étape 10 : Résultats de la recherche d'images

Les ID des vecteurs renvoyés par les requêtes sont utilisés pour trouver les images correspondantes. Matplotlib est ensuite utilisé pour afficher les résultats de la recherche d'images.

pic1.png pic1.png pic2.pngpic2.png pic3.pngpic3.png


Apprendre à déployer Milvus dans différents environnements

La section sur les déploiements du nouveau bootcamp contient toutes les informations nécessaires à l'utilisation de Milvus dans différents environnements et configurations. Elle inclut le déploiement de Mishards, l'utilisation de Kubernetes avec Milvus, l'équilibrage de charge, et plus encore. Chaque environnement est accompagné d'un guide détaillé, étape par étape, expliquant comment faire fonctionner Milvus.


Ne soyez pas un étranger

  • Lisez notre blog.
  • Interagissez avec notre communauté open-source sur Slack.
  • Utilisez ou contribuez à Milvus, la base de données vectorielle la plus populaire au monde, sur Github.

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    Continuer à Lire