Skip to content

Intel iGPU через OpenVINO

Канонічні BGE-M3 embeddings і BGE reranker використовують спільний селектор OpenVINO. Прискорення залежить від Intel GPU, драйверів і доступу контейнера до /dev/dri; сам вибір провайдера не доводить виграш швидкості.

Встановлення

Створіть окреме середовище Python 3.13–3.14. Спочатку перевірте наявність wheel onnxruntime-openvino для обраної версії Python та ОС. Для LXC оператор має налаштувати /dev/dri, права доступу та сумісні Intel GPU драйвери. Див. офіційні вимоги OpenVINO EP.

Із checkout вихідного коду:

python3.13 -m venv .venv-openvino
. .venv-openvino/bin/activate
python -m pip install . tokenizers 'huggingface-hub>=1.30.0,<1.31.0' 'numpy>=1.24.0,<2.5' onnxruntime-openvino
python -c "import onnxruntime as ort; print(ort.get_available_providers())"

У середовищі має бути лише один ORT-пакет. onnxruntime-openvino не можна поєднувати з onnxruntime, onnxruntime-gpu чи onnxruntime-directml: вони записують той самий модуль onnxruntime. Не додавайте extras semantic, rerank, gpu і не запускайте sync залежностей, який поверне інший ORT-пакет. Прямий BGE reranker не потребує FastEmbed.

Налаштування CLI

POWER_EMBED_DEVICE та POWER_RERANKER_DEVICE приймають auto, cpu, cuda, rocm, openvino, directml. Якщо режим reranker не задано, він успадковує режим embeddings. Пріоритет auto: CUDA → ROCm → OpenVINO → DirectML → CPU.

Змінна Призначення
POWER_EMBED_DEVICE=openvino Вимагати OpenVINO для embeddings.
POWER_RERANKER_DEVICE=openvino Вимагати OpenVINO для reranker.
POWER_EMBED_DEVICE_TYPE=GPU Пристрій OpenVINO; типово GPU, можливі GPU.0, GPU.1 або свідомий вибір CPU.
POWER_RERANKER_DEVICE_TYPE Окремий тип пристрою reranker; якщо не задано, успадковує тип embeddings.

Порожній тип пристрою відхиляється. Решту значень перевіряє OpenVINO. POWER_EMBED_DEVICE_ID на OpenVINO не впливає. Опції device_id та arena_extend_strategy цьому EP не передаються.

Явний openvino завершується requested_onnx_provider_unavailable, коли EP відсутній, або requested_onnx_provider_not_bound, коли прив'язався інший EP. POWER прибирає CPUExecutionProvider і задає session.disable_cpu_ep_fallback=1; якщо OpenVINO не може обробити всі вузли графа, ONNX Runtime завершує створення сесії помилкою замість CPU EP. auto зберігає цей fallback. device_type=CPU свідомо спрямовує обчислення на CPU через OpenVINO EP, а не через CPUExecutionProvider. Внутрішні політики OpenVINO також залежать від device_type: CPU використовує його CPU-плагін, а AUTO, HETERO та MULTI можуть планувати роботу на CPU. Для GPU задайте GPU або GPU.<індекс>; сама прив'язка OpenVINO EP не доводить, що всі вузли виконались на GPU. Наведене налаштування керує лише CPU EP ONNX Runtime.

У явних режимах POWER викликає необов'язковий hook session.disable_fallback(), якщо він доступний і є callable; тоді runtime повторне перенаправлення на інший EP після помилки inference вимикається. Якщо hook недоступний, POWER не може вимкнути цей повторний запуск. У auto hook не викликається, а runtime retry залишається доступним. Після успішного inference active_provider показує поточну прив'язку, зокрема CPU fallback у auto. Помилки явного режиму повертаються виклику без тихого переходу на CPUExecutionProvider.

Перевіряйте platform.platform(), platform.machine(), onnxruntime.__version__ та onnxruntime.get_available_providers() саме в робочому Python-середовищі. Марка процесора чи назва ОС не доводять доступність backend. Навіть наявність EP у списку потребує проби моделі: драйвери, права /dev/dri або модель можуть завадити прив'язці. У CPU-only збірці режими auto та cpu зберігають CPU-шлях.

Перевірка

Використовуйте вже перевірені повні локальні кеші моделей:

export POWER_EGRESS_POLICY=deny POWER_MODEL_OFFLINE=1
export POWER_EMBED_DEVICE=openvino POWER_RERANKER_DEVICE=openvino
export POWER_EMBED_DEVICE_TYPE=GPU
power doctor /path/to/vault --probe-provider --json

Очікується embedding.bound_provider == OpenVINOExecutionProvider. Без --probe-provider doctor не завантажує модель. Відсутній кеш моделі — окрема помилка, яка не доводить несправність OpenVINO.

Виконуваний Python smoke-тест перевіряє 1024-вимірний скінченний вектор, скінченний reranker score та прив'язку обох EP. Він не читає значення SessionOptions; їх конфігурацію перевіряють offline unit тести. Цей smoke-тест не доводить продуктивність обладнання.

Повний sync потребує окремого погодження оператора. Для issue #471 на незмінному знімку vault потрібно виміряти час <8.5 год, RAM <7000 MB, swap, кількість нотаток/чанків, exclusions і semantic retrieval без fallback. Історичне Coverage: 3624/3624 стосується лише відповідного знімка. Тести з підміною рантайму не доводять живе GPU-виконання або продуктивність.