Оптимизация llama.cpp для инференса на CPU+iGPU Intel Core Ultra 7 155H (Meteor Lake)
- Железо: Intel Core Ultra 7 155H (6P+8E+2LP, 22 потока), Intel Arc Graphics MTL (iGPU, unified memory), 64 GB RAM (доступно ~60 GB), Ubuntu 26.04 LTS.
- Репозиторий:
~/ai/llama.cpp, текущий коммитe107984bc(build 10788) - Модель-эталон: Qwen3-Coder-30B-A3B-Instruct Q4_K_M (MoE, 30.5B параметров / 3B активных, 17.28 GiB)
TL;DR
- Vulkan > SYCL на Arc MTL: prefill 213 vs 95 t/s, decode 15.7 vs 18 t/s → Vulkan.
- MoE 6× быстрее dense на iGPU: 30B-A3B = 15.7 t/s decode, dense 27B = 2.5 t/s.
- SYCL молча падал без
libumf.so.1вLD_LIBRARY_PATH— чинить нельзя оставить. - Итог: локальный кодинг-стек llama-server (Vulkan, 32K) + kilo CLI, автозапуск через systemd.
1. Оптимизация сборки
1.1. Эволюция сборок
| Сборка | Компилятор | Бэкенды | Дата | Статус |
|---|---|---|---|---|
build-native |
GCC (системный) | CPU (AVX2/FMA/BMI2) + Vulkan | 01.07.2026 | Рабочая, не трогать |
build (старая) |
GCC | CPU + Vulkan | до 04.09 | build 9722, все бенчи августа |
build (текущая) |
icx/icpx (oneAPI 2026.1) | CPU + SYCL + Vulkan | 04.09.2026 | Основная, build 10788 |
1.2. Итоговый скрипт сборки ~/ai/llama.cpp/build.sh
#!/bin/bash
set -e
# Инициализация окружения Intel oneAPI (|| true: setvars.sh выходит с кодом 3,
# если переменные уже установлены в текущей сессии — это не ошибка).
# ВАЖНО: не подключаем /opt/intel/openvino/setvars.sh - он экспортирует TBB_DIR
# на свою TBB 2021.13, а MKL-SYCL требует TBB 2023.1 (символ get_thread_reference_vertex).
source /opt/intel/oneapi/setvars.sh --force || true
# Полностью очищаем прошлую неудачную сборку
rm -rf build
# icx/icpx + GCC 15 toolchain (в gcc-13 нет libstdc++ headers, g++-13 не установлен)
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=icx \
-DCMAKE_CXX_COMPILER=icpx \
-DGGML_SYCL=ON \
-DGGML_SYCL_F16=ON \
-DGGML_VULKAN=ON \
-DCMAKE_C_FLAGS="--gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/15 -march=native -O3" \
-DCMAKE_CXX_FLAGS="--gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/15 -march=native -O3"
cmake --build build --config Release -j$(nproc)
1.3. Ключевые решения по сборке и почему
icx/icpxвместо GCC. Компиляторы Intel генерируют код с лучшей векторизацией для SYCL-ядер; SYCL-бэкенд в принципе рассчитан на clang-семейство. CPU-часть при этом остаётся совместимой с ABI.--gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/15. icpx не включает собственные libstdc++ headers, а использует системный GCC toolchain. В системе GCC 15 — только он содержит нужные headers; попытка собрать с gcc-13 падала на отсутствии заголовков.-march=native -O3. Нативный код под Meteor Lake (AVX2/FMA/BMI2 и т.д.).GGML_SYCL=ON+GGML_VULKAN=ONв одной сборке. Оба бэкенда живут в одном бинарнике как отдельные shared-библиотеки (libggml-sycl.so,libggml-vulkan.so) — это позволило честно сравнивать их между собой однимllama-bench --device.GGML_SYCL_F16=ON. fp16-вычисления на iGPU: Arc MTL поддерживает fp16 нативно, это критично для скорости.- Конфликт TBB (грабли, задокументированные в скрипте). OpenVINO-окружение экспортирует
TBB_DIRна свою TBB 2021.13, аlibmkl_sycl_blas(тянутся SYCL-бэкендом) требуют TBB 2023.1 — несовпадение символаget_thread_reference_vertex. Поэтому подключается только/opt/intel/oneapi/setvars.sh, никогда/opt/intel/openvino/setvars.sh. setvars.sh --force || true. Повторный source в той же сессии возвращает код 3 — это не ошибка сборки.
1.4. Отдельная ветка: OpenVINO/NPU
Параллельно собиралась версия с GGML_OPENVINO=ON (build/ReleaseOV. NPU Intel AI Boost виден и работает. Для LLM-инференса MoE-моделей уровня 30B NPU не даёт выигрыша против iGPU — оставлен как экспериментальный путь.



