DINOv2 и CLIP: эмбеддинги и поиск изображений
Задача страницы. Показать, как строить на облачных GPU сервисы эмбеддингов и поиска по изображениям (visual search, dedупликация, семантический ретривал, zero‑shot классификация) на базе DINOv2/CLIP‑семейства: выбор модели и размера вектора, архитектура оффлайн‑индексации и онлайн‑поиска, профили GPU/VRAM, хранение и векторные БД на GPU, метрики качества и экономика.
TL;DR
- DINOv2 — сильные визуальные эмбеддинги для image→image задач (ретривал, кластеризация, dedup).
- CLIP — кросс‑модальный поиск text→image/image→text и zero‑shot классификация.
- Онлайн‑поиск: держите индекс на GPU (косинус/L2, IVFPQ/HNSW), эмбеддинги — L2‑нормализованные.
- Массовая индексация: пулы interruptible + чанк ≤ 2 мин, локальный NVMe‑кэш.
- Хранилище: 1 млн векторов 1024‑dim fp16 ≈ 2.0 ГБ (+5–15 % накладных индекса).
- Связанные разделы: CV‑хаб — https://cloudcompute.ru/solutions/computer-vision/ • векторные БД — https://cloudcompute.ru/solutions/rag/vector-db/ • экспорт на edge — https://cloudcompute.ru/solutions/computer-vision/edge-export/ • тюнинг — 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/fp8-bf16/ • баланс throughput↔latency — https://cloudcompute.ru/solutions/throughput-vs-latency/ • прерываемые пулы — https://cloudcompute.ru/solutions/interruptible-patterns/
Сценарии применения
- 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-сервер