Оглавление: болевые точки · матрица стеков · конвертация форматов · потоки · пик памяти · очередь и удалённый узел · шесть шагов · покупка и аренда
Инженерам RAG на Mac mini M4 нужен лист приёмки: путь с воспроизводимой D, батч без всплеска RSS и очередь декодера, согласованная с биллингом узла. Сверьте с чанками, батчами эмбеддингов и квотами, индексами usearch, FAISS и sqlite-vec и мульти-модельным роутингом и стоимостью. Зафиксируйте препроцессинг и разрешение, иначе одна пара image–text даст разный косинус на ноутбуке и на выделенном хосте.
Болевые точки
- Смешение D и головы проекции: карточка модели обещает одну размерность, а сервис отдаёт другую после слоя проекции или пула — индекс перестаёт быть сопоставимым между средами.
- Два рантайма без измерений: один и тот же ONNX через CPU и через CoreML EP даёт разный пик памяти и разный оптимальный батч; сравнение «в голове» ломает SLA ночного индекса.
- Очередь без политики отказа: батчер принимает бесконечно глубокую очередь, клиент видит рост задержки, а удалённый узел списывает часы простоя декодера изображений.
Матрица стеков: 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 за час индексации. | Сравнение с локальным прогоном. |
Шесть шагов приёмки перед продакшеном
- Десять пар: косинусы PyTorch против продакшен-рантайма.
- Батч: ступени batch size с p95 и пиком RSS.
- Потоки: sweep intra-op при фиксированном батче.
- Очередь: нагрузка выше крышки — контролируемая ошибка клиенту.
- Длинный прогон: окно как у ночного индекса на узле.
- Биллинг: часы аренды или амортизация и хеши артефактов в одном PDF.
- Одинаковый D в индексе и в ответе сервиса — обязательное условие приёмки.
- Пик памяти измеряется с декодером и реальным диском, а не только synthetic tensor.
- Очередь без верхней границы считается дефектом архитектуры, а не оптимизацией.
Покупка или аренда удалённого Mac под эмбеддер
Аренда — чистый узел, ночные батчи, прозрачный burn rate, без сна крышки. Покупка — длинный непрерывный индекс и капекс. В обоих случаях прогоните матрицу на железе до бюджета: один только бинарь без десяти пар чаще ломает косинус, чем индекс.
Без входа: главная, тарифы, справка, покупка и аренда, блог.
Итог: формат ONNX или CoreML, пик RAM на батче, потоки и крышка очереди, затем часы против тарифов — аренда для приёмки или покупка при длинном горизонте. После выбора снова десять пар на бою дешевле полного переиндекса.