Compartir a través de


Habilitación y uso de la extensión DiskANN

DiskANN es un algoritmo escalable de búsqueda aproximada de vecinos más cercanos para realizar búsquedas vectoriales eficientemente a cualquier escala. Ofrece una alta recuperación, consultas elevadas por segundo y baja latencia de consulta, incluso para conjuntos de datos de miles de millones de datos. Esas características lo convierten en una herramienta eficaz para controlar grandes volúmenes de datos.

Para obtener más información sobre DiskANN, consulte DiskANN: Búsqueda de vectores para búsqueda de escalado web y recomendación.

La pg_diskann extensión agrega compatibilidad con el uso de DiskANN para la indexación y búsqueda de vectores eficaces.

Habilitar pg_diskann

Para usar la extensión pg_diskann en la instancia de servidor flexible de Azure Database for PostgreSQL, debe permitir la extensión en el nivel de instancia . A continuación, debe crear la extensión en cada base de datos en la que desea usar la funcionalidad proporcionada por la extensión.

Dado que pg_diskann tiene una dependencia de la vector extensión, puede permitir y crear la vector extensión en la misma base de datos y ejecutar el siguiente comando:

CREATE EXTENSION IF NOT EXISTS pg_diskann;

O bien, puede omitir el paso de permitir y crear explícitamente la extensión vector, y ejecutar en su lugar el comando anterior añadiendo la cláusula CASCADE. Esa cláusula PostgreSQL para ejecutar implícitamente CREATE EXTENSION en la extensión que depende. Para ello, ejecute el siguiente comando:

CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;

Para quitar la extensión de la base de datos a la que está conectado actualmente, ejecute el siguiente comando:

DROP EXTENSION IF EXISTS pg_diskann;

Uso del método de acceso al índice diskann

Una vez instalada la extensión, puede crear un índice diskann en una columna de tabla que contenga datos vectoriales. Por ejemplo, para crear un índice en la columna embedding de la tabla demo, use el siguiente comando:

CREATE TABLE demo (
 id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
 embedding public.vector(3)
 -- other columns
);

-- insert dummy data
INSERT INTO demo (embedding) VALUES
('[1.0, 2.0, 3.0]'),
('[4.0, 5.0, 6.0]'),
('[7.0, 8.0, 9.0]');

-- create a diskann index by using Cosine distance operator
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)

Una vez creado el índice, puede ejecutar consultas para encontrar los vecinos más cercanos.

La consulta siguiente busca los 5 vecinos más cercanos al vector [2.0, 3.0, 4.0]:

SELECT id, embedding
FROM demo
ORDER BY embedding <=> '[2.0, 3.0, 4.0]'
LIMIT 5;

Postgres decide automáticamente cuándo usar el índice DiskANN. Si decide no usar el índice en un escenario en el que desea que lo use, ejecute el siguiente comando:

-- Explicit Transcation block to force use for DiskANN index.

BEGIN;
SET LOCAL enable_seqscan TO OFF;
-- Similarity search queries
COMMIT;

Importante

Al configurar enable_seqscan como desactivado, se desanima al planificador a utilizar el plan de escaneo secuencial del planificador de consultas si hay otros métodos disponibles. Dado que se deshabilita mediante el SET LOCAL comando , la configuración solo surte efecto para la transacción actual. Después de un COMMIT o un ROLLBACK, la configuración de nivel de sesión vuelve a surtir efecto. Tenga en cuenta que si la consulta implica otras tablas, la configuración también desaconseja el uso de escaneos secuenciales en todas ellas.

Escalado eficaz con cuantificación (versión preliminar)

DiskANN usa la cuantificación de productos (PQ) para reducir drásticamente la superficie de memoria de los vectores. A diferencia de otras técnicas de cuantificación, el algoritmo PQ puede comprimir vectores de forma más eficaz, lo que mejora significativamente el rendimiento.  DiskANN con PQ puede mantener más datos en memoria, lo que reduce la necesidad de acceder al almacenamiento más lento, así como usar menos proceso al comparar vectores comprimidos. Esto da como resultado un mejor rendimiento y ahorros de costos significativos al trabajar con grandes cantidades de datos (> 1 millón de filas)

Para obtener acceso a la característica de cuantificación de productos (PQ), regístrese para obtener la versión preliminar.

Aceleración de la compilación de índices

Hay varias maneras de mejorar los tiempos de compilación del índice.

Uso de más memoria

Para acelerar la creación del índice, puede aumentar la memoria asignada en la instancia de Postgres para la compilación del índice. El uso de memoria se puede especificar mediante el maintenance_work_mem parámetro .

-- Set the parameters
SET maintenance_work_mem = '8GB'; -- Depending on your resources

A continuación, el CREATE INDEX comando usa la memoria de trabajo especificada, en función de los recursos disponibles, para compilar el índice.

CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)

Sugerencia

Puede escalar verticalmente los recursos de memoria durante la compilación de índices para mejorar la velocidad de indexación y, a continuación, reducir verticalmente cuando se complete la indexación.

Uso de la paralelización

Para acelerar la creación del índice, puede usar trabajos paralelos. El número de trabajadores se puede especificar mediante el parallel_workers parámetro de almacenamiento de la CREATE TABLE instrucción al crear la tabla. Y se puede ajustar más adelante mediante la cláusula SET de la instrucción ALTER TABLE.

CREATE TABLE demo (
	id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
	embedding public.vector(3)
) WITH (parallel_workers = 4);
ALTER TABLE demo SET (parallel_workers = 8);

A continuación, el CREATE INDEX comando usa el número especificado de trabajos paralelos, según los recursos disponibles, para compilar el índice.

CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)

Importante

El proceso líder no puede participar en compilaciones de índices paralelos.

Si desea crear el índice utilizando trabajadores paralelos, también debe establecer los parámetros max_parallel_workers, max_worker_processes y max_parallel_maintenance_workers en consecuencia. Para obtener más información sobre estos parámetros, consulte parámetros que controlan los usos de recursos y el comportamiento asincrónico.

Puede establecer estos parámetros en diferentes niveles de granularidad. Por ejemplo, para establecerlos en el nivel de sesión, puede ejecutar las siguientes instrucciones:

-- Set the parameters
SET max_parallel_workers = 8;
SET max_worker_processes = 8; -- Note: Requires server restart
SET max_parallel_maintenance_workers = 4;

Para más información sobre otras opciones para configurar estos parámetros en el servidor flexible de Azure Database for PostgreSQL, consulte Configuración de parámetros de servidor.

Nota:

El parámetro max_worker_processes requiere que un reinicio del servidor surta efecto.

Si la configuración de esos parámetros y los recursos disponibles en el servidor no permiten iniciar los trabajos paralelos, PostgreSQL retrocede automáticamente para crear el índice en el modo no paralelo.

Parámetros de configuración

Al crear un diskann índice, puede especificar varios parámetros para controlar su comportamiento.

Parámetros de índice

  • max_neighbors: número máximo de bordes por nodo en el gráfico (el valor predeterminado es 32). Un valor más alto puede mejorar el recuerdo hasta cierto punto.
  • l_value_ib: tamaño de la lista de búsqueda durante la compilación del índice (el valor predeterminado es 100). Un valor mayor hace que la compilación sea más lenta, pero el índice sería de mayor calidad.
  • pq_param_num_chunks: número de fragmentos para la cuantificación de productos (el valor predeterminado es 0). 0 significa que se determina automáticamente, en función de las dimensiones de inserción. Se recomienda usar 1/3 de las dimensiones de inserción originales.
  • pq_param_training_samples: número de vectores para entrenar la tabla de pivote PQ (predeterminados a 0). 0 significa que se determina automáticamente, en función del tamaño de la tabla.
CREATE INDEX demo_embedding_diskann_custom_idx ON demo USING diskann (embedding vector_cosine_ops)
WITH (
 max_neighbors = 48,
 l_value_ib = 100,
 pq_param_num_chunks = 0,
 pq_param_training_samples = 0
 );

Parámetros de extensión

  • diskann.iterative_search: controla el comportamiento de búsqueda.

    Configuraciones para diskann.iterative_search:

    • relaxed_order (valor predeterminado): permite que Diskann busque iterativamente en el gráfico en lotes de diskann.l_value_is, hasta que se obtenga el número deseado de tuplas, posiblemente limitado por la cláusula LIMIT. Puede hacer que los resultados queden desordenados.

    • strict_order: similar a relaxed_order, permite que diskann busque iterativamente el gráfico hasta que se produzca el número deseado de tuplas. Sin embargo, garantiza que los resultados se devuelven en orden estricto ordenado por distancia.

    • off: Usa la funcionalidad de búsqueda no iterativo, lo que significa que intenta capturar diskann.l_value_is tuplas en un paso. La búsqueda no iterativa solo puede devolver un máximo de diskann.l_value_is vectores para una consulta, independientemente de la cláusula LIMIT o del número de tuplas que coincidan con la consulta.

    Para cambiar el comportamiento de búsqueda a strict_order, para todas las consultas ejecutadas en la sesión actual, ejecute la siguiente instrucción:

    SET diskann.iterative_search TO 'strict_order';
    

    Para cambiarlo para que solo afecte a todas las consultas ejecutadas en la transacción actual, ejecute la siguiente instrucción:

    BEGIN;
    SET LOCAL diskann.iterative_search TO 'strict_order';
    -- All your queries
    COMMIT;
    
  • diskann.l_value_is: valor L para el examen de índices (el valor predeterminado es 100). Aumentar el valor mejora la recuperación, pero puede ralentizar las consultas.

    Para cambiar el valor L del examen de índices a 20, para todas las consultas ejecutadas en la sesión actual, ejecute la siguiente instrucción:

    SET diskann.l_value_is TO 20;
    

    Para cambiarlo para que solo afecte a todas las consultas ejecutadas en la transacción actual, ejecute la siguiente instrucción:

    BEGIN;
    SET LOCAL diskann.l_value_is TO 20;
    -- All your queries
    COMMIT;
    
Tamaño del conjunto de datos (filas) Tipo de parámetro Nombre Valor recomendado
<1 M Compilación de índices l_value_ib 100
<1 M Compilación de índices max_neighbors 32
<1 M Hora de consulta diskann.l_value_is 100
 
1M-50M Compilación de índices l_value_ib 100
1M-50M Compilación de índices max_neighbors 64
1M-50M Hora de consulta diskann.l_value_is 100
 
>50 M Compilación de índices l_value_ib 100
>50 M Compilación de índices max_neighbors 96
>50 M Hora de consulta diskann.l_value_is 100

Nota:

Estos parámetros pueden variar en función del conjunto de datos y el caso de uso específicos. Es posible que los usuarios tengan que experimentar con valores de parámetro diferentes para encontrar la configuración óptima para su escenario concreto.

PROGRESO DE CREATE INDEX y REINDEX

Con PostgreSQL 12 y versiones posteriores, puede usar pg_stat_progress_create_index para comprobar el progreso de las operaciones CREATE INDEX o REINDEX.

SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;

Para obtener más información sobre las posibles fases por las que pasa una operación CREATE INDEX o REINDEX, consulte fases CREATE INDEX.

Selección de la función de acceso al índice

El tipo de vector permite realizar tres tipos de búsquedas en los vectores almacenados. Debe seleccionar la función de acceso correcta para el índice para que la base de datos pueda considerar el índice al ejecutar las consultas.

pg_diskann admite los siguientes operadores de distancia

  • vector_l2_ops: distancia euclidiana <->
  • vector_cosine_ops: distancia de coseno <=>
  • vector_ip_ops:<#> Producto interno

Solución de problemas

Error: : assertion left == right failed left: 40 right: 0

  • DiskANN GA versión, v0.6.x presenta cambios importantes en el formato de metadatos del índice. Los índices creados con v0.5.x no son compatibles hacia adelante con las operaciones de inserción de v0.6.x. Si se intenta insertar en una tabla con un índice obsoleto, se producirá un error, incluso si el índice aparece válido.

  • Cuando encuentre este error, puede resolverlo:

    • Opción 1: Ejecución de la instrucción REINDEX o REDINDEX CONCURRENTLY en el índice.

    • Opción 2: Recompilación del índice

      DROP INDEX your_index_name;
      CREATE INDEX your_index_name ON your_table USING diskann(your_vector_column vector_cosine_ops);
      
      

Error: : diskann index needs to be upgraded to version 2...

  • Cuando encuentre este error, puede resolverlo:
    • Opción 1: Ejecutar REINDEX o REDINDEX CONCURRENTLY instrucción en el índice.

    • Opción 2: Dado que REINDEX puede tardar mucho tiempo, la extensión también proporciona una función definida por el usuario denominada upgrade_diskann_index(), que actualiza el índice más rápido, siempre que sea posible.

      Para actualizar el índice, ejecute la siguiente instrucción:

      SELECT upgrade_diskann_index('demo_embedding_diskann_custom_idx');
      

      Para actualizar todos los índices diskann de la base de datos a la versión actual, ejecute la instrucción siguiente:

      SELECT upgrade_diskann_index(pg_class.oid)
      FROM pg_class
      JOIN pg_am ON (pg_class.relam = pg_am.oid)
      WHERE pg_am.amname = 'diskann';