DINOv2 и CLIP: эмбеддинги и поиск изображений

Задача страницы. Показать, как строить на облачных GPU сервисы эмбеддингов и поиска по изображениям (visual search, dedупликация, семантический ретривал, zero‑shot классификация) на базе DINOv2/CLIP‑семейства: выбор модели и размера вектора, архитектура оффлайн‑индексации и онлайн‑поиска, профили GPU/VRAM, хранение и векторные БД на GPU, метрики качества и экономика.

TL;DR

Сценарии применения

  • Visual search / похожие товары. Поиск похожих изображений/товаров по фото или скриншоту.
  • Zero‑shot классификация. CLIP с текстовыми классами вместо обученной головы.
  • Дедупликация/near‑duplicate. Поиск дублей и очень похожих кадров в дата‑озёрах.
  • Контент‑модерация и фильтры. Семантические правила вместо хрупких эвристик.
  • Активное обучение. Кластеризация и выбор «репрезентативных» примеров для разметки.
  • Кросс‑модальный ретривал. Поиск картинок по тексту (CLIP), или аннотаций по картинке.
  • ROI‑эмбеддинги. Сначала выделить области интереса (см. SAM: https://cloudcompute.ru/solutions/computer-vision/sam/), затем получить эмбеддинги по ROI.

Выбор модели и нормализация

**Выбор** **Рекомендации**
**DINOv2** Для image→image: ретривал/кластеризация/дедуп. Пулинг CLS/средний по патчам, затем **L2‑нормализация**.
**CLIP** Для text→image и zero‑shot. Нормализовать и текстовые, и визуальные эмбеддинги; использовать косинусное сходство.
**Размер вектора** 384/768/1024 — компромисс **качество ↔ память ↔ скорость индекса**. Начните с 768 (универсально).
**Аугментации** Для offline‑эмбеддингов разумные crop/resize; **не искажайте** аспект для задач каталога.
**Стандартизация** Единый препроц (resize/center crop/нормализация), фиксируйте версию препроца в отчётах.

Архитектуры: оффлайн и онлайн A) Оффлайн‑конвейер (эмбеддинги + индексация)

Object storage → (шардирование) → GPU-воркеры эмбеддингов → пачки векторов (fp16) →

GPU-векторная БД/индекс → отчёты о покрытии/дубликатах

Рекомендации: interruptible‑пулы, чанк ≤ 2 мин, кэш весов/изображений на NVMe. См. https://cloudcompute.ru/solutions/interruptible-patterns/ и https://cloudcompute.ru/solutions/storage-data/

B) Онлайн‑поиск (низкая латентность)

API /embed (GPU) → нормализация → kNN в GPU-индексе → re-rank → топ-K + метаданные

↘ кэшированная галерея/предрасчитанные эмбеддинги

Рекомендации: on‑demand‑пулы под SLA, кэш «горячих» эмбеддингов, batch‑запросы, трассировка. См. https://cloudcompute.ru/solutions/llm-inference/observability/

Подбор и хранение индекса на GPU: https://cloudcompute.ru/solutions/rag/vector-db/

Профили GPU, VRAM и throughput

Ориентиры для fp16/bf16, батчи подобраны, прогретые веса:

**Профиль** **Эмбеддинги (изобр./мин)** **Онлайн‑поиск (qps, top‑K≤50)** **Для чего**
**24 ГБ (Compact)** 600–1 200 200–400 Старт, малые витрины, dev/preview
**48 ГБ (Balanced)** 1 200–2 500 400–800 Прод ретривал, каталог среднего размера
**80 ГБ (HQ)** 2 500–5 000 800–1 500 Большие каталоги, сложные re‑rank пайплайны

Фактические цифры зависят от разрешения, формата индекса и re‑rank этапов.

Размеры векторов и хранение

Память на 1 млн векторов (без накладных индекса):

**Dim** **fp16** **fp32** **int8**
384 ~0.77 ГБ ~1.54 ГБ ~0.38 ГБ
768 ~1.54 ГБ ~3.07 ГБ ~0.77 ГБ
1024 ~2.05 ГБ ~4.10 ГБ ~1.02 ГБ

Добавьте +5–15 % на структуру индекса/ID/метаданные. Хранение и иерархии (горячее/тёплое/холодное) — https://cloudcompute.ru/solutions/storage-data/ Индексация и обновления (upsert)

  • Batch‑индексация: шардируйте вход, считайте эмбеддинги пачками, собирайте блоки индекса по 100k–1M.
  • Upsert/replace: храните item_id, vec_digest, meta_digest; при изменении изображения переиндексируйте только изменившиеся.
  • Dedup: порог косинусного сходства (например, ≥0.98) → кластеры дублей; сохраняйте маппинг duplicate_of.
  • Версионирование: индекс version=yyyymmdd + отчёт о покрытии/дубликатах.

API сервиса эмбеддингов и поиска (скелет)

# fastapi_vectors.py — сокращённо
from fastapi import FastAPI, UploadFile
from pydantic import BaseModel
import numpy as np
app = FastAPI()
# Заглушки для примера
def embed_image(img_bytes) -> np.ndarray:
 # ... GPU инференс DINOv2/CLIP, fp16 → float32 → L2-норма ...
 return np.random.rand(768).astype("float32")
class SearchReq(BaseModel):
 image_b64: str
 top_k: int = 24
@app.post("/v1/embed")
async def embed(file: UploadFile):
 vec = embed_image(await file.read()) # shape [D], l2-normalized
 return {"dim": int(vec.shape[0]), "vector": vec.tolist()[:8]} # обрезка для примера
@app.post("/v1/search")
async def search(req: SearchReq):
 q = ... # decode base64 → bytes
 qv = embed_image(q) # [D]
 # ... поиск в GPU-индексе (косинус/L2) ...
 hits = [{"id":"item_123","score":0.92}, {"id":"item_987","score":0.91}]
 return {"top_k": req.top_k, "hits": hits}

Сервинг и многомодельные графы — https://cloudcompute.ru/solutions/triton-inference-server/ • HTTP/UI‑демо — https://cloudcompute.ru/solutions/gradio-fastapi/ • CI/CD — https://cloudcompute.ru/solutions/containers-ci-cd/

Ранжирование и качество результата

  • Сходство: косинус (при L2‑норме векторов) или L2.
  • Re‑rank: lightweight переранжирование по метаданным (категория/бренд/ценовой диапазон) и по ROI (если важен конкретный участок).
  • Фильтры: бизнес‑правила (в наличии/регион/правовой статус).
  • Zero‑shot: CLIP текстовые запросы как векторы; можно комбинировать с image→image (гибридный запрос).

Метрики качества и оффлайн‑валидация

  • Recall@K / Precision@K / mAP / NDCG на эталонных парах (query→relevant).
  • Cluster purity / rand index — для кластеризации/дедупа.
  • Drift эмбеддингов: расстояние между версиями модели по контрольному набору.
  • Доля дублей / near‑duplicates и качество дедуп‑кластеров.

Сбор/дашборды — https://cloudcompute.ru/solutions/monitoring-logging/ и https://cloudcompute.ru/solutions/llm-inference/observability/

Наблюдаемость и алерты (прод)

  • Онлайн: p50/p95 latency /embed и /search, qps, hit‑rate кэша, доля таймаутов, GPU util/HBM, VRAM пик.
  • Качество: moving‑window Recall@K, drift score, ratio «пустых» результатов.
  • Алерты: рост p95, падение Recall@K, деградация кэша, OOM/ретраи индекса.

Экономика и sizing

Пусть t_emb — среднее время эмбеддинга изображения, t_knn — среднее время поиска top‑K, c_gpu — цена GPU/час.

Throughput оффлайн:

Imgs_per_hour ≈ 3600 / t_emb

Cost_per_1M ≈ (1_000_000 / Imgs_per_hour) × c_gpu × Num_GPU

Хранение:

Bytes_per_vec = dim × bytes_per_component # fp16=2, fp32=4, int8=1

Storage_1M ≈ Bytes_per_vec × 1_000_000 × (1 + overhead_index)

Онлайн:

QPS ≈ 1 / (t_emb + t_knn) # при отсутствии кэша

QPS_cached ≈ 1 / t_knn # если эмбеддинг кэширован

Cost_per_query ≈ (c_gpu / 3600) × (t_emb + t_knn)

Планирование и сравнение профилей — https://cloudcompute.ru/solutions/cost-planner/ • баланс — https://cloudcompute.ru/solutions/throughput-vs-latency/

Операционные паттерны

  • Batch (interruptible): индексация и переиндексация датасетов, дедуп — см. https://cloudcompute.ru/solutions/interruptible-patterns/
  • Онлайн (on‑demand): поиск и рекомендации с низкой латентностью, горячий кэш эмбеддингов.
  • Кэширование: LRU по запросам и по item_id; храните эмбеддинги в fp16/int8, а модель — в fp16/bf16.
  • A/B и версии: распараллельте индексы v1/v2, не ломая прод.

Безопасность и данные

  • Политики приватности изображений, срок хранения запросов, псевдонимизация метаданных.
  • Белые списки моделей/версий; контроль доступа к индексам/метаданным.
  • Логи без PII/секретов; трекинг источников данных.

Подробнее — https://cloudcompute.ru/solutions/security/ и https://cloudcompute.ru/solutions/llm-inference/guardrails/

Экспорт и edge‑инференс

  • Выгрузка головы эмбеддингов в ONNX/TensorRT, INT8‑квантизация, упаковка моделей/нормализаций.
  • Замер latency/J на edge‑профилях (ARM/x86, iGPU/dGPU).

Подробности — https://cloudcompute.ru/solutions/computer-vision/edge-export/

Шаблоны cloudcompute.ru (готовые пресеты)

Хаб шаблонов — https://cloudcompute.ru/solutions/templates/

  • “Embeddings‑GPU (DINOv2/CLIP)” — оффлайн‑эмбеддинги и индексация, отчёты по покрытию/дедупу.
  • “Visual‑Search (Online)” — API /embed и /search, GPU‑индекс, кэш, метрики/алерты.
  • “Vector‑DB (GPU)” — сборка и обслуживание индекса, upsert/replace, health‑чеки: https://cloudcompute.ru/solutions/rag/vector-db/

Чек‑лист перед продом

  • Определены сценарии: image→image / text→image, Zero‑shot да/нет.
  • Выбраны модель (DINOv2/CLIP), размер вектора и нормализация (L2).
  • Подтверждены профили VRAM/throughput; рассчитано хранение и индекс.
  • Спроектированы оффлайн‑батчи (interruptible) и онлайн‑сервис (on‑demand).
  • Подключены метрики/алерты/трейсинг; заведён контроль качества (Recall@K, drift).
  • Рассчитаны Cost_per_1M и Cost_per_query; настроены кэши и версии индексов.

Навигация по разделу «Компьютерное зрение»

Хаб: https://cloudcompute.ru/solutions/computer-vision/ • Детекция: https://cloudcompute.ru/solutions/computer-vision/yolo/ • Интерактивная сегментация: https://cloudcompute.ru/solutions/computer-vision/sam/ • Видео‑аналитика: https://cloudcompute.ru/solutions/computer-vision/video-analytics/ • OCR: https://cloudcompute.ru/solutions/computer-vision/ocr/ • ReID/треккинг: https://cloudcompute.ru/solutions/computer-vision/tracking/ • 3D‑реконструкция: https://cloudcompute.ru/solutions/computer-vision/3d-reconstruction/ • Гео/SAR: https://cloudcompute.ru/solutions/computer-vision/geospatial/ • Экспорт на edge: https://cloudcompute.ru/solutions/computer-vision/edge-export/ • Векторные БД: https://cloudcompute.ru/solutions/rag/vector-db/ • Инфраструктура: https://cloudcompute.ru/solutions/performance-tuning/https://cloudcompute.ru/solutions/storage-data/https://cloudcompute.ru/solutions/monitoring-logging/https://cloudcompute.ru/solutions/llm-inference/observability/https://cloudcompute.ru/solutions/cost-planner/https://cloudcompute.ru/solutions/interruptible-patterns/https://cloudcompute.ru/solutions/throughput-vs-latency/https://cloudcompute.ru/solutions/triton-inference-server/https://cloudcompute.ru/solutions/gradio-fastapi/https://cloudcompute.ru/solutions/containers-ci-cd/

Готовы запустить?

Запустить GPU-сервер