Immich — это self-hosted «Google Фото». Вся магия в его ML-контейнере: он превращает каждое фото в вектор, ищет лица и читает надписи. Мы запускали этот контейнер на NAS отдельно и кормили его 3600 фотографиями из датасета Crossmodal-3600. У каждого фото там есть подписи на 36 языках, включая русский, так что можно честно проверить, находит ли поиск то, что просили.
Первое, что надо сделать: сменить модель
Immich из коробки ставит ViT-B-32__openai. По-английски она ищет нормально, а русских запросов не понимает совсем. Нужное фото она находит в одном случае из ста — как если бы мы просто тыкали наугад.
Сменить до первой индексации
Модель поиска меняется в настройках Immich (Machine Learning → Smart Search). Если сменить её после того, как архив уже проиндексирован, Immich пересчитает всё заново. Так что лучше сразу.
Какую модель брать
Моделей в каталоге Immich много, и почти все мультиязычные понимают русский хорошо. Разница — в цене: тяжёлые модели ищут на пару пунктов точнее, зато индексируют архив в разы дольше.
Наш выбор — SigLIP2 B/16 (ViT-B-16-SigLIP2__webli). На русских подписях она находит нужное фото в первой десятке в 95% случаев. Самая тяжёлая SO400M ставит его первым чуть чаще: 74% против 70%. Но индексирует она впятеро медленнее и съедает до 6.7 ГБ памяти.
iGPU реально помогает
В процессоре NAS есть встроенная графика Intel, и Immich умеет её использовать через OpenVINO. Для маленьких моделей это ускорение в 2–3 раза, для больших — в 5–7. Качество при этом не меняется: на CPU recall 85.43, на iGPU 85.50.
Что это значит на практике для архива в 50 тысяч фото:
- SigLIP2 B/16 на iGPU — около 35 минут;
- она же на CPU — около 2.5 часа, то есть одна ночь;
- SO400M на iGPU — почти 3 часа;
nllb-clip-large— 17 часов даже на iGPU. Не надо так.
Сам поиск при этом мгновенный у всех моделей: запрос считается за 16–90 мс на iGPU. Дорого стоит только индексация, а её делаешь один раз и потом по чуть-чуть для новых фото.
Лица
Модель лиц по умолчанию, buffalo_l, работает на обоих устройствах: 32 фото/с на iGPU и 6.6 на CPU. На 50 тысяч фото это полчаса или пара часов. Качество группировки людей мы не мерили, только скорость.
Текст на фото: тут засада
Immich умеет читать текст на фото, чтобы можно было найти снимок по надписи. Но модель по умолчанию кириллицу не знает и выдаёт что-то такое:






Читает русский только ESLAV__PP-OCRv5_mobile: она находит 96% слов, остальные — около 18%. И есть подвох: в Immich v3.3.3 ESLAV не запускается на OpenVINO, только на CPU. Скорость на CPU приличная, ~0.2 с на фото, так что архив проглотит за одну ночь.
Как в итоге настроить
Простой вариант — только CPU
Обычный образ immich-machine-learning:release, поиск — ViT-B-16-SigLIP2__webli, лица — buffalo_l, текст —
ESLAV__PP-OCRv5_mobile. Первая индексация 50 тыс. фото займёт ночь (~2.5 ч поиск + 2 ч лица + 1 ч текст), потом
новые фото считаются по мере загрузки. Памяти — около 2.5 ГБ, пока модели загружены.
Быстрый вариант — iGPU
Образ release-openvino с пробросом /dev/dri: всё в несколько раз быстрее, можно позволить себе SO400M.
Чтобы ESLAV OCR работал, нужен второй ML-контейнер на CPU и список адресов [openvino, cpu] в настройках Immich:
по коду сервера при ошибке он повторяет запрос на следующем адресе. Это мы вычитали в коде, вживую не проверяли.
Чего этот тест не знает
- Фото были мелкие (медиана 640×480), а Immich отдаёт в ML превью до 1440 пикселей. Медленнее станет на считаные миллисекунды.
- Recall мерили на чужом датасете. Семейные фото и старые сканы — другой мир: порядок моделей, скорее всего, сохранится, а точные цифры — нет.
- Лица — только скорость. Насколько хорошо Immich отличает тётю от мамы, этот тест не говорит.