Команда Manticore переписала движок для embeddings. Раньше встроенная генерация векторов работала через SentenceTransformers поверх Candle (Hugging Face, Rust). Это было медленно: большинство нагрузок упирались в 5–11 документов в секунду, а параллельные запросы сериализовались на одной сессии модели.
В версии Manticore Search 27.1.5 появился новый бэкенд — ONNX Runtime. Это движок инференса от Microsoft, который делает graph fusion, constant folding и автоподбор ядер. Для популярных embedding-моделей (MiniLM, BGE, E5) файл .onnx уже лежит на HuggingFace. Результат на железе с 16 ядрами / 32 потоками — в среднем в 14 раз быстрее. Старый путь выдавал 5–11 docs/сек на любой конфигурации. Новый — от 70 до 230 docs/сек как с одним клиентским потоком, так и с 32.
Главная инженерная находка: один общий Session без блокировок. В Linux и macOS C++ API ORT (Run()) thread-safe. В Rust пришлось обернуть сессию в UnsafeCell и вручную реализовать Sync. Это осознанный unsafe — движок гарантирует безопасность при такой нагрузке. На Windows из-за бага в ORT поставили Mutex, но замок держат на всё замыкание, а не только на вызов run().
Второй сюрприз — батчинг документов внутри воркера оказался вреден. Пэддинг переменной длины текстов заставлял модель перемножать лишние токены, а пул тредов ORT по умолчанию крутился в busy-wait между вызовами. В итоге от батчинга отказались. Вместо этого: один документ — один инференс, много конкурентных вызовов, spinning отключён (with_intra_op_spinning(false)). Код predict_pipelined делит большой массив текстов на воркеры, но каждый воркер внутри дёргает общую сессию по одному документу.
Цифры для all-MiniLM-L12-v2-onnx: при 8 потоках и batch=1 — 143 docs/сек (было 10). Пик — 233 docs/сек на одном потоке с batch=64, это ~4.3 ms на документ. Для максимальной загрузки советуют слать большие INSERT ... VALUES (..), (..) с batch 32-128 из одного клиента — внутренняя параллелизация даёт больше, чем многопоточная обвязка.
Мигрировать легко: таблицы, которые уже указывают на ONNX-модель, подхватят новый путь автоматически при обновлении. Если нужно сменить модель — добавить новую колонку, перестроить embeddings, удалить старую. Или дампнуть, поправить CREATE TABLE, перезалить. Готовые ONNX-модели ищут в коллекции Xenova на Hugging Face. Пока бэкенд CPU-only, GPU-путь и правки для Windows — в плане.