Bonnes pratiques pour ajuster les index ScaNN

Sélectionnez une version de la documentation :

Suivez les bonnes pratiques pour ajuster vos index ScaNN et trouver un équilibre entre le rappel de recherche et les requêtes par seconde (RPS). Les paramètres et les valeurs recommandés varient en fonction du nombre de niveaux de votre index.

Pour savoir comment créer des index ScaNN, consultez Créer un index ScaNN.

Limites

Avant de commencer à ajuster vos index ScaNN, tenez compte de la limite suivante :

  • Le nombre de num_leaves est limité à 30 millions.

Avant de commencer

Si vous souhaitez créer un index ScaNN à quatre niveaux, vous devez d'abord activer la fonctionnalité Preview pour votre instance AlloyDB. Pour activer la fonctionnalité d'aperçu, choisissez l'une des deux méthodes suivantes :

Index arborescent à deux niveaux

Pour appliquer des recommandations qui vous aideront à trouver les valeurs optimales de num_leaves et num_leaves_to_search pour votre ensemble de données, suivez ces étapes recommandées :

  1. Pour créer l'index ScaNN optimisé pour les cas suivants, définissez le paramètre num_leaves sur la valeur suivante, où "rows" correspond au nombre de lignes dans la table indexée :
    • balanced index build time and quality défini sur num_leaves pour sqrt(rows).
    • quality définit num_leaves sur rows/100.
  2. Exécutez vos requêtes de test en augmentant la valeur de scann.num_of_leaves_to_search jusqu'à ce que vous atteigniez la plage de rappel cible (par exemple, 95 %). Pour en savoir plus sur l'analyse de vos requêtes, consultez Analyser vos requêtes.
  3. Notez le ratio entre scann.num_leaves_to_search et num_leaves, qui sera utilisé dans les étapes suivantes. Ce ratio fournit une approximation de l'ensemble de données qui vous aidera à atteindre le rappel cible.

    Si vous travaillez avec des vecteurs de grande dimension (500 dimensions ou plus) et que vous souhaitez améliorer le rappel, essayez d'ajuster la valeur de scann.pre_reordering_num_neighbors. La valeur par défaut est définie sur 50 * K, où K correspond à la limite que vous avez définie dans votre requête.
  4. Si votre RPS est trop faible une fois que vos requêtes ont atteint un rappel cible, procédez comme suit :
    1. Recréez l'index en augmentant la valeur de num_leaves et scann.num_leaves_to_search en suivant les conseils ci-dessous :
      • Définissez num_leaves sur un facteur plus élevé de la racine carrée du nombre de lignes. Par exemple, si l'index a num_leaves défini sur la racine carrée du nombre de lignes, essayez de le définir sur le double de la racine carrée. Si la valeur est déjà double, essayez de la définir sur le triple de la racine carrée.
      • Augmentez scann.num_leaves_to_search si nécessaire pour maintenir son ratio avec num_leaves, que vous avez noté à l'étape 3.
      • Définissez num_leaves sur une valeur inférieure ou égale au nombre de lignes divisé par 100.
    2. Exécutez à nouveau les requêtes de test. Pendant que vous exécutez les requêtes de test, essayez de réduire scann.num_leaves_to_search pour trouver une valeur qui augmente le RPS tout en conservant un rappel élevé. Essayez différentes valeurs de scann.num_leaves_to_search sans reconstruire l'index.
  5. Répétez l'étape 4 jusqu'à ce que la RPS et la plage de rappel aient atteint des valeurs acceptables.

Index arborescent à trois niveaux

En plus des recommandations pour l'index ScaNN de l'arborescence à deux niveaux, suivez les conseils ci-dessous.

Pour appliquer des recommandations afin de trouver la valeur optimale des paramètres d'index num_leaves et max_num_levels, procédez comme suit :

  1. Créez l'index ScaNN avec les combinaisons num_leaves et max_num_levels suivantes en fonction de vos objectifs de performances :

    • Équilibrer la durée de la compilation et la qualité de l'index : définissez max_num_levels sur 2 et num_leaves sur power(rows, ⅔).
    • Optimiser pour la qualité : définissez max_num_levels sur 2 et num_leaves sur rows/100.
  2. Exécutez vos requêtes de test. Pour en savoir plus sur l'analyse des requêtes, consultez Analyser vos requêtes.

  3. Notez le ratio entre scann.num_leaves_to_search et num_leaves, car vous en aurez besoin dans les étapes suivantes. Ce ratio fournit une approximation de l'ensemble de données qui vous aidera à atteindre votre rappel cible.

Si vous travaillez avec des vecteurs de grande dimension (500 dimensions ou plus) et que vous souhaitez améliorer le rappel, essayez d'ajuster la valeur de scann.pre_reordering_num_neighbors. La valeur par défaut est définie sur 50 * K, où K correspond à la limite que vous avez définie dans votre requête.

  1. Si votre RPS est trop faible une fois que vos requêtes ont atteint un rappel cible, procédez comme suit :

    • Recréez l'index en augmentant la valeur de num_leaves et scann.num_leaves_to_search en suivant les conseils ci-dessous :
    • Définissez num_leaves sur un facteur plus élevé de power(rows, ⅔). Par exemple, si l'index est défini sur num_leaves pour power(rows, ⅔), essayez de le définir sur le double de power(rows, ⅔). Si la valeur est déjà le double de power(rows, ⅔), essayez de la définir sur le triple.
    • Augmentez scann.num_leaves_to_search si nécessaire pour maintenir son ratio avec num_leaves, que vous avez noté à l'étape 3.
    • Définissez une valeur inférieure ou égale à rows/100 pour num_leaves.
    • Exécutez à nouveau les requêtes de test. Pendant que vous exécutez les requêtes de test, essayez de réduire scann.num_leaves_to_search pour trouver une valeur qui augmente le RPS tout en conservant un rappel élevé. Essayez différentes valeurs de scann.num_leaves_to_search sans reconstruire l'index.
  2. Répétez l'étape 4 jusqu'à ce que la RPS et la plage de rappel aient atteint des valeurs acceptables.

Index arborescent à quatre niveaux

En plus des recommandations pour les index arborescents à trois niveaux, suivez les conseils ci-dessous pour trouver la valeur optimale pour num_leaves et max_num_levels :

  1. Créez un index ScaNN avec les combinaisons num_leaves et max_num_levels suivantes en fonction de vos objectifs de performances :

    • Équilibrez la durée de la compilation et la qualité de l'index : définissez max_num_levels sur 3 et num_leaves sur power(ROWS, 3/4).

    • Optimiser pour la qualité : définissez max_num_levels sur 3 et num_leaves sur ROWS/100.

  2. Exécutez vos requêtes de test. Pour en savoir plus sur l'analyse des requêtes, consultez Analyser vos requêtes.

  3. Notez le ratio entre scann.num_leaves_to_search et num_leaves. Vous utiliserez ce ratio pour atteindre votre rappel cible lors des étapes suivantes.

    Si vous travaillez avec des vecteurs de grande dimension (500 dimensions ou plus) et que vous souhaitez améliorer le rappel, essayez d'ajuster la valeur de scann.pre_reordering_num_neighbors.

  4. Si vos RPS sont trop faibles après que vos requêtes ont atteint un rappel cible, recréez l'index en augmentant la valeur de num_leaves et scann.num_leaves_to_search en suivant les conseils ci-dessous :

    1. Définissez num_leaves sur un facteur plus élevé de power(ROWS, 3/4). Par exemple, si l'index a num_leaves défini sur power(ROWS, 3/4), essayez de le définir sur le double. Si la valeur est déjà double, essayez de la définir sur triple.

    2. Augmentez scann.num_leaves_to_search si nécessaire pour maintenir son ratio avec num_leaves, que vous avez noté à l'étape 3.

    3. Définissez une valeur inférieure ou égale à ROWS/100 pour num_leaves.

    4. Exécutez à nouveau les requêtes de test. Lorsque vous exécutez les requêtes de test, essayez de réduire scann.num_leaves_to_search. Trouvez une valeur qui augmente le RPS tout en conservant un rappel élevé. Essayez différentes valeurs de scann.num_leaves_to_search sans reconstruire l'index.

  5. Répétez l'étape 4 jusqu'à ce que la plage de rappel et les RPS atteignent des valeurs acceptables.

Améliorer le rappel pour les recherches filtrées

Lorsque vous effectuez une recherche vectorielle des k plus proches voisins (KNN) qui inclut un filtre, il peut arriver que la requête renvoie moins de résultats que ceux demandés dans la clause LIMIT. Cela peut entraîner ce que l'on appelle un rappel insuffisant, qui est plus susceptible de se produire lorsque vous utilisez des filtres très sélectifs. Cela se produit parce que les partitions ou feuilles initiales que ScaNN recherche ne contiennent pas suffisamment de vecteurs répondant aux conditions de filtre.

Pour résoudre ce problème, AlloyDB Omni propose une fonctionnalité qui permet à la recherche de s'étendre de manière dynamique au-delà de l'ensemble initial de feuilles afin de trouver suffisamment de résultats correspondants.

Fonctionnement du streaming

Vous pouvez activer la fonctionnalité de streaming en définissant le paramètre scann.satisfy_limit sur relaxed_order. Lorsqu'il est activé, l'analyse vectorielle continue de rechercher des partitions feuilles supplémentaires jusqu'à ce qu'elle trouve suffisamment de résultats pour répondre au LIMIT de votre requête, ce qui améliore le rappel.

Pour éviter qu'une recherche ne se poursuive trop longtemps et pour contrôler l'impact sur les performances, vous pouvez utiliser le paramètre scann.max_pct_leaves_to_search. Ce paramètre sert de protection en définissant une limite supérieure au pourcentage de feuilles totales qu'une requête peut visiter. La valeur par défaut est 15%.

Quand utiliser le streaming ?

Pensez à utiliser la fonctionnalité de streaming dans les cas suivants :

  • Vous utilisez des filtres avec vos recherches vectorielles.
  • Vous constatez que vos requêtes renvoient moins de résultats que prévu en fonction de votre clause LIMIT.

En activant scann.satisfy_limit, vous pouvez améliorer le rappel de vos recherches filtrées. Il est également recommandé de configurer scann.max_pct_leaves_to_search pour trouver un équilibre entre le rappel et les performances des requêtes.

Maintenance des index

Si votre table est sujette à des mises à jour ou des insertions fréquentes, nous vous recommandons de réindexer périodiquement l'index ScaNN existant afin d'améliorer la précision du rappel. Vous pouvez surveiller les métriques d'index pour afficher les modifications apportées aux distributions ou mutations de vecteurs depuis la création de l'index, puis le réindexer en conséquence. Pour en savoir plus sur les métriques, consultez Afficher les métriques d'index vectoriel.

Étapes suivantes