Трехслойный планировщик приоритетов сокращает задержку локальной языковой модели с более чем одной секунды до менее чем двух десятых секунды, поддерживая отзывчивость чат-приложений даже тогда, когда телефон занят фоновыми задачами. Разработанный для чипа Tensor G3, работающего с моделью на 3 миллиарда параметров, он снижает задержку с 1420 мс до 161 мс, не прерывая фоновые процессы.

Почему локальные LLM работают с трудом

Запуск большой языковой модели на мобильном процессоре создает дефицит ресурсов. На Tensor G3 модель объемом 3 млрд параметров уже потребляет около 85 % возможностей нейронного процессора (NPU). Когда низкоприоритетная задача — например, офлайн-индексатор — выполняется одновременно с открытием пользователем окна чата, воспринимаемое время отклика возрастает примерно со 140 мс до 1400 мс — это десятикратное замедление, которое пользователи замечают мгновенно.

Проблема не только в скорости. Мобильные устройства должны балансировать между плавностью интерфейса, временем автономной работы и множеством приложений, запрашивающих вычислительные мощности. Наивная очередь, обрабатывающая задачи по порядку, заставляет поток пользовательского интерфейса ждать завершения фоновых работ, превращая разговорного ассистента в медлительный инструмент.

Как работает трехслойный планировщик

Новый планировщик встраивает в конвейер вывода (inference pipeline) три скоординированных компонента:

  1. Priority Queue (Очередь приоритетов) — min-heap (минимальная куча), которая упорядочивает входящие задачи по статическому уровню важности.
  2. Preemption Controller (Контроллер вытеснения) — при поступлении запроса с более высоким приоритетом он приостанавливает низкоприоритетные задачи вместо их отмены.
  3. Token Budget Governor (Регулятор бюджета токенов) — ограничивает количество токенов, которые может сгенерировать задача, в зависимости от состояния жизненного цикла приложения.

Вместе они позволяют запросу чата на переднем плане мгновенно переместиться в начало очереди, в то время как фоновые задачи остаются в режиме ожидания, готовые возобновиться, когда освободятся ресурсы.

Уровни приоритета и вытеснение

Четыре уровня определяют, что может быть прервано:

Уровень Описание
Чат на переднем плане Критическое взаимодействие с интерфейсом
Встроенные подсказки Подсказки в стиле автодополнения
Фоновое резюме Периодическое обобщение контента
Офлайн-индексация Массовая обработка данных

Планировщик никогда не прерывает низкоприоритетную задачу. Вместо этого он делает снимок (snapshot) кэша пар «ключ-значение» (KV cache) модели — структуры, хранящей промежуточные результаты механизма внимания (attention), — и ставит задачу на паузу. Когда высокоприоритетный запрос завершается, контроллер восстанавливает снимок и позволяет фоновой задаче продолжить работу с того места, где она остановилась. Такой подход «пауза-возобновление» позволяет избежать дорогостоящих повторных вычислений, которые потребовались бы при перезапуске задачи с нуля.

Частичное вытеснение (eviction) KV-кэша дополнительно сокращает потери. Статический системный промпт остается в кэше, в то время как вытесняются только динамические реплики диалога. В результате затраты на повторное заполнение (re-prefilling) модели после паузы снижаются на 40–60 %.

Управление бюджетом токенов без таймеров

Многие реализации полагаются на таймеры, чтобы угадать, когда задача должна уступить время процессора или NPU. Таймеры — инструмент грубый: они могут либо лишить ресурсов интерфейс, либо привести к недоиспользованию чипа. Планировщик заменяет таймеры на Android-компонент ProcessLifecycleOwner, который генерирует события жизненного цикла, надежно указывающие, находится ли приложение на переднем или заднем плане.

  • ON_RESUME — приложение восстанавливает полный вычислительный бюджет, позволяя ожидающим задачам на переднем плане выполняться беспрепятственно.
  • ON_STOP — приложение ограничивает фоновые задачи примерно до 25 % от их обычного бюджета токенов, сохраняя запас мощности для любого внезапного запроса интерфейса.

Привязывая распределение ресурсов к событиям жизненного цикла, система реагирует на реальное поведение пользователя, а не на произвольные временные интервалы.

Прирост производительности и компромиссы

При использовании наивной очереди по принципу «первым пришел — первым обслужен» фоновая задача увеличивает задержку чата на переднем плане примерно до 1420 мс. С активным планировщиком приоритетов тот же запрос чата выполняется примерно за 161 мс — десятикратное улучшение, возвращающее плавность взаимодействия с пользователем.

Возобновление приостановленной задачи увеличивает общее время её выполнения примерно на 22 %. Поскольку фоновая работа не является критически важной, такой компромисс остается приемлемым, особенно если интерфейс остается быстрым.