Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

conjunto de datos LAION 5B

Introducción

El conjunto de datos LAION 5b contiene 5,85 mil millones de embeddings de imagen y texto, además de los metadatos de imagen asociados. Los embeddings se generaron con el modelo Open AI CLIP ViT-L/14. La dimensión de cada vector de embedding es 768.

Este conjunto de datos puede utilizarse para modelar aspectos de diseño, dimensionamiento y rendimiento de una aplicación real de búsqueda vectorial a gran escala. El conjunto de datos puede utilizarse tanto para la búsqueda de texto a imagen como para la búsqueda de imagen a imagen.

Detalles del conjunto de datos

El conjunto de datos completo puede descargarse con opendatalab/laion5b-downloader.

ClickHouse ha puesto a disposición un subconjunto de 10 millones de vectores en un bucket público de S3. El subconjunto se almacena en un archivo Parquet.

Recomendamos a los usuarios que primero realicen un ejercicio de dimensionamiento para estimar los requisitos de almacenamiento y memoria de este conjunto de datos, consultando la documentación.

Pasos

Crear tabla

Cree la tabla laion_5b_10m para almacenar los embeddings y sus atributos asociados:

CREATE TABLE laion_5b_10m
(
    id UInt32,
    image_path String,
    caption String,
    NSFW Nullable(String) default 'unknown',
    similarity Float32,
    LICENSE Nullable(String),
    url String,
    key String,
    status LowCardinality(String),
    width Int32,
    height Int32,
    original_width Int32,
    original_height Int32,
    exif Nullable(String),
    md5 String,
    vector Array(Float32) CODEC(NONE)
) ENGINE = MergeTree ORDER BY (id)

El id es simplemente un entero incremental. Los atributos adicionales pueden usarse en predicados para comprender la búsqueda de similitud vectorial combinada con posfiltrado/prefiltrado, como se explica en la documentación

Cargar datos

Para cargar el conjunto de datos, ejecute la siguiente sentencia SQL:

INSERT INTO laion_5b_10m SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/laion-5b/laion5b_100m_part_1_of_10.parquet', NOSIGN);

La carga de 10 millones de filas en la tabla tardará unos minutos.

Crear un índice de similitud vectorial

Ejecute el siguiente SQL para definir y crear un índice de similitud vectorial en la columna vector de la tabla laion_5b_10m:

ALTER TABLE laion_5b_10m ADD INDEX vector_index vector TYPE vector_similarity('hnsw', 'cosineDistance', 768, 'bf16', 64, 512);

ALTER TABLE laion_5b_10m MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2;

Los parámetros y las consideraciones de rendimiento para la creación y búsqueda de índices se describen en la documentación. La instrucción anterior utiliza los valores 64 y 512, respectivamente, para los hiperparámetros de HNSW M y ef_construction. Debe seleccionar cuidadosamente los valores óptimos de estos parámetros evaluando el tiempo de creación del índice y la calidad de los resultados de búsqueda correspondientes a los valores seleccionados.

La creación y el guardado del índice pueden llevar un tiempo considerable para el subconjunto de 10 millones de filas, en función del número de núcleos de CPU disponibles y del ancho de banda de almacenamiento.

Generar embeddings para la consulta de búsqueda

Los vectores de embedding del conjunto de datos LAION 5b se generaron con el modelo OpenAI CLIP ViT-L/14.

A continuación, se incluye un script de Python de ejemplo que muestra cómo generar mediante programación vectores de embedding mediante las API de CLIP. A continuación, el vector de embedding de búsqueda se pasa como argumento a la función cosineDistance() en la consulta SELECT.

Para instalar el paquete clip, consulte el repositorio de GitHub de OpenAI.

import torch
import clip
import numpy as np
import sys
import clickhouse_connect

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-L/14", device=device)

# Search for images that contain both a dog and a cat
text = clip.tokenize(["a dog and a cat"]).to(device)

with torch.no_grad():
    text_features = model.encode_text(text)
    np_arr = text_features.detach().cpu().numpy()

    # Pass ClickHouse credentials here
    chclient = clickhouse_connect.get_client()

    params = {'v1': list(np_arr[0])}
    result = chclient.query("SELECT id, url FROM laion_5b_10m ORDER BY cosineDistance(vector, %(v1)s) LIMIT 100",
                            parameters=params)

    # Write the results to a simple HTML page that can be opened in the browser. Some URLs may have become obsolete.
    print("<html>")
    for r in result.result_rows:
        print("<img src = ", r[1], 'width="200" height="200">')
    print("</html>")

El resultado de la búsqueda anterior se muestra a continuación:

Resultados de la búsqueda por similitud vectorial
Navigation