text-embedding-3-small и предсказуемую задержку локального bge-m3 в графах ONNX и CoreML EP: иначе индекс «плывёт» по качеству, а бюджет — по неожиданным всплескам нагрузки после релиза чанкера.
Оглавление: задержка и деньги · ограничения · матрица стеков · пороги стоимости · скан батча · ключи кэша · отказ и откат · приёмка узла · FAQ
Ниже — практическая матрица для команд, которые уже держат чанки в векторном хранилище и хотят сопоставить OpenAI с локальным M4. Связанные материалы: квоты чанков и эмбеддингов, индексы FAISS и sqlite-vec, мультимодальные эмбеддинги CLIP и SigLIP.
Задержка сети и деньги против локального инференса
Облачный text-embedding-3-small добавляет RTT и очередь провайдера к чистому времени матмулов, зато снимает с вас упаковку модели и совместимость размерности при условии явного выбора целевой D в запросе. Локальный bge-m3 через ONNX Runtime даёт контроль над батчем и профилем потоков, а CoreML Execution Provider может снизить задержку на серии однотипных длин после прогрева, если конвертация графа и версия macOS совпадают с боевым контуре. Сравнивайте не абсолютные миллисекунды в изоляции, а p95 на документ с учётом сериализации, нормализации вектора и записи в индекс.
Три жёстких ограничения до выбора стека
- Фиксированная размерность индекса: смешение 1536 из облака и 1024 из bge-m3 без отдельной коллекции ломает метрики поиска и усложняет A/B тесты качества ответа ретривера.
- Пик памяти по батчу: на unified memory M4 рост
batch_sizeрезко поднимает RSS графа; без сканирования вы останетесь на безопасном, но медленном режиме или получите нестабильные OOM в ночной переиндексации. - Скрытая стоимость ретраев: при деградации API клиенты часто умножают попытки; локальный откат без бюджетного предохранителя так же раздувает CPU и мешает интерактивным сценариям на той же машине.
Матрица: облако против локального графа
| Критерий | text-embedding-3-small | bge-m3 ONNX / CoreML EP |
|---|---|---|
| Размерность D | Настраиваемая усечённая проекция, типично 1536 или меньше по политике продукта | Фиксируется весами экспорта, чаще 1024; проверяйте выходной тензор в Netron |
| Деньги | Переменная стоимость по токенам; растёт с длиной чанка и частотой переиндексации | Капекс времени инженеров и амортизация Mac; операционно почти линейно от электричества и аренды узла |
| Задержка | Доминируют сеть и лимиты провайдера; хвосты на стороне клиента | Доминируют выбранный EP, потоки ORT и размер батча |
| Квантизация | Не применяется на вашей стороне | int8 и смешанная точность уменьшают память; требуют отдельной калибровочной выборки для контроля дрейфа recall |
| Приватность | Данные покидают периметр при каждом вызове | Тексты остаются на хосте; важна дисциплина логирования и маскирования |
Пороги стоимости и сигналы переключения
Заведите простую модель: помесячно суммируйте миллионы токенов индексации и типичный коэффициент переобновления чанков после правок. Если прогнозируемый счёт облака стабильно превышает амортизированную стоимость выделенного Mac mini M4 плюс часы сопровождения конвертации ONNX, смещайте основной поток на локальный граф с кэшем. Обратный сигнал — редкие пики нагрузки и жёсткие требования к самым свежим весам без команды, готовой пересобирать артефакты: тогда оставьте API основным контуром, а локальный режим используйте для офлайн-песочниц и регрессий качества.
Исполняемое сканирование размера батча
Зафиксируйте версии onnxruntime, список зарегистрированных провайдеров и переменные окружения, влияющие на потоки, затем удваивайте batch_size на репрезентативной смеси длин, пока не упрётесь в плато throughput, рост p95 латентности на элемент или лимит памяти. Отдельно прогоните тот же протокол с включённым CoreML EP и сравните не только среднее, но и разброс на холодном старте после перезагрузки демона индексации.
# Псевдопараметры ORT: зафиксируйте потоки и провайдер перед циклом батча
import onnxruntime as ort
so = ort.SessionOptions()
so.intra_op_num_threads = 8 # под ядра P-кластера M4
so.inter_op_num_threads = 1
providers = [("CoreMLExecutionProvider", {"use_cpu_only": False}), "CPUExecutionProvider"]
# Далее: for B in [1,2,4,8,...]: измеряйте RSS и p95 на чанкКлючи кэша и детерминированный препроцессинг
Ключ должен включать идентификатор модели, строку провайдера вычислений, флаг квантизации, выбранную нормализацию L2, итоговую D и хэш текста после канонизации пробелов и единого правила нижнего регистра, если оно входит в контракт чанкера. Для облака добавьте версию эндпоинта и параметры усечения размерности, чтобы не смешивать ответы разных релизов API в одном индексе. Любое изменение токенизатора или правила склейки полей метаданных объявляйте новой версией кэша с фоновой инвалидацией партициями.
Отказ локального графа и откат к API
Опишите явный конечный автомат: при ошибке загрузки mlmodelc, провале валидации формы входа или превышении бюджета времени на партию переключайтесь на text-embedding-3-small с отдельной очередью и отдельной меткой версии вектора. Не смешивайте в одной транзакции записи разные D; лучше держать параллельную коллекцию «аварийного» индекса с собственным именем и TTL. Логируйте причину отката одной строкой без сырого текста документов.
Чек-лист приёмки удалённого арендованного узла под эталон
Шаг 1. Снимите sysctl hw и версию ОС, сравните с локальной эталонной машиной. Шаг 2. Установите те же колёса Python и хэши артефактов модели. Шаг 3. Прогрейте граф серией фиксированных длин. Шаг 4. Выполните скан батча и сохраните CSV с RSS и p95. Шаг 5. Прогоните тот же корпус через API с лимитом RPM и сравните стоимость по фактическим токенам. Шаг 6. Зафиксируйте политику отката и ключи кэша в репозитории инфраструктуры как код.
FAQ
Нужен ли отдельный узел, если есть мощный MacBook? Да, если вы хотите исключить дросселирование от питания от батареи и фоновых сервисов; арендованный Mac mini M4 даёт повторяемые цифры для согласования с финансами.
Совместимы ли разные квантизации с одним FAISS-индексом? Только после измерения дрейфа расстояний; на практике держите отдельные индексы на каждую комбинацию весов и калибровки.
Как учесть стоимость владения? Делите аренду узла на ожидаемые миллионы эмбеддингов в месяц и сравните с прогнозом счёчика OpenAI по прайсу на дату замера, не забывая про трафик повторной индексации.
Цифры для слайда руководству: типичный Mac mini M4 с достаточной unified memory держит ночной реиндекс средних корпусов при аккуратном batch_size; коммерческий API масштабируется ровно до следующего счёта. Три контрольные метрики: p95 на чанк, пик RSS, доллар за миллион токенов по факту.
Публичные страницы без логина: главная, технический блог, документация, тарифы, покупка и аренда.
Итог: сопоставьте text-embedding-3-small и bge-m3 по D, деньгам и хвостам задержки, затем закрепите скан батча, ключи кэша и откат в коде; удалённый эталонный Mac снимет споры о цифрах между командами.