Разработчики Cua и Lume выложили исследовательский релиз: небольшой совместимый слой для macOS-виртуализации, который ускоряет инференс LLM в гостевой VM в 11–16 раз. Прослойка работает внутри одного процесса и открывает доступ к новым Metal-возможностям на виртуальном GPU от Apple.
Проблема в том, что Virtualization.framework от Apple использует паравиртуализацию. Гостевая macOS получает виртуальное графическое устройство, а Metal-работа через специальный драйвер уходит на физический GPU хоста. Capability-запросы этого устройства возвращают заниженные ответы: примерно Apple 5-era family, максимум 32 KB threadgroup memory и SIMD-group matrix как недоступный. Приложения честно верят этим ответам и выбирают медленные пути — llama.cpp тоже.
Решение — локальный для процесса shim, совместимый слой, который внедряется в один гостевой процесс через DYLD_INSERT_LIBRARIES. Он перехватывает выбранные Metal capability-запросы и подменяет ответы. Для тестового профиля shim сообщает поддержку Apple family 9 (1009) и поднимает threadgroup memory с 32 до 64 KB. После этого llama.cpp включает SIMD-group matrix, SIMD-group reduction и bfloat16-пути. Хост, ядро гостя и другие процессы остаются нетронутыми.
Авторы протестировали это на M1 Ultra с 48-ядерным GPU, macOS 26.6.1, гость Tahoe в Lume 0.5.1, llama.cpp b10167. TinyLlama 1.1B Chat Q4_K_M: prompt processing вырос с 431.86 до 4 786.70 tok/s — это 11.08×, или 98.25% от bare-metal. Token generation — с 12.63 до 206.60 tok/s, 16.36× и 72.06% от хоста. С Gemma 4 12B QAT Q4_0 (6.98 GB) prompt processing ускорился в 7.20× до 515.76 tok/s (99.59% от bare-metal), генерация — в 14.54× до 49.67 tok/s (94.82%). MLX-LM 0.31.3 с Llama-3.2-3B-Instruct-4bit на MLX 0.32.0 не ускорился — он и так работал быстро в VM.
Важно: это не GPU passthrough. Механизм работает на существующем паравиртуализированном GPU Apple, без PCI/VFIO и изменений ядра. Shim использует приватное поведение Metal, которое Apple может поменять в любой версии macOS. Подход экспериментальный, протестирован на ограниченном наборе железок, гостевых версий и моделей. Авторы просят сообщество протестировать shim на своих конфигурациях, открыть issue с результатами или прислать pull request. Исходники лежат в libs/lume/metal-capability-shim; инструкции по сборке и запуску — в статье.