🧠NAS как ИИ-сервер
🔍
Фаза 1 · ImmichГодится

Поиск по фото

Пишешь «бабушка на даче с котом» — и Immich находит фотку 2003 года. Проверяли, потянет ли NAS такой поиск, распознавание лиц и чтение текста на фото, и какие модели для этого брать.

Берём SigLIP2 B/16 для поиска, buffalo_l для лиц, ESLAV PP-OCRv5 для текста на фото
Сухие цифры и методика →

Immich — это self-hosted «Google Фото». Вся магия в его ML-контейнере: он превращает каждое фото в вектор, ищет лица и читает надписи. Мы запускали этот контейнер на NAS отдельно и кормили его 3600 фотографиями из датасета Crossmodal-3600. У каждого фото там есть подписи на 36 языках, включая русский, так что можно честно проверить, находит ли поиск то, что просили.

24 фото/синдексация с SigLIP2 B/16 на iGPU
21 мсна один поисковый запрос
×2.4–7ускорение iGPU против CPU
1%recall модели по умолчанию на русском 🙃

Первое, что надо сделать: сменить модель

Immich из коробки ставит ViT-B-32__openai. По-английски она ищет нормально, а русских запросов не понимает совсем. Нужное фото она находит в одном случае из ста — как если бы мы просто тыкали наугад.

Наш замер на 3600 фото Crossmodal-3600. Модель по умолчанию на русском находит нужное фото в 1% случаев — это уровень «тыкнуть наугад».

Сменить до первой индексации

Модель поиска меняется в настройках Immich (Machine Learning → Smart Search). Если сменить её после того, как архив уже проиндексирован, Immich пересчитает всё заново. Так что лучше сразу.

Какую модель брать

Моделей в каталоге Immich много, и почти все мультиязычные понимают русский хорошо. Разница — в цене: тяжёлые модели ищут на пару пунктов точнее, зато индексируют архив в разы дольше.

Чем правее — тем быстрее, чем выше — тем лучше ищет по-русски. SigLIP2 B/16 сидит в «колене»: дальше качество растёт на пару пунктов, а скорость падает в разы. Модели по умолчанию тут нет — русского она не понимает вовсе.

Наш выбор — 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 тысяч фото:

Сам поиск при этом мгновенный у всех моделей: запрос считается за 16–90 мс на iGPU. Дорого стоит только индексация, а её делаешь один раз и потом по чуть-чуть для новых фото.

Лица

Модель лиц по умолчанию, buffalo_l, работает на обоих устройствах: 32 фото/с на iGPU и 6.6 на CPU. На 50 тысяч фото это полчаса или пара часов. Качество группировки людей мы не мерили, только скорость.

Текст на фото: тут засада

Immich умеет читать текст на фото, чтобы можно было найти снимок по надписи. Но модель по умолчанию кириллицу не знает и выдаёт что-то такое:

Осторожно, злая собака
✅Осторожно, злая собакаESLAV PP-OCRv5
🤡OcTOpOXHO, 3na9 co6akaPP-OCRv5 по умолчанию
С днём рождения, бабушка!
✅С днём рождения, бабушка!ESLAV PP-OCRv5
🤡CAHëM poxAeHng, 6a6yuka!PP-OCRv5 по умолчанию
Кафе «Ромашка»
✅Кафе «Ромашка»ESLAV PP-OCRv5
🤡Kaφe《PoMa山ka》PP-OCRv5 по умолчанию
Вагон 7, место 23
✅Вагон 7, место 23ESLAV PP-OCRv5
🤡BazoH 7, Mecmo 23PP-OCRv5 по умолчанию
Библиотека
✅БиблиотекаESLAV PP-OCRv5
🤡Bu6ΛuomekaPP-OCRv5 по умолчанию
Дача, лето 2003
✅Дача, лето 2003ESLAV PP-OCRv5
🤡Aaya, neto 2003PP-OCRv5 по умолчанию

Читает русский только ESLAV__PP-OCRv5_mobile: она находит 96% слов, остальные — около 18%. И есть подвох: в Immich v3.3.3 ESLAV не запускается на OpenVINO, только на CPU. Скорость на CPU приличная, ~0.2 с на фото, так что архив проглотит за одну ночь.

40 синтетических вывесок с известным текстом. Только ESLAV-версия знает кириллицу.

Как в итоге настроить

Простой вариант — только 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: по коду сервера при ошибке он повторяет запрос на следующем адресе. Это мы вычитали в коде, вживую не проверяли.

Чего этот тест не знает