Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

conjunto de dados LAION 5B

Introdução

O conjunto de dados LAION 5b contém 5,85 bilhões de embeddings de imagem-texto e metadados de imagem associados. Os embeddings foram gerados usando o modelo Open AI CLIP ViT-L/14. A dimensão de cada vetor de embedding é 768.

Esse conjunto de dados pode ser usado para modelar aspectos de projeto, dimensionamento e desempenho de uma aplicação real de busca vetorial em grande escala. Ele pode ser usado tanto para buscas de texto para imagem quanto de imagem para imagem.

Detalhes do conjunto de dados

O conjunto de dados completo pode ser baixado usando opendatalab/laion5b-downloader.

O ClickHouse disponibilizou um subconjunto de 10 milhões de vetores em um bucket S3 público. O subconjunto é armazenado em um arquivo Parquet.

Recomendamos que os usuários façam primeiro uma análise de dimensionamento para estimar os requisitos de armazenamento e memória desse conjunto de dados consultando a documentação.

Etapas

Criar tabela

Crie a tabela laion_5b_10m para armazenar os embeddings e os atributos associados:

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)

O id é apenas um número inteiro sequencial. Os atributos adicionais podem ser usados em predicados para compreender a busca por similaridade vetorial combinada com pós-filtragem/pré-filtragem, conforme explicado na documentação

Carregar dados

Para carregar o conjunto de dados, execute a seguinte instrução 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);

O carregamento de 10 milhões de linhas na tabela levará alguns minutos.

Crie um índice de similaridade vetorial

Execute o SQL a seguir para definir e criar um índice de similaridade de vetores na coluna vector da tabela 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;

Os parâmetros e as considerações de desempenho para a criação e a busca de índices são descritos na documentação. A instrução acima usa os valores 64 e 512, respectivamente, para os hiperparâmetros HNSW M e ef_construction. Você precisa selecionar cuidadosamente os valores ideais desses parâmetros, avaliando o tempo de criação do índice e a qualidade dos resultados de busca correspondentes aos valores selecionados.

A criação e o salvamento do índice podem levar bastante tempo para o subconjunto de 10 milhões de linhas, dependendo do número de núcleos de CPU disponíveis e da largura de banda de armazenamento.

Gere embeddings para a consulta de pesquisa

Os vetores de embedding do conjunto de dados LAION 5b foram gerados usando o modelo ViT-L/14 do OpenAI CLIP.

Um exemplo de script em Python é fornecido abaixo para demonstrar como gerar programaticamente vetores de embedding usando as APIs do CLIP. Em seguida, o vetor de embedding de busca é passado como argumento para a função cosineDistance() na consulta SELECT.

Para instalar o pacote clip, consulte o repositório do OpenAI no GitHub.

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>")

O resultado da busca acima é exibido abaixo:

Resultados da Busca por Similaridade Vetorial
Navigation