Мультимодальные эмбеддинги на Apple Silicon — это не только выбор между CLIP и SigLIP, а связка препроцессинга изображения, стабильного ONNX или нативного CoreML, execution provider и батча, которая вместе с размерностью вектора определяет пик unified memory. Сравнивайте строки матрицы как контракт на память и задержку до того, как очередь батч-инференса упрётся в удалённый узел и почасовой burn rate.

Оглавление: болевые точки · матрица стеков · конвертация форматов · потоки · пик памяти · очередь и удалённый узел · шесть шагов · покупка и аренда

Инженерам RAG на Mac mini M4 нужен лист приёмки: путь с воспроизводимой D, батч без всплеска RSS и очередь декодера, согласованная с биллингом узла. Сверьте с чанками, батчами эмбеддингов и квотами, индексами usearch, FAISS и sqlite-vec и мульти-модельным роутингом и стоимостью. Зафиксируйте препроцессинг и разрешение, иначе одна пара image–text даст разный косинус на ноутбуке и на выделенном хосте.

Болевые точки

  1. Смешение D и головы проекции: карточка модели обещает одну размерность, а сервис отдаёт другую после слоя проекции или пула — индекс перестаёт быть сопоставимым между средами.
  2. Два рантайма без измерений: один и тот же ONNX через CPU и через CoreML EP даёт разный пик памяти и разный оптимальный батч; сравнение «в голове» ломает SLA ночного индекса.
  3. Очередь без политики отказа: батчер принимает бесконечно глубокую очередь, клиент видит рост задержки, а удалённый узел списывает часы простоя декодера изображений.

Матрица стеков: CLIP, SigLIP, ONNX и CoreML EP

Таблица — контракт между декодером изображения и векторным API. Перекалибруйте под разрешение и цветовое пространство; для SigLIP сверьте токенизацию текста с карточкой модели.

Критерий ONNX Runtime + CoreML EP Нативный CoreML пакет SigLIP против классического CLIP
Граф Кроссплатформа; контроль динамических осей батча и opset. ANE-близкий путь; меньше прослоек при корректной компиляции. SigLIP устойчивее на слабой разметке; CLIP чувствителен к длине подписи.
Батч Малый старт на EP; удвоение после плато p95. Шейпы на этапе сборки; смена верхней границы — пересборка. Разнесите очереди изображений и текста.
D Отдельно image_embed и text_embed; где L2. Сверка тензора с ONNX на десяти парах. Не мешайте чекпойнты SigLIP без новых порогов.
Память Декодер плюс активации плюс пулы EP. Ниже хвост на single; смотрите широкий батч. Внимание растёт по картам, не только по D.
Удалённый узел Те же флаги ORT; имя EP в логе. Версия macOS и чип; mlpackage — регрессия. Токены и регистр как в эталоне.

Преобразование форматов моделей: PyTorch → ONNX → CoreML

Экспорт в ONNX с явными осями батча, при необходимости simplify, затем mlprogram через coremltools с float16. Зафиксируйте checksum ONNX и хеш mlpackage; до регрессии ограничьте агрессивные оптимизации ORT.

  • Чек: resize, crop, mean/std как в эталоне PyTorch.
  • Чек: паддинг текста и лимит токенов идентичны на узлах.
  • Чек: в лог старта сессии — имя EP и провайдеры.
  • Чек: двадцать пар для косинуса до и после конвертации.

Число потоков: intra-op, inter-op и декодирование изображений

На M4 начинайте с умеренного intra-op и низкого inter-op при параллельном декодере и других сервисах. Потоки загрузки файлов ограничьте отдельно от ORT, иначе p95 пострадает раньше батча.

Зона Стартовая настройка Сигнал перекрутки
intra-op Мало при батче > 1; мерить на диске. E-cores загружены, throughput плоский.
inter-op Часто 1 на запрос. RSS растёт без RPS.
Декодер Очередь с крышкой и отказом. Лаг растёт быстрее инференса.

Пик памяти, батч и размерность вектора

Пик — декодер плюс активации плюс тензор batch на D, умноженный на число сессий ORT, с запасом под ОС и кэш. На арендованном узле измерять проще, чем на ноутбуке с фоном.

Размерность D Типичный смысл для каталога Риск
512 Компактный HNSW. Шумные классы хуже разделяются.
768 / 1024 Баланс для витрин. Индекс и репликация тяжелее.
1152+ Тяжёлые энкодеры. Батч > 8 без замеров — риск по RAM.

Очередь батч-инференса и чек-лист стоимости удалённого узла

Задайте максимальную глубину, политику отказа и возраст в очереди. В отчёт — ставка за час, wall time батча и доля отказов по переполнению.

Пункт приёмки Ожидание Артефакт
Глубина Связана с батчем и p95. Lag и гистограмма.
Таймаут Клиент короче внутреннего дедлайна. Корреляционный id.
Артефакты Те же ONNX или mlpackage. Хеши в журнале.
Экономика Burn rate за час индексации. Сравнение с локальным прогоном.

Шесть шагов приёмки перед продакшеном

  1. Десять пар: косинусы PyTorch против продакшен-рантайма.
  2. Батч: ступени batch size с p95 и пиком RSS.
  3. Потоки: sweep intra-op при фиксированном батче.
  4. Очередь: нагрузка выше крышки — контролируемая ошибка клиенту.
  5. Длинный прогон: окно как у ночного индекса на узле.
  6. Биллинг: часы аренды или амортизация и хеши артефактов в одном PDF.
  • Одинаковый D в индексе и в ответе сервиса — обязательное условие приёмки.
  • Пик памяти измеряется с декодером и реальным диском, а не только synthetic tensor.
  • Очередь без верхней границы считается дефектом архитектуры, а не оптимизацией.

Покупка или аренда удалённого Mac под эмбеддер

Аренда — чистый узел, ночные батчи, прозрачный burn rate, без сна крышки. Покупка — длинный непрерывный индекс и капекс. В обоих случаях прогоните матрицу на железе до бюджета: один только бинарь без десяти пар чаще ломает косинус, чем индекс.

Без входа: главная, тарифы, справка, покупка и аренда, блог.

Итог: формат ONNX или CoreML, пик RAM на батче, потоки и крышка очереди, затем часы против тарифов — аренда для приёмки или покупка при длинном горизонте. После выбора снова десять пар на бою дешевле полного переиндекса.